求助非线性最小二乘曲线拟和
我在利用最优化方法的非线性最小二乘曲线拟和时遇到了下述问题:第一批数据为(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=; % 以下为最优化方法的非线性最小二乘曲线拟和
options=optimset('MaxFunEvals',100000000);
options=optimset('MaxIter',10000000000);
=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 编辑 ] 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=; % 以下为最优化方法的非线性最小二乘曲线拟和
options=optimset('MaxFunEvals',100000000);
options=optimset('MaxIter',10000000000);
=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=; % 以下为最优化方法的非线性最小二乘曲线拟和
options=optimset('MaxFunEvals',100000000);
options=optimset('MaxIter',10000000000);
=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)));
页:
[1]