Nonlinear fit comparison - Matlab vs OriginLab
8 次查看(过去 30 天)
显示 更早的评论
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?
采纳的回答
Matt J
2018-9-14
编辑:Matt J
2018-9-14
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 个评论
Matt J
2018-9-14
编辑:Matt J
2018-9-14
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
2018-9-14
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
更多回答(2 个)
MZ123
2018-9-14
2 个评论
Stephan
2018-9-14
编辑:Stephan
2018-9-14
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
2019-9-23
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 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Regression 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!