\documentclass[12pt,a4paper,pdftex]{exam}

\newcommand{\exercisetopic}{Gradient descent}
\newcommand{\exercisenum}{9}
\newcommand{\exercisedate}{December 22th, 2020}

\input{../../exercisesheader}

\firstpagefooter{Prof. Dr. Jan Benda}{}{jan.benda@uni-tuebingen.de}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}

\input{../../exercisestitle}

\begin{questions}

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
  \question \qt{Read sections 8.1 -- 8.5 of chapter 8 on ``optimization
    and gradient descent!}\vspace{-3ex}

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
  \question \qt{Fitting the time constant of an exponential function}
  Let's assume we record the membrane potential from a photoreceptor
  neuron.  We define the resting potential of the neuron to be at
  0\,mV. By means of a brief current injection we increase the
  membrane potential by exactly 1\,mV. We then record how the membrane
  potential decays exponentially down to the resting potential. We are
  interested in the membrane time constant and therefore want to fit
  an exponential function to the recorded time course of the membrane
  potential.

  \begin{parts}
    \part Implement (and document!) the exponential function 
    \begin{equation}
      \label{expfunc}
      x(t) = e^{-t/\tau}
    \end{equation}
    with the membrane time constant $\tau$ as a matlab function
    \code{expdecay(t, tau)} that takes as arguments a vector of
    time points and the membrane time constant. The function returns
    \eqnref{expfunc} computed for each time point as a vector.
    \begin{solution}
      \lstinputlisting{expdecay.m}
    \end{solution}

    \part Let's first generate the data. Set the membrane time
    constant to 10\,ms. Generate a time vector with sample times
    between zero and five times the membrane time constant and a
    sampling interval of 0.05\,ms. Then compute a vector containing
    the corresponding measurements of the membrane potential using the
    \code{expdecay()} function and adding some measurement noise with
    a standard deviation of 0.05\.mV (\code{randn()} function). Also
    plot the data.
    \begin{solution}
      \lstinputlisting{expdecaydata.m}
    \end{solution}

    \part Implement the gradient descent algorithm for finding the
    least squares for the exponential function \eqref{expfunc}. The
    function takes as arguments the measured data, an initial value
    for the estimation of the membrane time constant, the $\epsilon$
    factor, and the threshold for the length of the gradient where to
    terminate the algorithm. The function should return the estimated
    membrane time constant at the minimum of the mean squared error, a
    vector with the time constants, and a vector with the mean squared
    errors for each step of the algorithm.
    \begin{solution}
      \lstinputlisting{expdecaydescent.m}
    \end{solution}

    \part Call the gradient descent function with the generated data.
    Watch the value of the gradient and of tau and adapt $\epsilon$
    and the threshold accordingly (they differ quite dramatically from
    the ones in the script for the cubic fit).

    \part Generate three plots: (i) the values of the time constant
    for each iteration step, (ii) the mean squared error for each
    iteration step, and (iii) the measured data and the fitted
    exponential function.
    \begin{solution}
      \lstinputlisting{expdecayplot.m}
    \end{solution}

  \end{parts}

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
  \question \qt{Read sections 8.6 -- 8.8 of chapter 8 on ``optimization
    and gradient descent!}\vspace{-3ex}

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
  \question \qt{Fitting the full exponential function}
  \begin{parts}

    \part Use the functions \code{polyfit()} and \code{lsqcurvefit()}
    provided by matlab to find the slope and intercept of a straight
    line that fits the data. Compare the resulting fit parameters of
    those functions with the ones of your gradient descent algorithm.
    \begin{solution}
      \lstinputlisting{linefit.m}
    \end{solution}

  \end{parts}

\end{questions}

\end{document}
