PDA

查看完整版本 : [MATLAB基础] 急切请教matlab多元非线性拟合问题


sunflower
2009-12-17, 11:38
函数如下:
function F=myfun1(x,X,Y)
lamda=0.0000006328;
pi=3.1415926;
w=x(1);
x0=x(2);
F=w*(1+((lamda*(X-x0))/(pi*w*w)).^2).^(1/2)-Y;

m文件如下:
X=21:40;
Y=[0.15267800423 0.14925281098 0.14634795631 0.14121052685 0.13016573550 0.11923299345 0.11755029933 0.10693783691 0.10293788971 0.09738574331 0.09576117495 0.09379011980 0.09411160161 0.09997933479 0.10494864962 0.11352656282 0.11699422484 0.12614298468 0.12699806179 0.13521383159];
xc=[1,1];
% 设置用中等模式(memdium-scale)算法
options=optimset('Largescale','off');
%通过调用LSQNONLIN重现计算新的系数
x=lsqnonlin(@myfun1,xc,[],[],options,X,Y);
disp(x);
% 绘制原始数据与新的计算的数据
lamda=0.0000006328;
w=x(1);
x0=x(2);
Y_new=w*(1+((lamda*(X-x0))/(pi*w*w)).^2).^(1/2);
plot(X,Y,'+r',X,Y_new,'b');

运行出现错误:
Optimization terminated: directional derivative along
search direction less than TolFun and infinity-norm of
gradient less than 10*(TolFun+TolX).
0.1186 1.0000

图形拟合的结果和实际数据相差也很大
请教各位大侠是什么原因?殷切的盼望回复

sunflower
2009-12-17, 12:03
其实要解决的是这样一个问题:
我有一组数据X,Y
X=21:40;
Y=[0.15267800423 0.14925281098 0.14634795631 0.14121052685 0.13016573550 0.11923299345 0.11755029933 0.10693783691 0.10293788971 0.09738574331 0.09576117495 0.09379011980 0.09411160161 0.09997933479 0.10494864962 0.11352656282 0.11699422484 0.12614298468 0.12699806179 0.13521383159];
满足如下非线性方程:
Y=w*(1+((lamda*(X-x0))/(pi*w*w)).^2).^(1/2)
Lamda和pi是常数
Lamda=0.0000006328
Pi=3.1415926
需要根据这组数据求w和x0.
诚恳的求教

slgu
2009-12-17, 20:56
若用简单一些的模型:
fx=@(b,x)b(1)*(1+b(2)*(x-b(3)).^2).^(1/2);
b=[0.0974246891767, 0.0147507384521, 31.8328161638]
SSy=0.0070504
RSS=0.0002611548294
MSe= 1.6322e-005
R^2 = 0.96296

sunflower
2009-12-17, 21:48
谢谢你的回复,能说得具体点不?我那个方程就是要求的未知数实际所满足的方程,相当于就是有20个方程组,求解2个未知数。哪种方法使求得的未知数最接近真实值?
若用简单一些的模型:
fx=@(b,x)b(1)*(1+b(2)*(x-b(3)).^2).^(1/2);
b=[0.0974246891767, 0.0147507384521, 31.8328161638]
SSy=0.0070504
RSS=0.0002611548294
MSe= 1.6322e-005
R^2 = 0.96296

sunflower
2009-12-18, 14:36
谢谢你的回复,能说得具体点不?我那个方程就是要求的未知数实际所满足的方程,相当于就是有20个方程组,求解2个未知数。哪种方法使求得的未知数最接近真实值?