数值分析(最小二乘拟合)
- 格式:doc
- 大小:117.50 KB
- 文档页数:6
实验2.1 多项式插值的振荡现象实验目的:在一个固定的区间上用插值逼近一个函数,显然Lagrange 插值中使用的节点越多,插值多项式的次数就越高。
我们自然关心插值多项式的次数增加时,Ln(x)是否也更加靠近被逼近的函数。
Runge 给出的一个例子是极著名并富有启发性的。
实验容:设区间[-1,1]上函数 f(x)=1/(1+25x 2)。
考虑区间[-1,1]的一个等距划分,分点为 x i = -1 + 2i/n ,i=0,1,2,…,n ,则拉格朗日插值多项式为201()()125nn i i i L x l x x ==+∑. 其中,l i (x),i=0,1,2,…,n 是n 次Lagrange 插值基函数。
实验步骤与结果分析:实验源程序function Chap2Interpolation% 数值实验二:“实验2.1:多项式插值的震荡现象”% 输入:函数式选择,插值结点数% 输出:拟合函数及原函数的图形promps = {'请选择实验函数,若选f(x),请输入f,若选h(x),请输入h,若选g(x),请输入g:'};titles = 'charpt_2';result = inputdlg(promps,'charpt 2',1,{'f'});Nb_f = char(result);if(Nb_f ~= 'f' & Nb_f ~= 'h' & Nb_f ~= 'g')errordlg('实验函数选择错误!');return;endresult = inputdlg({'请输入插值结点数N:'},'charpt_2',1,{'10'});Nd = str2num(char(result));if(Nd <1)errordlg('结点输入错误!');return;endswitch Nb_fcase 'f'f=inline('1./(1+25*x.^2)'); a = -1;b = 1;case 'h'f=inline('x./(1+x.^4)'); a = -5; b = 5;case 'g'f=inline('atan(x)'); a = -5; b= 5;endx0 = linspace(a, b, Nd+1); y0 = feval(f, x0);x = a:0.1:b; y = Lagrange(x0, y0, x);fplot(f, [a b], 'co');hold on;plot(x, y, 'b--');xlabel('x'); ylabel('y = f(x) o and y = Ln(x)--');%--------------------------------------------------------------------function y=Lagrange(x0, y0, x);n= length(x0); m=length(x);for i=1:mz=x(i);s=0.0;for k=1:np=1.0;for j=1:nif(j ~= k)p = p*(z - x0(j))/(x0(k) - x0(j));endends = s + p*y0(k);endy(i) = s;end实验结果分析(1)增大分点n=2,3,…时,拉格朗日插值函数曲线如图所示。
最小二乘法数值分析实验报告最小二乘法数值分析实验报告篇一:数值分析+最小二乘法实验报告数学与信息工程学院实课程名称:实验室:实验台号:班级:姓名:实验日期:验报告数值分析 201X年 4 月 13日篇二:数值分析上机实验最小二乘法数值分析实验报告五最小二乘法一、题目设有如下数据用三次多项式拟合这组数据,并绘出图形。
二、方法最小二乘法三、程序M文件:sy ms x f; xx=input( 请输入插值节点 as [x1,x2...]\n ff=i nput( 请输入插值节点处对应的函数值 as [f1,f 2...]\n m=input(请输入要求的插值次数m= n=leng th(xx); fr i=1:(m+1) syms faix; fai=x^(i-1); fr j=1:n x=xx(j);H(i,j)=eval(fai); end endA=ff*(H) *inv(H*(H) syms x; f=0; fr i=1:(m+1) f=f+A(i)*x^(i-1); end f plt(xx,ff, * ) hldnezplt(f,[xx(1),xx(n)])四、结果 sav e and run之后:请输入插值节点 as [x1,x2...] [-3 -2-1 0 1 2 3] 请输入插值节点处对应的函数值 as[f1,f2...] [-1.76 0.42 1.21.341.432.254.38]请输入要求的插值次数m=3 f =133/100+121469856021/35184372088832*x-8042142191733/450359 9627370496*x^2+1020815915537309/9007199254740992*x^3五、拓展:最小二乘法计算方法比较简单,是实际中常用的一种方法,但是必须经计算机来实现,如果要保证精度则需要对大量数据进行拟合,计算量很大。
最小二乘法拟合圆原理
最小二乘法是一种常用的数值分析方法,用于拟合数据点,并找到最适合数据的模型。
在拟合圆的问题中,最小二乘法也可以用来求解最小二乘圆。
拟合圆的原理是通过已知的一组数据点,在平面上找到一个圆,使得这些数据点到圆的距离的平方和最小。
这个距离可以用欧几里得距离来计算。
最小二乘法拟合圆的步骤如下:
1. 计算数据点的坐标平均值,作为圆心的初值。
2. 迭代地求解圆心和半径,直到误差满足要求或达到最大迭代次数。
3. 计算每个数据点到圆的距离,求出平方和作为误差。
4. 利用误差的大小来判断拟合的好坏。
误差越小,拟合效果越好。
最小二乘法拟合圆的优点是可以处理带有噪声和异常点的数据,可以得到较为精确的结果。
但在计算时需要进行多次迭代,因此时间复杂度较高。
- 1 -。
最小二乘法曲线拟合原理最小二乘法曲线拟合是一个重要的数值分析方法,它是通过最小二乘法对样本点与直线或曲线之间的关系进行拟合和分析,从而估算出一个函数的一组参数。
最小二乘法曲线拟合是一种经典的数值分析方法,可以用来拟合函数和曲线,估算出参数,预测数据,分析函数,优化模型,甚至可以分析复杂多变量函数。
最小二乘法曲线拟合的核心方法是使用最小二乘法把拟合的曲线拟合到观察到的数据,通过求解方程的最小二乘法,把一系列的观察数据点拟合为最小二乘法曲线,计算出拟合曲线的最佳系数,满足拟合效果的最佳拟合曲线。
最小二乘法曲线拟合的核心目标是通过计算拟合曲线的最小均方误差(SSE)、平均均方误差(MSE)、最大均方误差(MAXE)等方法,使拟合曲线与观察数据点之间的差距最小,从而求解出最佳拟合曲线系数。
最小二乘法曲线拟合具有很强的解析性,可以用数学计算方法快速求解,可以满足各种不同应用场景的需求,因而被广泛应用于科学研究、工程设计、市场分析等领域。
最小二乘法曲线拟合最常见的应用场景有:根据观察数据拟合和估计函数的参数;分析函数的性质;优化模型的能力;预测数据等等。
当应用最小二乘法拟合函数时,首先需要把观察数据用直线或曲线拟合,然后使用极小化残差平方和的方法,来求解参数,这是一个典型的最优化问题,利用一般最优化算法来求解,如梯度下降算法、牛顿法等。
此外,在应用最小二乘法曲线拟合的过程中,还可以考虑几种情况,比如样本数据受到误差的影响,具有某种偏差性;偏差是否服从正态分布;样本数据的分布是否同分布;拟合曲线的拟合是否收敛,参数计算是否准确等等。
总之,最小二乘法曲线拟合是一种重要的数值分析方法,可以用来拟合函数和曲线、估算参数、预测数据、优化模型等。
在应用最小二乘法曲线拟合时,需要考虑一些影响因素,比如样本数据受到误差的影响、偏差是否服从正态分布等,因此,它是一种有效的数值分析方法。
数值分析实验之最⼩⼆乘拟合含有噪声扰动(python实现)⼀、实验⽬的掌握最⼩⼆乘法拟合离散数据,多项式函数形式拟合曲线以及可以其他可以通过变量变换转化为多项式的拟合曲线⽬前待实现功能:1. 最⼩⼆乘法的基本实现。
2. ⽤不同数据量,不同参数,不同的多项式阶数,⽐较实验效果。
3. 语⾔python。
⼆、实验原理最⼩⼆乘法(⼜称最⼩平⽅法)是⼀种数学优化技术。
它通过最⼩化误差的平⽅和寻找数据的最佳函数匹配。
利⽤最⼩⼆乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平⽅和为最⼩。
最⼩⼆乘法还可⽤于曲线拟合。
其他⼀些优化问题也可通过最⼩化能量或最⼤化熵⽤最⼩⼆乘法来表达。
三、实验内容求y=f(x)=sin(x)+h(x)在区间[0,10]上按101等距节点确定的离散数据点组(x i,y i)的直线拟合以及曲线拟合,其中是服从h(x)标准正态分布的噪声扰动四、程序实现• ⼀次拟合:1import numpy as np2import matplotlib.pyplot as plt3import math4#定义x、y散点坐标5 x = np.arange(0.0, 10.0,0.1)6 x = np.array(x)7print('x is :\n',x)8 num = np.sin(x)+np.random.randn(100)9 y = np.array(num)10print('y is :\n',y)11 f1 = np.polyfit(x, y, 1)#⽤1次多项式拟合,若要多次拟合,相应的改变这个常数即可12print('f1 is :\n',f1)1314 p1 = np.poly1d(f1)15print('p1 is :\n',p1)1617#也可使⽤yvals=np.polyval(f1, x)18 yvals = p1(x) #拟合y值19print('yvals is :\n',yvals)20#绘图21 plot1 = plt.plot(x, y, 's',label='original values',color="blue")22 plot2 = plt.plot(x, yvals, 'r',label='polyfit values',color="red")23 plt.xlabel('x')24 plt.ylabel('y')25 plt.legend(loc=4) #指定legend的位置右下⾓26 plt.title('polyfitting')27 plt.show()运⾏结果:所得图形:• 曲线拟合(⽤a*sin(x)+b拟合):1import numpy as np2import matplotlib.pyplot as plt3import math4from scipy.optimize import curve_fit56#⾃定义函数7def func(x, a, b):8return a*np.sin(x)+b910#定义x、y散点坐标11 x = np.arange(0.0, 10.0,0.1)12 x = np.array(x)13 num = np.sin(x)+np.random.randn(100)14 y = np.array(num)1516#⾮线性最⼩⼆乘法拟合17 popt, pcov = curve_fit(func, x, y)18#获取popt⾥⾯是拟合系数19print(popt)20 a = popt[0]21 b = popt[1]22#c = popt[2]23#d = popt[3]24#e = popt[4]25 yvals = func(x,a,b) #拟合y值26print('popt:', popt)27print('系数a:', a)28print('系数b:', b)29#print('系数c:', c)30#print('系数d:', d)31#print('系数e:', e)32print('系数pcov:', pcov)#⽅差33print('系数yvals:', yvals)#x代⼊拟合出的函数得到的函数值34#绘图35 plot1 = plt.plot(x, y, 's',label='original values',color="purple")36 x_test = np.arange(0.0, 10.0, 0.01)37 y_test = func(x_test,a,b)38 plot2 = plt.plot(x_test, y_test, 'r',label='polyfit values',color="red")39 plt.xlabel('x')40 plt.ylabel('y')41 plt.legend(loc=4) #指定legend的位置右下⾓42 plt.title('curve_fit')43 plt.show()运⾏结果所得图形:•曲线拟合(⽤a*np.sin(b*x+c)+d拟合):1import numpy as np2import matplotlib.pyplot as plt3import math4from scipy.optimize import curve_fit56#⾃定义函数7def func(x, a, b, c, d):8return a*np.sin(b*x+c)+d910#定义x、y散点坐标11 x = np.arange(0.0, 10.0,0.1)12 x = np.array(x)13 num = np.sin(x)+np.random.randn(100)14 y = np.array(num)1516#⾮线性最⼩⼆乘法拟合17 popt, pcov = curve_fit(func, x, y)18#获取popt⾥⾯是拟合系数19print(popt)20 a = popt[0]21 b = popt[1]22 c = popt[2]23 d = popt[3]24 yvals = func(x,a,b,c,d) #拟合y值25print('popt:', popt)26print('系数a:', a)27print('系数b:', b)28print('系数c:', c)29print('系数d:', d)30print('系数pcov:', pcov)#⽅差31print('系数yvals:', yvals)#x代⼊拟合出的函数得到的函数值32#绘图33 plot1 = plt.plot(x, y, 's',label='original values',color='orange')34 x_test = np.arange(0.0, 10.0, 0.01)35 y_test = func(x_test,a,b,c,d)36 plot2 = plt.plot(x_test, y_test, 'r',label='polyfit values',color='brown')37 plt.xlabel('x')38 plt.ylabel('y')39 plt.legend(loc=4) #指定legend的位置右下⾓40 plt.title('curve_fit')41 plt.show()运⾏结果:所得图形:•⾃定义函数实现:1import numpy as np2import matplotlib.pyplot as plt3import math4from scipy.optimize import curve_fit56#⾃定义函数7def func(x, a0,a1,a2,a3,a4,a5,a6,a7,a8,b1,b2,b3,b4,b5,b6,b7,b8,w):8return a0 + a1*np.cos(x*w) + b1*np.sin(x*w) + \9 a2*np.cos(2*x*w) + b2*np.sin(2*x*w) + a3*np.cos(3*x*w) + b3*np.sin(3*x*w) + \10 a4*np.cos(4*x*w) + b4*np.sin(4*x*w) + a5*np.cos(5*x*w) + b5*np.sin(5*x*w) + \11 a6*np.cos(6*x*w) + b6*np.sin(6*x*w) + a7*np.cos(7*x*w) + b7*np.sin(7*x*w) + \12 a8*np.cos(8*x*w) + b8*np.sin(8*x*w)1314#定义x、y散点坐标15 x = np.arange(0.0, 10.0,0.1)16 x = np.array(x)17 num = np.sin(x)+np.random.randn(100)18 y = np.array(num)1920#⾮线性最⼩⼆乘法拟合21 popt, pcov = curve_fit(func, x, y)22#获取popt⾥⾯是拟合系数23print(popt)24 a0 = popt[0]25 a1 = popt[1]26 a2 = popt[2]27 a3 = popt[3]28 a4 = popt[4]29 a5 = popt[5]30 a6 = popt[6]31 a7 = popt[7]32 a8 = popt[8]33 b1 = popt[9]34 b2 = popt[10]35 b3 = popt[11]36 b4 = popt[12]37 b5 = popt[13]38 b6 = popt[14]39 b7 = popt[15]40 b8 = popt[16]41 w = popt[17]42 yvals = func(x,a0,a1,a2,a3,a4,a5,a6,a7,a8,b1,b2,b3,b4,b5,b6,b7,b8,w) #拟合y值43print('popt:', popt)44print('系数a0:', a0)45print('系数a1:', a1)46print('系数a2:', a2)47print('系数a3:', a3)48print('系数a4:', a4)49print('系数a5:', a5)50print('系数a6:', a6)51print('系数a7:', a7)52print('系数a8:', a8)53print('系数b1:', b1)54print('系数b2:', b2)55print('系数b3:', b3)56print('系数b4:', b4)57print('系数b5:', b5)58print('系数b6:', b6)59print('系数b7:', b7)60print('系数b8:', b8)61print('系数w:', w)62print('系数pcov:', pcov)#⽅差63print('系数yvals:', yvals)#x代⼊拟合出的函数得到的函数值64#绘图65 plot1 = plt.plot(x, y, 's',label='original values',color='yellow')66 x_test = np.arange(0.0, 10.0, 0.01)67 y_test = func(x_test,a0,a1,a2,a3,a4,a5,a6,a7,a8,b1,b2,b3,b4,b5,b6,b7,b8,w)68 plot2 = plt.plot(x_test, y_test, 'r',label='polyfit values',color='blue')69 plt.xlabel('x')70 plt.ylabel('y')71 plt.legend(loc=4) #指定legend的位置右下⾓72 plt.title('curve_fit')73 plt.show()所得图形:⼼得体会通过本次实验,我对MATLAB的操作更加熟悉,也对本学期正在学习的Python有了更深层次的认识,对着两种编程软件更加熟悉。
数值分析中的最小二乘法与曲线拟合数值分析是现代理论与实践密切结合的一门交叉学科,其中最小二乘法和曲线拟合是其中两个非常重要的概念。
最小二乘法是一种数学运算方法,用于求解一组方程组的未知参数,使得每个方程的误差平方和最小。
在实际应用中,最小二乘法广泛应用于数据拟合、信号处理、回归分析等领域。
在数据拟合中,最小二乘法是一种常见的方法,它可以用于拟合曲线和函数。
它通过延伸曲线以获得局部数据之间的交点,并通过在它们上进行平均化的方法来尝试匹配数据。
最小二乘法的概念为我们提供了一个理论基础,以便在一定程度上预测新的数据中对象的行为或趋势。
但是,即使在相对简单的问题中,最小二乘法可能并不是最佳选择。
曲线拟合是对一系列数据进行插值的过程,以便获得与原始数据点更准确相匹配的曲线或函数。
曲线拟合可以通过在相邻数据点之间进行插值来完成。
在曲线拟合中,只有在数据有很好的统计关系或在相邻数据点
有很好的相关性时,才会产生准确的结果。
否则,结果可能并不
准确,因为这些结果取决于数据点的数量和分布。
需要注意的是,曲线拟合和最小二乘法并不是一个可以代替另
一个的工具。
它们的适用范围不同。
曲线拟合适用于对离散数据
点进行联合分析,而最小二乘法适用于求解连续数据的线性模型。
总之,数值分析中的最小二乘法和曲线拟合是非常实用的概念,可以应用于各种领域。
它们作为现代数据分析的主要工具之一,
不断吸引着越来越多的学者和工程师投入到其中,将继续发挥重
要作用。
最小二乘法数值分析实验报告数学与信息工程学院实课程名称:实验室:实验台号:班级:姓名:实验日期:验报告数值分析2012 年 4 月 13 日数值分析实验报告五最小二乘法一、题目设有如下数据用三次多项式拟合这组数据,并绘出图形二、方法最小二乘法三、程序M文件: syms x f;xx=input(‘请输入插值节点as [x1,x2...]\n’);ff=input(‘请输入插值_ __________________ ___________________ ___________________ ___________________实验一MATLAB在数值分析中的应用插值与拟合是来源于实际、又广泛应用于实际的两种重要方法随着计算机的不断发展及计算水平的不断提高,它们已在国民生产和科学研究等方面扮演着越来越重要的角色下面对插值中分段线性插值、拟合中的最为重要的最小二乘法拟合加以介绍分段线性插值所谓分段线性插值就是通过插值点用折线段连接起来逼近原曲线,这也是计算机绘制图形的基本原理实现分段线性插值不需编制函数程序,MATLAB自身提供了内部函数interp1其主要用法如下:interp1(x,y,xi) 一维插值◆yi=interp1(x,y,xi)对一组点(x,y) 进行插值,计算插值点xi的函数值x为节点向量值,y为对应的节点函数值如果y为矩阵,则插值对y 的每一列进行,若y 的维数超出x 或xi 的维数,则返回NaN ◆ yi=interp1(y,xi)此格式默认x=1:n ,n为向量y的元素个数值,或等于矩阵y的size(y,1) ◆ yi=interp1(x,y,xi,’method’)method用来指定插值的算法默认为线性算法其值常用的可以是如下的字符串nearest 线性最近项插值linear线性插值spline 三次样条插值贵州师范大学数学与计算机科学学院学生实验报告1. 对函数f(x)?,哪一种曲线拟合较好?为什么?能找出更好的拟合曲线吗?七、总结1、从图像可以看出用lagrange插值函数拟合数据中间拟合的很好,但两边与原函数图象相比波动太大,逼近效果很差,出现所谓的Runge现象2、从图像可以看出用最小二乘法去拟合较少的数据点,曲线拟合比直线拟合得好,高次的会比低次的拟合得好3.一般情形高次插值比低次插值精度高,但是插值次数太高也不一定能提高精度.八、附录1、M文件:function cy=Lagrange(x,y,n,cx)m=length(cx);cy=zeros(1,m);for k=1:n+1t=ones(1,m);for j=1:n+1if j~=kt=t.*(cx-x(j))./(x(k)-x(j));endendcy=cy+y(k).*t ;end>> x=-5::5;>> y=1./(x. +1);>> plot(x,y)>> n=10;>> x0=-5:10/n:5;>> y0=1./(1+x0. );>> cx=-5::5;>> cy=Lagrange(x0,y0,n,cx);>> hold on>> plot(cx,cy)e1 =xxxx大学数值分析实验报告题目:学院:专业:年级:学生姓名:学号:日期:曲线拟合的最小二乘法xxxx学院xxxxxxx xxxx级xxx xxx 2014年12月24日课题八曲线拟合的最小二乘法一、问题的提出从随机的数据中找出其规律性,给出其近似表达式的问题,在生产实践和科学实验中大量存在,通常利用数据的最小二乘拟合求得拟合曲线在某冶炼过程中,根据统计数据的含碳量与时间关系,试求出含碳量y与时间t的拟合曲线0 5 10 15 20 25 30 35 40 45 50 55t(分)y(x10?4)0 二、要求1、用最小二乘法进行曲线的拟合;2、近似表达式为:?(t)?a0?a1t?a2t2?a3t3;?(t),3、打印出拟合函数:并打印出?(tj)与y(tj)的误差,其中j?1,2,3,?,12;4、另外选取一个近似表达式,尝试拟合效果的比较;5、*绘制出拟合曲线图;三、目的和意义1、掌握曲线拟合的最小二乘法;2、最小二乘法亦可用于解超定线性方程组;3、探索拟合函数的选择与拟合进精度间的关系;四、MATLAB2011a简介及算法介绍MATLAB2011a本实验是基于MATLAB2011a软件平台进行程序设计MATLAB2011a是一款将数据结构、程序特性以及图形用户界面完美地结合在一起的一款强大的软件MATLAB的核心是矩阵和数组,在MATLAB2011a中,所有的数据都是以矩阵或数组的形式来表示和存储的MATLAB2011a提供了常用的矩阵代数运算功能,同时还提供了非常广泛的、灵活的数组运算功能,用于数据集的处理MATLAB的编程特性与其他高级语言类似,同时它还可以与其他语言(如Fortran和C语言)混合编程,进一步扩展了自身的功能这次作业课题,主要采用了MATLAB语言进行程序的编写,误差计算,拟合函数的输出,以及拟合曲线(1)和拟合曲线(2)与原离散数据点在一个图形界面中的现实的显示最小二乘拟合法在函数的最佳平方逼近中f(x)?C[a,b],如果f(x)只在一组离散的点集?xi,i?0,1,2,3,?,m?上给出,这就是科学实验中经常见到的实验数据?(xi,yi),i?0,1,2,3,?m?的曲线拟合,这里yi?f(xi)(i?0,1,2,3,?,m),要求一个函数y?S*(x)与所给数据?(xi,yi),i?0,1,2,3,?m?拟合若记误差?i?S(xi)?yi(i?0,1,2,3,?,m),??(?0,?1,?2,?3,??m)T,设?0(x),?1(x),?,?n(x)是*?C[a,b]上线性无关的函数族,在??span??0(x),?1(x),?,?n(x)?中找一个函数S*(x)使误差平方和??这里22[S(xi)?yi]?min?[S*(xi)?yi]2, ()2i*2i?0i?0s(x)??i?0mmmS(x)?a0?0(x)?a1?1(x)?a2?2(x )?a3?3(x)??an?n(x) (n?m). () 这就是一般的最小二乘逼近,用几何语言说,就称为曲线拟合的最小二乘法. 用最小二乘法拟合曲线时,首先要确定S(x)的形式,这不是单纯的数学问题,还与所研究问题的运动规律及所得到的观测数据(xi,yi)有关;通常要从问题的运动规律或给定的数据描图,确定S(x)的形式,并通过实际计算选出最好的结果——这点将从下面的例题得到说明. S(x)的一般表达式为()式表示的线性形式.若?k(x)是k次多项式,S(x)就是n次多项式为了使问题的提法更有一般性,通常在最小二乘法中都考虑加权平方和2?2??22(xi)[S*(xi)?yi]2. ()i?0m 这里?(x)?0 (i?0,1,2,3,?m)是[a,b]上的权函数它表示不同的点(xi,yi)处的数据比重不同,列如:?(xi)可以表示点(xi,yi)处的重复观测次数用最小二乘法拟合曲线的问题,就是在形如()式的S(x)中求一函数y?S(x),使()式取得最小值它转化为求取多元函数*I(a0,a1,?an)(xi)[?aj?(xi)?f(xi)]2i?0j?0mn***的极小点(a0,a1,?,an)的问题这与多元函数求极值的必要条件的问题一样,则有:mn?I?2??(xi)[?aj?(xi)?f(xi)]?k(xi)?0k?0,1,2,?,n. ?aki?0j?0若记(?j,?k)(xi)?j(xi)?k(xi),()i?0mm(f,?k)(xi)f(xi)?k(xi)?dk,k?0,1,2,3?,n, ()i?0上式可以改写为:?(?j?0mk,?j)aj?dk, k?0,1,2,3?,n, ()线性方程组()称为法方程,可以将其写成:Ga?d其中??Ta?(a0,a1,?a2),d?(d0,d1,?dn)T,(0,0)(0,1)(,)(,)11G10(n,0)(n, 1)(0,n)(n,1)() (?n,?n)?五、课题分析拟合近似表达式:?(t)?a0?a1t?a2t2?a3t3的最高次数为三次,我们知道当拟合多项式的最高次数n?3时,与连续的情形一样,在求解法方程Ga?d的过程中,会出现系数矩阵(格拉姆矩阵)G为病态的问题但是如果?0(x),?1(x),?2(x),?,?n(x)是关于点集?xi?(i?0,1,2,?,m)带权?(xi)(i?0,1,2,?,m)正交的函数族,即:0,jk,()(?j,?k)(xi)?j(xi)?k(xi)??i?0?Ak?0,j?k,m则法方程的解为:(f,?k)?(?k,?k)*ak(x)f(x)?iii?0mk(xi),k?0,1,2,?,n ()??(x)?ii?0m2k(xi)这样就能避免求解格拉姆矩阵,也不会在求解线性方程组是就不会出现病态问题现在我们需要根据给定的节点x0,x1,?xm及权函数?(xi)?0,造出带权?(xi)正交的多项式?Pn(x)?.注意n?m,用递推公式表示Pk(x),即:?P0(x)?1,?() ?P1(x)?(x??1)P0(x),?P(x)?(x??)P(x) P(x),k?1,2,3,?,n?1.k?1kkk?1?k?1这里Pk(x)是首项系数为1的k次多项式,根据Pk(x)的正交性,得:m??(xi)xiPk2(xi)??(xPk(x),Pk(x))??k?1?i?0?m?(Pk(x),Pk(x))2?(x)P(x)?iki?i?0??(xPk,Pk),k?0,1,2,3,?,n?1, () ??(P,P)kk?m??(xi)Pk2(xi)??(Pk,Pk)i?0?,k?1,2,3 ,?,n??k(Pk?1,Pk?1)?(xi)Pk2?1(xi)??i?0?用正交多项式?Pk(x)?的线性组合做最小二乘曲线拟合,只要根据公式()和()逐步求Pk(x)得同时,相应计算出系数(f,Pk)*ak??(Pk,Pk)??(x)f(x)P(x)iikii?0m??(x)Pii?0m, k?0,1,2,?,n,()2k(xi)*并逐步把ak,Pk(x)累加到S(x)中去,最后就会得到所求的拟合曲线。
课题八 曲线拟合的最小二乘法
一、问题提出
从随机的数据中找出其规律性,给出其近似表达式的问题,在生产实践和科学实验中大量存在,通常利用数据的最小二乘法求得拟合曲线。
在某冶炼过程中,根据统计数据的含碳量与时间关系,试求含碳量 y 与时间t 的拟合曲线。
二、要求
1 、用最小二乘法进行曲线拟合;
2 、近似解析表达式为()t ϕ=a 1t+a 2t 2+a 3t 3
3 、打印出拟合函数()t ϕ,并打印出()tj ϕ与()y tj 的误差
4 、另外选取一个近似表达式,尝试拟合效果的比较;
5 、* 绘制出曲线拟合图﹡。
三、目的和意义
1 、掌握曲线拟合的最小二乘法;
2 、最小二乘法亦可用于解超定线代数方程组;
3 、探索拟合函数的选择与拟合精度间的关系。
四、实验结果:
1.用最小二乘法做出的曲线拟合为
三次多项式a1= -0.0052 ,a2= 0.2634 ,a3= 0.0178。
()tϕ= (-0.0052) t+ (0.2634) t2 + (0.0178) t3
三次多项式的误差平方和=0.2583。
图形为:
图形上红线表示拟合曲线,*表示实验所给的点。
源代码为:
x=[0,5,10,15,20,25,30,35,40,45,50,55];
y=[0,1.27,2.16,2.86,3.44,3.87,4.15,4.37,4.51,4.58,4.02,4.64]; a1=polyfit(x,y,3) %三次多项式拟合%
b1= polyval(a1,x)
r1= sum((y-b1).^2) %三次多项式误差平方和%
plot(x,y,'*') %用*画出x,y图像%
hold on
plot(x,b1, 'r') %用红色线画出x,b1图像%
(说明本程序调用了MATLAB中的函数polyfit、polyval、plot)
2.另外选取几个近似表达式:
主要选取6次、9次和12次的拟合表达式。
(说明6多项式用绿线表示,9次多项式用蓝线表示,12次多项式用黄线表示)图形为:
讨论:
1.从上面的曲线图形我们可以看出9次多项式的拟合效果最好,所
有点的都在9次多项式的曲线上。
2.可以看出3次多项式、6次多项式都拟合的比较好。
3.可以看出12次多项式跳跃比较厉害,拟合效果比较差,我们可以
的出结论:不是次数越高,拟合效果就越好,拟合函数的次数与拟合精度没有直接的线性关系。
需要选择合适的拟合函数,可以得到最佳效果。
源代码:
> x=[0,5,10,15,20,25,30,35,40,45,50,55];
y=[0,1.27,2.16,2.86,3.44,3.87,4.15,4.37,4.51,4.58,4.02,4.64];
a1=polyfit(x,y,3) %三次多项式拟合%
a2= polyfit(x,y,6) %六次多项式拟合%
a3= polyfit(x,y,9) %九次多项式拟合%
a4= polyfit(x,y,12) %十二次多项式拟合%
b1= polyval(a1,x)
b2= polyval(a2,x)
b3= polyval(a3,x)
b4= polyval(a4,x)
r1= sum((y-b1).^2) %三次多项式误差平方和%
r2= sum((y-b2).^2) %六次次多项式误差平方和%
r3= sum((y-b3).^2) %九次多项式误差平方和%
r4= sum((y-b4).^2) %十二次多项式误差平方和%
plot(x,y,'*') %用*画出x, y图像%
hold on
plot(x,b1, 'r') %用红色线画出x,b1图像%
hold on
plot(x,b2, 'g') %用绿色线画出x,b2图像%
hold on
plot(x,b3, 'b:o') %用蓝色o线画出x,b3图像%
hold on
plot(x,b4, 'y') %用黄线画出想x,b4图像%
运行结果:
a1 =
0.0000 -0.0052 0.2634 0.0178
Warning: Polynomial is badly conditioned. Add points with distinct X
values, reduce the degree of the polynomial, or try centering
and scaling as described in HELP POLYFIT.
> In polyfit at 80
a2 =
0.0000 -0.0000 0.0001 -0.0013 0.0079 0.2240 0.0176 Warning: Polynomial is badly conditioned. Add points with distinct X
values, reduce the degree of the polynomial, or try centering
and scaling as described in HELP POLYFIT.
> In polyfit at 80
a3 =
0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0007 0.0081 -0.0549 0.3967 -0.0002
Warning: Polynomial is not unique; degree >= number of data points.
> In polyfit at 72
a4 =
1.0e-007 *
-0.0000 0.0000 -0.0001 0.0026 -0.0578 0.5060 0 0 0 0 0 0 0
b1 =
0.0178 1.2087 2.1646 2.9113 3.4745 3.8800 4.1536 4.3211 4.4082 4.4407 4.4444 4.4450
b2 =
0.0176 1.2044 2.2146 2.9124 3.3941 3.7934 4.1674 4.4615 4.5548 4.3853 4.1541 4.6103
b3 =
-0.0002 1.2715 2.1545 2.8709 3.4293 3.8694 4.1662 4.3473 4.5269 4.5725 4.0219 4.6398
b4 =
0 0.0022 0.1382 1.0585 3.0629 4.6210 4.2617 3.7489 4.9958 4.3855 4.0619 4.6361
r1 =
0.2583
r2 =
0.0858
r3 =
0.0014
r4 =
10.3207。