登录论坛

查看完整版本 : [MATLAB基础] 非线性最小2乘法 拟合 问题求助


mh007
2010-01-28, 01:35
大家好,我是 matlab 初学者,我想用 lsqnonlin 拟合几组数据,最后得到拟合多项式的5个参数。

有五组实验数据: t f e s c
其中 大致关系为 lnt=f(f,e,s,c)

现在想 用MATLAB 拟合 lnt=x(1)+x(2)*f+x(3)*s+x(4)*c+x(5)*e
要得到结果 x(1) x(2) x(3) x(4) x(5)

我写的代码如下

但是运行 结果提示:

Optimization terminated: directional derivative along
search direction less than TolFun and infinity-norm of
gradient less than 10*(TolFun+TolX).

不知道怎么回事?


望大伙帮忙,十分感谢!





%function 函数如下:
function y=ct(x)
t=[2.55 4.88 5.35 3.7 1.33 2.52 1.85 5.33 5.4 0.78 48 3.4 23.48 5.1 1.47 100 0.95 0.483 0.4 0.2 0.283 0.217 0.033 0.117 100 4.75 0.73 0.65 100 5.38 3.25 1.5];
f=[105.4 98.5 96.4 98.8 100.3 98.1 94.2 97.6 95.5 96.3 82.9 95 92.9 87.9 97.9 91.8 91.8 91.8 91.8 91.8 91.8 91.8 91.8 91.8 81.4 81.4 81.4 81.4 75.4 75.4 75.4 75.4];
e=[0.635 0.537 0.547 0.653 0.7 0.7 0.64 0.7 0.67 0.67 0.55 0.583 0.56 0.67 0.58 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.537 0.537 0.537 0.537 0.383 0.383 0.383 0.383];
s=[1429.6 1267.3 1301.2 1362.3 1602.7 1500.71 1359.9 1373.6 1487 1552 1347 1412 1372 1396 1438 1356.8 1356.8 1356.8 1356.8 1356.8 1356.8 1356.8 1356.8 1356.8 1216.8 1216.8 1216.8 1216.8 1081.8 1081.8 1081.8 1081.8];
c=[log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(5.82) log(7.54) log(10) log(11.55) log(13.5) log(17.27) log(20) log(27.61) log(1.1) log(5) log(10) log(20) log(1.1) log(5) log(10) log(20)];
y=log(t)-(x(1)+x(2)*f+x(3)*s+x(4)*c+x(5)*e)


%拟合程序如下:
t=[2.55 4.88 5.35 3.7 1.33 2.52 1.85 5.33 5.4 0.78 48 3.4 23.48 5.1 1.47 100 0.95 0.483 0.4 0.2 0.283 0.217 0.033 0.117 100 4.75 0.73 0.65 100 5.38 3.25 1.5];
f=[105.4 98.5 96.4 98.8 100.3 98.1 94.2 97.6 95.5 96.3 82.9 95 92.9 87.9 97.9 91.8 91.8 91.8 91.8 91.8 91.8 91.8 91.8 91.8 81.4 81.4 81.4 81.4 75.4 75.4 75.4 75.4];
e=[0.635 0.537 0.547 0.653 0.7 0.7 0.64 0.7 0.67 0.67 0.55 0.583 0.56 0.67 0.58 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.537 0.537 0.537 0.537 0.383 0.383 0.383 0.383];
s=[1429.6 1267.3 1301.2 1362.3 1602.7 1500.71 1359.9 1373.6 1487 1552 1347 1412 1372 1396 1438 1356.8 1356.8 1356.8 1356.8 1356.8 1356.8 1356.8 1356.8 1356.8 1216.8 1216.8 1216.8 1216.8 1081.8 1081.8 1081.8 1081.8];
c=[log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(1.1) log(5.82) log(7.54) log(10) log(11.55) log(13.5) log(17.27) log(20) log(27.61) log(1.1) log(5) log(10) log(20) log(1.1) log(5) log(10) log(20)];
x0=[1 1 1 1 1];
lb=[];
ub=[];
options=optimset('Largescale','off','MaxFunEvals',10000);
x=lsqnonlin('ct',x0,lb,ub,options)
y1=log(t);
m=length(y1);
q=[1:m];
for i=2:m
o=i;
p=i;
for j=1:(i-1)
if y1(o)<y1(p-j)
a=y1(o);
y1(o)=y1(p-j);
y1(p-j)=a;
b=q(o);
q(o)=q(p-j);
q(p-j)=b;
o=o-1;
end
end
end
%for 循环用于吧实际数据 y1 从小到大排列
for r=1:m
y2(r)=x(1)+x(2)*f(q(r))+x(3)*s(q(r))+x(4)*c(q(r))+x(5)*e(q(r));
end
%这个for 循环用于,把拟合结果以对应 y1 的次序排列
subplot(1,2,1)
plot(y1,'ro')
grid on
hold on
subplot(1,2,1)
plot(y2,'bx')
y3=(y1-y2)./y1*100;
%y3为绝对误差
a2='lnt=(';
b2=')+(';
d2=')*f+(';
g2=')*\sigma+(';
h2=')*c+(';
i2=')*\epsilon';
j2=strcat(a2,num2str(x(1)),b2,num2str(x(2)),d2,num2str(x(3)),g2,num2str(x(4)),h2,num2str(x(5)),i2);
title(num2str(j2))
%这边啰啰嗦嗦一大堆,只是想在标题中显示得到拟合的函数,让它自己把拟合得到的参数填进去
xlabel('Sample')
ylabel('ln(t)')
legend('real','fit')
subplot(1,2,2)
plot(y3,'gd-')
grid on
title('Error analysis')
xlabel('Sample')
ylabel('Absolute error [%]')

mh007
2010-01-30, 00:52
大侠们 跪求帮助。。。

谢谢!!!

mh007
2010-02-01, 04:49
:o ("^")