1、南昌工程学院计算方法实验报告 课 程 名 称 计算方法 系 院 理 学 院 专 业 信息与计算科学 班 级 12级一班 学 生 姓 名 魏志辉 学 号 2012101316 最小二乘求解1 引言在科学实验和生产实践中,经常要从一组实验数据出发,寻求函数y=f(x)的一个近似表达式y=(x),称为经验公式,从几何上来看,这就是一个曲线拟合的问题。多项式的插值虽然在一定程度上解决了由函数表求函数近似表达式的问题,但用它来解决这里的问题,是有明显的缺陷的。首先,由实验提供的数据往往有测试误差。如果要求近似曲线y=(x)严格地通过所给的每个数据点,就会使曲线保留原来的测试误差,因此当个别数据的误差较大
2、的时候,插值的效果是不理想的。其次,当实验数据较多时,用插值法得到的近似表达式,明显缺乏实用价值。在实验中,我们常常用最小二乘法来解决这类问题。定义为拟合函数在处的残差。为了是近似曲线能尽量反映所给数据点的变化趋势,我们要求尽可能小。在最小二乘法中,我们选取,使得偏差平方和最小,即 ,这就是最小二乘法的原理。2 实验目的和要求运用matlab编写.m文件,要求用最小二乘法确定参数。以下一组数据中x与y之间存在着的关系,利用最小二乘法确定式中的参数a和b,并计算相应的军方误差与最大偏差。数据如下:x12345678910y0.8982.383.071.842.021.942.222.774.02
3、4.76x111213141516171819y5.466.5310.916.522.535.750.661.681.83 算法原理与流程图(1) 原理最小二乘是要求对于给定数据列,要求存在某个函数类中寻求一个函数:,使得满足。根据以上条件可知,点是多元函数的极小点,从而满足方程组即,记,则上述方程组可表示成,(k=0,1,,n)写成矩阵形式为,这个方程组成为法方程组,可以证明,当线性无关时,它有唯一解。特别地,曲线拟合的一种常用情况为代数多项式,即取,则 (k=0,1,,n)故相应的法方程组变为,这就是最小二乘法的原理。在解决本题时,为了简便起见,我们将指数转变成代数多项式去计算。在两边取对
4、数,得到,取,可见是呈线性关系的。这样我们可以方便地利用最小二乘法求取参数。(2)流程图输入 及m,n生成中间矩阵C生成法方程组的系数矩阵 生成法方程组的右端向量 解法方程组得输出 i=1,2,mj=2,3,n+1整体流程图生成矩阵C流程图4 程序代码及注释%最小二乘拟合%a为线性拟合中的常数,b为一次项系数%t为均方误差,maxi为最大偏差function a,b,t,maxi=polyfit(x0,y0,n)m=length(x0) ;p=length(y0);%x0和y0长度不等时,报错if m=p fprintf(Error! Please input again!n);end%生成中
5、间矩阵Cfor i=1:m C(i,1)=1; for j=2:n+1 C(i,j)=x0(i)*C(i,j-1); endend%生成系数矩阵AA=C*C;%将题目中的y的每项求自然对数后得到y1for i=1:m y1(i)=log(y0(i);end%生成法方程组的右端向量BB=C*y1;%求解拟合系数X=AB;%题中,a=exp(X(1)),b=X(2)a=exp(X(1);b=X(2);%先求偏差平方和,再求均方误差sum=0;for k=1:m y2(k)=a*exp(b*x0(k); l(k)=y0(k)-y2(k); sum=sum+l(k).2;endt=sqrt(sum);
6、最大偏差为偏差矩阵中绝对值最大的一项maxi=max(max(abs(l);end5 算例分析1、测试示例 x=1:18; y=0.898 2.38 3.07 1.84 2.02 1.94 2.22 2.77 4.02 4.76 5.46 6.53 10.9 16.5 22.5 35.7 50.6 61.6 81.8; a b t max=polyfit(x,y,1)Error! Please input again!a = 0.7185b = 0.2227t = 31.6255max = 22.06312、计算过程(1)首先输入已知点 x=1:19; y=0.898 2.38 3.07 1
7、84 2.02 1.94 2.22 2.77 4.02 4.76 5.46 6.53 10.9 16.5 22.5 35.7 50.6 61.6 81.8;(2)输出结果 a b t max=polyfit(x,y,1)a = 0.6814b = 0.2306t = 38.3255max = 27.3047其中,a,b,t,max分别为常数项,一次项系数,均方误差,最大偏差。6 讨论与结论1、 时间复杂度: tic;a b t max=polyfit(x,y,1);tocElapsed time is 0.859861 seconds.说明该算法具有一定的复杂性。2、 直观展示:输入以下命令
8、 x=1:19; y=0.898 2.38 3.07 1.84 2.02 1.94 2.22 2.77 4.02 4.76 5.46 6.53 10.9 16.5 22.5 35.7 50.6 61.6 81.8; for i=1:19y0(i)=log(y(i);end x0=0:0.01:20; y1=0.6814*exp(0.2306*x0); plot(x,y,+) hold on plot(x0,y1) plot(x,y0,+) y2=log(0.6814)+0.2306*x0; hold on plot(x0,y2,-)可得如下图形:参考文献1 易大义,沈云宝,李有法. 计算方法(第2版),浙江大学出版社. p.29-53.2 张琨 高思超 毕靖 编著 MATLAB2010从入门到精通 电子工业出版社