MATLAB实现非线性曲线拟合最小二乘法.doc
《MATLAB实现非线性曲线拟合最小二乘法.doc》由会员分享,可在线阅读,更多相关《MATLAB实现非线性曲线拟合最小二乘法.doc(4页珍藏版)》请在冰点文库上搜索。
非线性曲线拟合最小二乘法
一、问题提出
设数据(),(i=0,1,2,3,4).由表3-1给出,表中第四行为,可以看出数学模型为,用最小二乘法确定a及b。
i
0
1
2
3
4
1.00
1.25
1.50
1.75
2.00
5.10
5.79
6.53
7.45
8.46
1.629
1.756
1.876
2.008
2.135
二、理论基础
根据最小二乘拟合的定义:
在函数的最佳平方逼近中,如果f(x)只在一组离散点集{,i=0,1,…,m},上给定,这就是科学实验中经常见到的实验数据{(),i=0,1,…,m}的曲线拟合,这里,i=0,1,…,m,要求一个函数与所给数据{(),i=0,1,…,m}拟合,若记误差,i=0,1,…,m,,设是上线性无关函数族,在中找一函数,使误差平方和
这里
(n这就是一般的最小二乘逼近,用几何语言来说,就称为曲线拟合的最小二乘法。
在建模的过程中应用到了求和命令(sum)、求偏导命令(diff)、化简函数命令(simple)、用迭代方法解二元非线性方程组的命令(fsolve),画图命令(plot)等。
三、实验内容
用最小二乘法求拟合曲线时,首先要确定S(x)的形式。
这不单纯是数学问题,还与所研究问题的运动规律及所得观测数据()有关;通常要从问题的运动规律及给定数据描图,确定S(x)的形式,并通过实际计算选出较好的结果。
S(x)的一般表达式为线性形式,若是k次多项式,S(x)就是n次多项式,为了使问题的提法更有一般性,通常在最小二乘法中都考虑为加权平方和
.
这里是[a,b]上的权函数,它表示不同点处的数据比重不同。
用最小二乘法求拟合曲线的问题,就是求形如S(x)的一个函数,使取得最小。
它转化为求多元函数
的极小点问题。
再由求多元函数极值的必要条件,有
(k=0,1,…,n)
此题中假设,由已知所给数据点()画出图形,根据离散点的位置观察出它们所拟合的曲线图形应类似于指数函数的曲线图形,故设拟合曲线的函数为。
本题编程过程中,令f=y,z1=a,z2=b,
令拟合曲线中对应的函数值与的差的平方和为J,即J=sum(fy.^2);分别求J关于z1,z2的偏导,简化后并令其分别为0得一关于z1,z2的二元非线性方程组,最后利用fsolve命令求得z1,z2的值分别为
z1=3.0751z2=0.5052
故得到拟合曲线为
为证明曲线拟合的正确性,我们将离散点()与所得的拟合曲线
画于同一图形中,图形如下:
四、结果分析
根据实验内容求得拟合曲线中未知数a,b分别为
a=3.0751b=0.5052
即拟合曲线为。
由图形知拟合成功!
参考文献
1·《数值分析》,李庆扬,王能超,易大义,2001,清华大学出版社(第四版)。
2·《数值方法》,关治,陆金甫,2006,清华大学出版社。
3·《数值分析与实验学习指导》,蔡大用,2001,清华大学出版社。
4·《数值分析与实验》,薛毅,2005,北京工业大学出版社.
附录
程序1:
symsz1z2
x=1.00:
0.25:
2.00;
y=[5.10,5.79,6.53,7.45,8.46];
f=z1*exp(z2.*x)
fy=f-y;
J=sum(fy.^2);
Ja=diff(J,z1);
Jb=diff(J,z2);
Ja1=simple(Ja),
Jb1=simple(Jb),
程序2:
function[y1,y2]=fun(z)
y1=2*z
(1)*exp(2*z
(2))-51/5*exp(z
(2))+2*z
(1)*exp(5/2*z
(2))-579/50*exp(5/4*z
(2))+2*z
(1)*exp(3*z
(2))-653/50*exp(3/2*z
(2))+2*z
(1)*exp(7/2*z
(2))-149/10*exp(7/4*z
(2))+2*exp(4*z
(2))*z
(1)-423/25*exp(2*z
(2));
y2=-1/200*z
(1)*(-400*z
(1)*exp(2*z
(2))+2040*exp(z
(2))-500*z
(1)*exp(5/2*z
(2))+2895*exp(5/4*z
(2))-600*z
(1)*exp(3*z
(2))+3918*exp(3/2*z
(2))-700*z
(1)*exp(7/2*z
(2))+5215*exp(7/4*z
(2))-800*z
(1)*exp(4*z
(2))+6768*exp(2*z
(2)));
作图程序:
x=1.00:
0.25:
2.00;
y=[5.10,5.79,6.53,7.45,8.46];
f=3.0751*exp(0.5052*x);
plot(x,y,'r*',x,f,'b-');
xlabel('x轴'),ylabel('y轴'),
legend('数据点(x(i),y(i))','拟合曲线y=f(x)'),
title('例8的数据点(x(i),y(i))和拟合曲线y=f(x)的图形')