Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
初级会员
注册日期: 2010-01-28
帖子: 3
声望力: 0 ![]() |
![]()
大家好,我是 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 [%]') 此帖于 2010-01-28 01:38 被 mh007 编辑。 |
![]() |
![]() |
![]() |
#2 |
初级会员
注册日期: 2010-01-28
帖子: 3
声望力: 0 ![]() |
![]()
大侠们 跪求帮助。。。
谢谢!!! |
![]() |
![]() |
![]() |
#3 |
初级会员
注册日期: 2010-01-28
帖子: 3
声望力: 0 ![]() |
![]() ![]() |
![]() |
![]() |