您好,欢迎访问三七文档
实验名称:最小二乘拟合1引言在科学实验和生产实践中,经常要从一组实验数据(,)(1,2,,)iixyim出发,寻求函数y=f(x)的一个近似表达式y=φ(x),称为经验公式,从几何上来看,这就是一个曲线拟合的问题。多项式的插值虽然在一定程度上解决了由函数表求函数近似表达式的问题,但用它来解决这里的问题,是有明显的缺陷的。首先,由实验提供的数据往往有测试误差。如果要求近似曲线y=φ(x)严格地通过所给的每个数据点(,)iixy,就会使曲线保留原来的测试误差,因此当个别数据的误差较大的时候,插值的效果是不理想的。其次,当实验数据较多时,用插值法得到的近似表达式,明显缺乏实用价值。在实验中,我们常常用最小二乘法来解决这类问题。定义()iiixy为拟合函数在ix处的残差。为了是近似曲线能尽量反映所给数据点的变化趋势,我们要求||i尽可能小。在最小二乘法中,我们选取()x,使得偏差平方和最小,即2211[()]minmmiiiiixy,这就是最小二乘法的原理。2实验目的和要求运用matlab编写.m文件,要求用最小二乘法确定参数。以下一组数据中x与y之间存在着bxyae的关系,利用最小二乘法确定式中的参数a和b,并计算相应的军方误差与最大偏差。数据如下:x12345678910y0.8982.383.071.842.021.942.222.774.024.76x111213141516171819y5.466.5310.916.522.535.750.661.681.83算法原理与流程图(1)原理最小二乘是要求对于给定数据列(,)(1,2,,)iixyim,要求存在某个函数类01{(),(),()}()nxxxnm中寻求一个函数:****0011()()()()nnxaxaxax,使得*()x满足*22()11[()]min[()]nniiiixiixyxy。根据以上条件可知,点***01(,,,)naaa是多元函数20110(,,,)[()]mnnkkiiikSaaaaxy的极小点,从而***01,,,naaa满足方程组0(0,1,,)kSkna即00111111()()()()()()()mmmmkiikiinkinikiiiiiiaxxaxxaxxxy,记1(,)()()miiihghxgx,则上述方程组可表示成0011(,)(,)(,)(,)kknknkaaaf,(k=0,1,…,n)写成矩阵形式为0001000101111101(,)(,)(,)(,)(,)(,)(,)(,)(,)(,)(,)(,)nnnnnnnnafafaf,这个方程组成为法方程组,可以证明,当01(),(),()nxxx线性无关时,它有唯一解。特别地,曲线拟合的一种常用情况为代数多项式,即取01()1,(),()nnxxxxx,则11(,)mmjkjkjkiiiiixxx1(,)mkkiiifxy(k=0,1,…,n)故相应的法方程组变为1110211111121111mmmniiiiiimmmmniiiiiiiiimmmmnnnnniiiiiiiiimxxxaaxxxxyaxxxxy,这就是最小二乘法的原理。在解决本题时,为了简便起见,我们将指数转变成代数多项式去计算。在bxyae两边取对数,得到lnlnyabx,取(1)(1)ln,yyxx,可见(1)(1),yx是呈线性关系的。这样我们可以方便地利用最小二乘法求取参数。(2)流程图整体流程图生成矩阵C流程图4程序代码及注释%最小二乘拟合%a为线性拟合中的常数,b为一次项系数%t为均方误差,maxi为最大偏差function[a,b,t,maxi]=polyfit(x0,y0,n)m=length(x0);p=length(y0);%x0和y0长度不等时,报错输入及m,n生成中间矩阵C,(1,2,,)iixyim生成法方程组的系数矩阵生成法方程组的右端向量解法方程组得输出TbCYTACC(0,1,,)iain(0,1,,)iaini=1,2,…,mj=2,3,…,n+111ic1*ijiijcxcifm~=pfprintf('Error!Pleaseinputagain!\n');end%生成中间矩阵Cfori=1:mC(i,1)=1;forj=2:n+1C(i,j)=x0(i)*C(i,j-1);endend%生成系数矩阵AA=C'*C;%将题目中的y的每项求自然对数后得到y1fori=1:my1(i)=log(y0(i));end%生成法方程组的右端向量BB=C'*y1';%求解拟合系数X=A\B;%题中,a=exp(X(1)),b=X(2)a=exp(X(1));b=X(2);%先求偏差平方和,再求均方误差sum=0;fork=1:my2(k)=a*exp(b*x0(k));l(k)=y0(k)-y2(k);sum=sum+l(k).^2;endt=sqrt(sum);%最大偏差为偏差矩阵中绝对值最大的一项maxi=max(max(abs(l)));end5算例分析1、测试示例x=1:18;y=[0.8982.383.071.842.021.942.222.774.024.765.466.5310.916.522.535.750.661.681.8];[abtmax]=polyfit(x,y,1)Error!Pleaseinputagain!a=0.7185b=0.2227t=31.6255max=22.06312、计算过程(1)首先输入已知点x=1:19;y=[0.8982.383.071.842.021.942.222.774.024.765.466.5310.916.522.535.750.661.681.8];(2)输出结果[abtmax]=polyfit(x,y,1)a=0.6814b=0.2306t=38.3255max=27.3047其中,a,b,t,max分别为常数项,一次项系数,均方误差,最大偏差。6讨论与结论1、时间复杂度:tic;[abtmax]=polyfit(x,y,1);tocElapsedtimeis0.859861seconds.说明该算法具有一定的复杂性。2、直观展示:输入以下命令:x=1:19;y=[0.8982.383.071.842.021.942.222.774.024.765.466.5310.916.522.535.750.661.681.8];fori=1:19y0(i)=log(y(i));endx0=0:0.01:20;y1=0.6814*exp(0.2306*x0);plot(x,y,'+')holdonplot(x0,y1)plot(x,y0,'+')y2=log(0.6814)+0.2306*x0;holdonplot(x0,y2,'-')可得如下图形:
本文标题:最小二乘拟合
链接地址:https://www.777doc.com/doc-2317445 .html