资源描述:
《浙江大学MATLAB课件第X章MATLAB在拟合与插值中的应用.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、MATLAB在拟合与插值中的应用在大量的应用领域中,人们经常面临用一个解析函数描述数据(通常是测量值)的任务。(比如在土木工程中对实验梁的应力应变(σ--ε)曲线的数据进行拟合,从而得出钢筋混凝土的弹性模量的计算式。)在这里讨论的方法是曲线拟合与插值。其中包括曲线拟合,一维插值,二维插值以及如何解决插值中求值时的单调性问题。曲线拟合曲线拟合涉及回答两个基本问题:最佳拟合意味着什么?应该用什么样的曲线?可用许多不同的方法定义最佳拟合,并存在无穷数目的曲线。我们将最佳拟合解释为在数据点的最小误差平方和,且所用的曲线限定为多项式时,那么曲线拟合是相当简捷的。先看看图1图12阶
2、曲线拟合在MATLAB中,函数polyfit求解最小二乘曲线拟合问题。简单阐述这个函数的用法,让我们以上面图11.1中的数据开始。»x=[0.1.2.3.4.5.6.7.8.9.11];»y=[-0.4471.9783.286.167.087.347.669.569.489.3011.2];为了用polyfit,我们必须给函数赋予上面的数据和我们希望最佳拟合数据的多项式的阶次或度。如果我们选择n=1作为阶次,得到最简单的线性近似。通常称为线性回归。如果我们选择n=2作为阶次,得到一个2阶多项式。»n=2;%polynomialorder»p=polyfit(x,y,n)
3、p=-9.810820.1293-0.0317polyfit的输出是一个多项式系数的行向量。其解是y=-9.8108x2+20.1293x-0.0317。为了将曲线拟合解与数据点比较,把二者都绘成图。»xi=linspace(0,1,100);%x-axisdataforplotting»z=polyval(p,xi);为了计算在xi数据点的多项式值,调用MATLAB的函数polyval。»plot(x,y,'o',x,y,xi,z,':')画出了原始数据x和y,用'o'标出该数据点,在数据点之间,再用直线重画原始数据,并用点':'线,画出多项式数据xi和z。»xlab
4、el('x'),ylabel('y=f(x)'),title('SecondOrderCurveFitting')将图作标志。这些步骤的结果表示于前面的图1中。多项式阶次的选择是有点任意的。两点决定一直线或一阶多项式。三点决定一个平方或2阶多项式。按此进行,n+1数据点唯一地确定n阶多项式。于是,在上面的情况下,有11个数据点,我们可选一个高达10阶的多项式。然而,高阶多项式给出很差的数值特性,我们不应选择比所需的阶次高的多项式。此外,随着多项式阶次的提高,近似变得不够光滑,因为较高阶次多项式在变零前,可多次求导。不妨选一个10阶多项式»pp=polyfit(x,y,1
5、0);»formatshorte»pp.'则ans=-4.6436e+0052.2965e+006-4.8773e+0065.8233e+006-4.2948e+0062.0211e+006-6.0322e+0051.0896e+005-1.0626e+0044.3599e+002-4.4700e-001要注意在现在情况下,多项式系数的规模与前面的2阶拟合的比较。还要注意在最小(-4.4700e-001)和最大(5.8233e+006)系数之间有7个数量级的幅度差。将这个解作图,并把此图与原始数据及2阶曲线拟合相比较。»zz=polyval(pp,xi);»plot(x
6、,y,'o',xi,z,':',xi,zz)»xlabel('x'),ylabel('y=f(x)'),title('2ndand10thOrdercurveFitting')在下面的图11.2中,原始数据标以'o',2阶曲线拟合是虚线,10阶拟合是实线。注意,在10阶拟合中,在左边和右边的极值处,数据点之间出现大的纹波。当企图进行高阶曲线拟合时,这种纹波现象经常发生。根据图2,显然,‘越多就越好’在这里不适用。图22阶和10阶曲线拟合一维插值正如曲线拟合所描述的那样,插值定义为对数据点之间函数的估值方法,这些数据点是由某些集合给定。当我们不能很快地求出所需中间点的函数
7、值时,插值是一个有价值的工具。例如,当数据点是某些实验测量的结果或是过长的计算过程时,就有这种情况。举例一维插值,考虑下列问题,(由于手头没有我们专业相关的实验数据,故采用老师经常提到的测温的例子,只是数据名称不一样)12小时内,一小时测量一次室外温度。数据存储在两个MATLAB变量中。»hours=1:12;%indexforhourdatawasrecorded»temps=[589152529313022252724];%recordedtemperatures»plot(hours,temps,hours,temps,'+')%v