select the x0 (initial point for x ) in the curve fitting with lsqcurvefit
2 views (last 30 days)
Show older comments
I wanted to fit an arbitrary function ( (k_plus-k_t*(1-exp(-k_plus/(a*k_t+b*k_d)))-k_d*(exp(-k_plus/(a*k_t+b*k_d)) to my data set. Therefore, I used lsqcurvefit in MATLAB. The code was as follow:
clc;
clear all;
close all;
k_plus =[0.1 0.2 0.4 0.7 1 1.1 1.2 1.5 1.7 2 2.5 3 3.5 4 5];
K_minus_d = [0.1 0.2 0.4 0.7 1 1.1 1.2 1.5 1.7 2 2.5 3 3.5 4 5];
K_minus_t =[ 0.1 0.2 0.4 0.7 1 1.1 1.2 1.5 1.7 2 2.5 3 3.5 4 5];
f1= sprintf('table%02d.txt',1);
data=tblread(f1);
x1=data(:,1);
x1=x1';
F=@(c,xdata)(xdata-K_minus_t*(1-exp(-xdata/(c(1)*K_minus_t+c(2)* K_minus_d)))- K_minus_d*(exp(-xdata/(c(1)*K_minus_t+c(2)* K_minus_d)))
x0 = [0.1 0.1];
[c,resnorm,~,exitflag,output] = lsqcurvefit(F,x0,k_plus,x1)
figure;
hold on
plot(k_plus,x1,'r-', 'LineWidth', 1)
plot(k_plus,F(c,k_plus),'-b*','LineWidth', 1,'MarkerSize', 1)
hold off
grid on;
I wonder how can I select the x0 (initial point for x) because I got different value for C when I change it
Answers (1)
John D'Errico
on 10 Sep 2014
There is no magic way to choose the right starting values. If there were, then the optimizer would use it in the first place. Even better, if there were a great way to find the perfect starting values, then why need an optimizer to solve the problem?
As you have seen, starting from a different point means you will sometimes get different solutions, not always the best one either. So you need to start with a good set of starting values! And if you know anything about the function you are fitting, there is a good chance that YOU are the best person to choose the right start value so the solver won't need to work so hard. Don't just get lucky, get good.
If you are absolutely hopeless here, and cannot choose a good set of starting values, then use multiple sets for the solver, generated randomly. Start it from each point, then select the solution that is best. (My tool on the File Exchange, RMSEARCH, helps you with the mechanics of choosing multiple points, then starting an optimizer of your choice with each point, and then returning the solutions it found ordered in sequence from good to bad.)
1 Comment
Matt J
on 10 Sep 2014
Edited: Matt J
on 10 Sep 2014
@Ahmed,
In addition to what John said, your model function F is over-parametrized. It depends on unknown parameters c(1) and c(2) entirely through the expression
c(1)*K_minus_t+c(2)* K_minus_d
Since K_minus_t and K_minus_d are the same vector, there are infinite combinations of c(1) and c(2) that produce any given value for the above expression. So, no wonder you are seeing non-uniqueness in the solution.
See Also
Categories
Find more on Interpolation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!