声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1098|回复: 1

[编程技巧] 求助非线性最小二乘曲线拟和

[复制链接]
发表于 2006-11-22 10:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我在利用最优化方法的非线性最小二乘曲线拟和时遇到了下述问题:
第一批数据为(x1—y1),把第一批数据向右平移2.5后生成(x2—y2),由于两批数据的形状不变,拟和出的曲线的形状也应不变。但我用以下程序计算时却有很大差别。
以下是我的两个程序:
第一个是函数M文件,内容是要拟和曲线的目标函数,运行前以同名的函数名nihe2.m保存。
function f=nihe2(a,x)
f=1./(a(3)+a(1)*exp(a(2)*(x)));
第二个是脚本M文件,运行时调用前一个函数fuction:
clc
clear
close all hidden
x1 =[ -2.7600   -2.6575   -2.5538   -2.3472   -2.2435...
   -2.1398   -2.0373   -1.9335   -1.8297   -1.7272...
   -1.6235   -1.5198   -1.3135   -1.2098   -1.1060...
   -1.0035   -0.8998   -0.7960   -0.6935   -0.5898...
   -0.4860   -0.2797   -0.1760   -0.0722    0.0303...
    0.1340    0.2378    0.3403    0.4440    0.5477...
    0.6502    0.7540    0.8578    0.9615    1.0640...
    1.1678    1.2715    1.3740    1.4777    1.5815...
    1.6840    1.7878    1.8915    1.9953    2.0978]   
y1= [0.0102    0.0109    0.0116    0.0133    0.0142...
    0.0152    0.0162    0.0173    0.0186    0.0198...
    0.0212    0.0227    0.0259    0.0277    0.0296...
    0.0317    0.0339    0.0362    0.0387    0.0414...
    0.0443    0.0506    0.0542    0.0579    0.0619...
    0.0662    0.0707    0.0756    0.0809    0.0865...
    0.0924    0.0988    0.1057    0.1129    0.1207...
    0.1291    0.1379    0.1474    0.1575    0.1683...
    0.1798    0.1921    0.2053    0.2193    0.2353]   
x2 =[-5.2600   -5.1575   -5.0538   -4.8472   -4.7435...
   -4.6398   -4.5373   -4.4335   -4.3297   -4.2272...
   -4.1235   -4.0198   -3.8135   -3.7098   -3.6060...
   -3.5035   -3.3998   -3.2960   -3.1935   -3.0898...
   -2.9860   -2.7797   -2.6760   -2.5722   -2.4697...
   -2.3660   -2.2622   -2.1597   -2.0560   -1.9523...
   -1.8498   -1.7460   -1.6423   -1.5385   -1.4360...
   -1.3322   -1.2285   -1.1260   -1.0223   -0.9185...
   -0.8160   -0.7123   -0.6085   -0.5048   -0.4023]
y2 =[0.0102    0.0109    0.0116    0.0133    0.0142...
    0.0152    0.0162    0.0173    0.0186    0.0198...
    0.0212    0.0227    0.0259    0.0277    0.0296...
    0.0317    0.0339    0.0362    0.0387    0.0414...
    0.0443    0.0506    0.0542    0.0579    0.0619...
    0.0662    0.0707    0.0756    0.0809    0.0865...
    0.0924    0.0988    0.1057    0.1129    0.1207...
    0.1291    0.1379    0.1474    0.1575    0.1683...
    0.1798    0.1921    0.2053    0.2193    0.2353]
plot(x1,y1,'o',x2,y2,'o'); % 右画出的图和数据何以看出y1和y2相同,只是x1,x2之间发生了平移
hold on
x=x1;    % 可以把x1换成x2
y=y1;    % 可以把y1换成y2
a0=[1,-.1,1];   % 以下为最优化方法的非线性最小二乘曲线拟和
options=optimset('MaxFunEvals',100000000);
options=optimset('MaxIter',10000000000);
[a,residual]=lsqcurvefit(@nihe2,a0,x,y,[],[],options)  %调用nihe2函数
hold on;
x=-10:0.001:30;
axis([-10 10 -0.5 2]);   % 限制坐标
plot(x,1./(a(3)+a(1)*exp(a(2)*((x)))),'r-');  % 绘制拟和后的曲线 红色
grid on          %若图太小,可用放大镜查看

把把x1换成x2,y1换成y2,后再次运行,结果相差很大。
我一直很困惑,还请各位高手们帮我分析一下原因啊,谢谢啊

[ 本帖最后由 ChaChing 于 2009-4-22 14:35 编辑 ]
回复
分享到:

使用道具 举报

