Nonlinear fit comparison - Matlab vs OriginLab
8 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Good afternoon, I'm posting this question because I'm not able to find a satisfactory result of a non-linear fit with Matlab. On the contrary, OriginLab returns a good fit together with errors for fit parameters. Here my x and y data: x = [177600,961200, 2504000, 4997000, 8884000]; y = [6.754, 24.416, 58.622, 107.980, 154.507]; yErr = sqrt(y);
The fitting function is the following: y = V + (A-V)*S*x*EXP(-S*x) where V, A and S are the parameters which I need to calculate from the fit. OriginLab gives me the following:
- V = 1.978 ± 0.889
- A = 585 ± 64
- S = 4.392E-8 ± 6.771E-9
On Matlab I tried all the possible form of non-linear regression: fitnlm, lsqcurvefit, nlinfit etc... every time the same warning: The Jacobian is ill conditioned. Here is an example:
Nonlinear regression model:
y ~ a1 + (a2 - a1)*a3*x*exp( - a3*x)
Estimated Coefficients:
Estimate SE tStat pValue
__________ __________ ___________ __________
a1 -0.6789 2.9104e-19 -2.3327e+18 2.0265e-73
a2 530.78 8.0894e-20 6.5614e+21 3.2371e-87
a3 5.2511e-08 5.1865e-10 101.25 5.7063e-08
Of course such small standard errors are not reliable, but still I'm not able to reproduce the Origin results. Any suggestions?
4 commentaires
Réponse acceptée
Matt J
le 14 Sep 2018
Modifié(e) : Matt J
le 14 Sep 2018
Well, I guess I would credit OriginLab with knowing how to pre-scale the x,y data appropriately. If you do this manually, then lsqcurvefit works fine, and gives a slightly better fit (according to resnorm) than OriginLab,
c=10*max(x); %pre-scaling factor
a0=[1.9780 ,585, 4.3920e-08*c];
F=@(a,x) a(1)+(a(2)-a(1)).*a(3).*x/c.*exp(-a(3).*x/c);
[a,resnorm,~,~,~,~,J]=lsqcurvefit(F,[1,100,1],x,y,[],[],...
optimoptions('lsqcurvefit','Display','iter'));
solution=[a(1), a(2), a(3)/c]
resnorm %10.1985
condJ = cond(full(J)) %510.8393
plot(x,y,'x',x,F(a,x),'--'); xlabel 'x', xlabel 'y';
3 commentaires
Matt J
le 14 Sep 2018
Modifié(e) : Matt J
le 14 Sep 2018
I didn't get the point.
The point is that we reached a better fit than OriginLab - the residuals are lower. Also, there are no ill-conditioned Jacobian problems once you scale the data properly. With c=1 (no scaling) you will find that cond(J)=Inf whereas with scaling, it drops nicely down to 60 or so.
Also, how do I re-map the scaled coefficient to those similar to Origin?
I already remapped them for you in the line
solution=[a(1), a(2), a(3)/c]
how to get the Standard Error with the parameters?
You have the Jacobian (a sensible one now) and the residuals, so you can use them to compute whatever gof metrics that you like.
Matt J
le 14 Sep 2018
You have the Jacobian (a sensible one now) and the residuals, so you can use them to compute whatever gof metrics that you like.
which leads me to
- V = 0.6652 ± 1.7676
- A = 545 ± 33
- S = 4.9629e-08 ± 5.1273e-09
Plus de réponses (2)
MZ123
le 14 Sep 2018
2 commentaires
Stephan
le 14 Sep 2018
Modifié(e) : Stephan
le 14 Sep 2018
Could you provide your code? Yesterday in the evening i tried to understand the problem you have. I did not get the exactly same result you provided from OriginLab, but it was a good fit i thinkand there was no warning. So it would be interesting to see what you are doing.
One more question to your fitting equation:
In your question it is:
y = V + (AV) * S * x * EXP (-S * x)
which should mean
A * V
In the Second Part of your question it is:
y ~ a1 + (a2 - a1) * a3 * x * exp (- a3 * x)
which is
A - V
Alex Sha
le 23 Sep 2019
The global solution looks like below:
Root of Mean Square Error (RMSE): 1.42818042380826
Sum of Squared Residual: 10.1984966147457
Correlation Coef. (R): 0.999655170571204
R-Square: 0.999310460049744
Adjusted R-Square: 0.998620920099487
Determination Coef. (DC): 0.999310460049744
Chi-Square: 0.212210508410738
F-Statistic: 1449.24229503583
Parameter Best Estimate
---------- -------------
v 0.665211685653936
a 544.888484613983
s 4.9628897712431E-8
0 commentaires
Voir également
Catégories
En savoir plus sur Regression dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!