PDA

查看完整版本 : [MATLAB数学相关] 新手请教,函数拟合问题


paultant
2009-10-18, 15:27
M 文件:function y=myfun(x,xdata)
y=x(1)+x(2)./xdata+x(3).*xdata;
然后在命令窗口输入:
xdata=[3.220 4.896 6.326 7.763 9.227 10.38];
ydata=[0.00179 0.00176 0.00192 0.00228 0.00247 0.0063];
x0=[0 0 0];
[x,resnorm]=lsqcurvefit(@myfun,x0,xdata,ydata)

结果出现:
Optimization terminated: first-order optimality less than OPTIONS.TolFun,
and no negative/zero curvature detected in trust region model.
请教高手怎么解决?

slgu
2009-10-18, 16:31
有几点注意:
1)lsqcurvefit (或nlinfit) 需提供合适的初值,用[0,0,0]作为初值不太合适;
2)对此组数据用此模型不太恰当,用y=x(1)+x(2)*xdata.^x(3)可能更加合适(当然也需提供合适的初值);
3)数据点太少了点,且第5个数据是否存在测定上的问题,看似偏小了点;
4)用lsqcurvefit (或nlinfit) 可反复多次进行(用循环实现)。

paultant
2009-10-18, 16:56
感谢你的帮助,这个数据是我同学化学实验测得的,函数的形式一定是这样的,她跟我说3个系数表示阻力,一定是大于0,而且第一个数应该接近于0.我拟合出来偏差较大,而且第一个系数小于0了。
另外请教如何实现实现循环使用?我今天去图书馆找了,一般书都没有讲到非线性拟合这一块,不知如何实现?还有,奇怪的是我不断变换初值,结果竟一点也没有变化,以致我实在没有办法了...

slgu
2009-10-18, 18:35
用模型:
y=x(1)+x(2)./xdata+x(3)*xdata;
拟合,得到的有关参数如下:
x=[-0.0109689299822, 0.0286004630521, 0.00128072224121];
RSS(残差平方和)=0.000004326884942
R^2(决定系数)=0.72071

但若用模型:
y=x(1)+x(2)*xdata.^x(3);
拟合,得到的有关参数如下:
x=[0.00191938250542, 2.52653911648*10^(-20), 16.9638928812];
RSS(残差平方和)=0.0000001522266213
R^2(决定系数)=0.99017

以上拟合,可以以我的结果作为初值(当然也是全局最优结果)。


你将其两者作图看看,拟合的效果差别是显而易见的。