发表于 2006-11-22 17:34 | 显示全部楼层
clear
close all hidden
x1 =[ -2.7600   -2.6575   -2.5538   -2.3472   -2.2435...
   -2.1398   -2.0373   -1.9335   -1.8297   -1.7272...
   -1.6235   -1.5198   -1.3135   -1.2098   -1.1060...
   -1.0035   -0.8998   -0.7960   -0.6935   -0.5898...
   -0.4860   -0.2797   -0.1760   -0.0722    0.0303...
    0.1340    0.2378    0.3403    0.4440    0.5477...
    0.6502    0.7540    0.8578    0.9615    1.0640...
    1.1678    1.2715    1.3740    1.4777    1.5815...
    1.6840    1.7878    1.8915    1.9953    2.0978];   
y1= [0.0102    0.0109    0.0116    0.0133    0.0142...
    0.0152    0.0162    0.0173    0.0186    0.0198...
    0.0212    0.0227    0.0259    0.0277    0.0296...
    0.0317    0.0339    0.0362    0.0387    0.0414...
    0.0443    0.0506    0.0542    0.0579    0.0619...
    0.0662    0.0707    0.0756    0.0809    0.0865...
    0.0924    0.0988    0.1057    0.1129    0.1207...
    0.1291    0.1379    0.1474    0.1575    0.1683...
    0.1798    0.1921    0.2053    0.2193    0.2353];   
x2 =[-5.2600   -5.1575   -5.0538   -4.8472   -4.7435...
   -4.6398   -4.5373   -4.4335   -4.3297   -4.2272...
   -4.1235   -4.0198   -3.8135   -3.7098   -3.6060...
   -3.5035   -3.3998   -3.2960   -3.1935   -3.0898...
   -2.9860   -2.7797   -2.6760   -2.5722   -2.4697...
   -2.3660   -2.2622   -2.1597   -2.0560   -1.9523...
   -1.8498   -1.7460   -1.6423   -1.5385   -1.4360...
   -1.3322   -1.2285   -1.1260   -1.0223   -0.9185...
   -0.8160   -0.7123   -0.6085   -0.5048   -0.4023];
y2 =[0.0102    0.0109    0.0116    0.0133    0.0142...
    0.0152    0.0162    0.0173    0.0186    0.0198...
    0.0212    0.0227    0.0259    0.0277    0.0296...
    0.0317    0.0339    0.0362    0.0387    0.0414...
    0.0443    0.0506    0.0542    0.0579    0.0619...
    0.0662    0.0707    0.0756    0.0809    0.0865...
    0.0924    0.0988    0.1057    0.1129    0.1207...
    0.1291    0.1379    0.1474    0.1575    0.1683...
    0.1798    0.1921    0.2053    0.2193    0.2353];
plot(x1,y1,'o',x2,y2,'o'); % 右画出的图和数据何以看出y1和y2相同,只是x1,x2之间发生了平移
hold on
x=x1;    % 可以把x1换成x2
y=y1;    % 可以把y1换成y2
a0=[1,-.1,1];   % 以下为最优化方法的非线性最小二乘曲线拟和
options=optimset('MaxFunEvals',100000000);
options=optimset('MaxIter',10000000000);
[a,residual]=lsqcurvefit(@nihe2,a0,x,y,[],[],options);  %调用nihe2函数
hold on;
x=-10:0.001:30;
axis([-10 10 -0.5 2]);   % 限制坐标
plot(x,1./(a(3)+a(1)*exp(a(2)*((x)))),'r-');  % 绘制拟和后的曲线 红色
grid on          %若图太小,可用放大镜查看
x=x2;    % 可以把x1换成x2
y=y2;    % 可以把y1换成y2
a0=[1,-.1,1];   % 以下为最优化方法的非线性最小二乘曲线拟和
options=optimset('MaxFunEvals',100000000);
options=optimset('MaxIter',10000000000);
[a,residual]=lsqcurvefit(@nihe2,a0,x,y,[],[],options);  %调用nihe2函数
hold on;
x=-10:0.001:30;
axis([-10 10 -0.5 2]);   % 限制坐标
plot(x,1./(a(3)+a(1)*exp(a(2)*((x)))),'r-');  % 绘制拟和后的曲线 红色
grid on          %若图太小,可用放大镜查看


我们所拟合的数据区间x1为[ -2.7600   2.0978];x2为[-5.2600  -0.4023];
它们所在区间不同而y值相同,还有我们给出的拟合函数相同,都是1./(a(3)+a(1)*exp(a(2)*(x)));
则所拟合出的a(1),a(2),a(3)肯定就不同了,系数不同,则画出的图形就不同了。
如果你想得出平移后的结果,则拟合函数应分别为1./(a(3)+a(1)*exp(a(2)*(x)));和1./(a(3)+a(1)*exp(a(2)*(x-2.5)));
未命名.JPG

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-6 14:51 , Processed in 0.198372 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表