%% fit the sigmoid clear close all load('iv_curve.mat') figure() plot(voltage, current, 'o') xlabel('voltate [mV]') ylabel('current [pA]') % amplitude, slope, x-shift, y-shift %parameter = [10 0.25 -50, 2.5]; parameter = [20 0.5 -50, 2.5]; eps = 0.1; % do the descent gradient = []; steps = 0; error = []; while isempty(gradient) || norm(gradient) > 0.01 steps = steps + 1; gradient = lsq_gradient_sigmoid(parameter, voltage, current); error(steps) = lsq_sigmoid_error(parameter, voltage, current); parameter = parameter - eps .* gradient; end plot(1:steps, error) disp('gradient descent done!') disp(strcat('final position: ', num2str(parameter))) disp(strcat('final error: ', num2str(error(end)))) %% use fminsearch parameter = [10 0.5 -50, 2.5]; objective_function = @(p)lsq_sigmoid_error(p, voltage, current); param = fminunc(objective_function, parameter); disp(param) param1 = fminsearch(objective_function, parameter); disp(param1)