数值分析实验报告--实验2--插值法

  • 格式:pdf
  • 大小:1.74 MB
  • 文档页数:21

数值分析实验二:插值法

1 / 21 数值分析实验二:插值法 1 多项式插值的震荡现象 1.1 问题描述 考虑一个固定的区间上用插值逼近一个函数。显然拉格朗日插值中使用的节点越多,插值多项式的次数就越高。我们自然关心插值多项式的次数增加时, 是否也更加靠近被逼近的函数。龙格(Runge)给出一个例子是极著名并富有启发性的。设区间[-1,1]上函数 21()125fxx (1) 考虑区间[-1,1]的一个等距划分,分点为 ninixi,,2,1,0,21 则拉格朗日插值多项式为 201()()125nniiiLxlxx (2) 其中的(),0,1,2,,ilxin是n次拉格朗日插值基函数。 实验要求: (1) 选择不断增大的分点数目n=2, 3 …. ,画出原函数f(x)及插值多项式函数()nLx在[-1,1]上的图像,比较并分析实验结果。 (2) 选择其他的函数,例如定义在区间[-5,5]上的函数 xxgxxxharctan)(,1)(4 重复上述的实验看其结果如何。 (3) 区间[a,b]上切比雪夫点的定义为 (21)cos,1,2,,1222(1)kbabakxknn (3) 以121,,nxxx为插值节点构造上述各函数的拉格朗日插值多项式,比较其结果,试分析数值分析实验二:插值法

2 / 21 原因。 1.2 算法设计 使用Matlab函数进行实验, 在理解了插值法的基础上,根据拉格朗日插值多项式编写Matlab脚本,其中把拉格朗日插值部分单独编写为f_lagrange.m函数,方便调用。 1.3 实验结果 1.3.1 f(x)在[-1,1]上的拉格朗日插值函数 依次取n=2、3、4、5、6、7、10、15、20,画出原函数和拉格朗日插值函数的图像,如图1所示。Matlab脚本文件为Experiment2_1_1fx.m。 可以看出,当n较小时,拉格朗日多项式插值的函数图像随着次数n的增加而更加接近于f(x),即插值效果越来越好。但是当n=10、15、20时,由于次数过高,插值函数的振荡越来越明显,导致在接近区间端点的地方,插值结果很差。 Figure 1 f(x)及拉格朗日多项式插值函数比较 1.3.2 h(x)和g(x)在[-5,5]上的拉格朗日插值函数 选用[-5,5]上的函数h(x)时,取n=2、10、15,得到的图2。Matlab脚本文件为Experiment2_1_2hx.m。 数值分析实验二:插值法

3 / 21 Figure 2 h(x)及拉格朗日多项式插值函数比较 选用[-5,5]上的函数g(x)时,取n=2、10、15,得到的图3。Matlab脚本文件为Experiment2_1_2gx.m。 Figure 3 g(x) 及拉格朗日多项式插值函数比较 可以看出h(x)和g(x)和插值函数图像比较,同样存在震荡现象。不过使用拉格朗日插值的结果在这里要比f(x)好一些,尤其是n=10、15时对g(x)的拉格朗日插值,如果不考虑区间端点附近的振荡,在区间内部近乎完全重合。 1.3.3 选用切比雪夫点构造拉格朗日插值多项式 选用切比雪夫点作为节点构造拉格朗日插值多项式,取n=5、10、15、50、100、150,得到f(x)及其拉格朗日多项式插值函数的图像如图4所示。Matlab脚本文件为Experiment2_1_3fx.m。 取n=5、10、20,得到g(x) 及其拉格朗日多项式插值函数的图像如图5所示。Matlab脚本文件为Experiment2_1_3gx.m。 从图4中可以看出,随着n的增加,插值函数越来越逼近f(x),当n=150时,拉格朗日插值函数近乎于原函数f(x)完全重合。对于g(x)=arccos(x),随着次数n的增加,接近速度更快,当n=20的时候,二者已经近似完全重合。所以,采用切比雪夫点作为插值节点,能够大大减少高次拉格朗日插值函数在区间端点的振荡现象。 数值分析实验二:插值法

4 / 21 Figure 4 f(x)和采用切比雪夫点的拉格朗日插值函数 Figure 5 g(x)和采用切比雪夫点的拉格朗日插值函数 1.4 分析总结 采用拉格朗日插值多项式逼近原函数的时候,当多项式的次数n较小时,随着n的增加,插值多项式越来越接近原函数。但是n相对较大时,插值函数在区间端点的振荡会越来越明显,这种高次插值多项式的病态现象即龙格现象。 通过比较f(x)、h(x)和g(x)与他们的插值函数的图像,可以发现插值函数随着次数n的增加病态的速度不完全相同,而是和具体函数有关,g(x)的插值函数的病态稍微小一点。 采用切比雪夫点作为插值函数的节点时,能够显著改善高次插值函数的病态现象,在次数n足够大时,插值函数总能与原函数近似完全吻合。所以采用切比雪夫点作为插值节点,提高大大提高插值函数的精度。 2 样条插值的收敛性 2.1 问题描述 多项式插值是不收敛的,即插值的节点多,效果不一定就好。对样条函数插值又如何呢?理论上证明样条插值的收敛性是比较困难的,但通过本实验可以验证这一理论结果。 数值分析实验二:插值法

5 / 21 实验要求: (1) 考虑式(1)的函数f(x),分别选择等距插值节点和非等距插值节点,并不断增加插值节点的个数,比较被逼近函数和样条插值函数误差的变化情况。分析所得结果并与拉格朗日多项式插值比较。 (2) 样条插值的思想是早产生于工业部门。作为工业应用的例子考虑如下问题:某汽车制造商用三次样条插值设计车门的曲线,其中一段的数据如下: Table 1 车门曲线数据 xk 0 1 2 3 4 5 6 7 8 9 10 yk 0.0 0.79 1.53 2.19 2.71 3.03 3.27 2.89 3.06 3.19 3.29 yk’ 0.8 0.2 要求编写样条插值函数程序,画出车门曲线。 2.2 算法设计 首先使用Matlab内置的样条插值函数spline计算插值点函数值,并绘制图像。 编写样条插值函数程序时,函数主体部分单独写成myspline.m函数,方便调用。Myspline函数的输入参数为:(x, y, 边界类型,边界值,xi)。其中x为节点向量,y为节点函数值向量,xi为未知节点向量,函数返回值为样条插值函数值向量S(xi)。 编写myspline函数时主要参考了课本2.7.2节的使用三弯矩方法推导样条函数的过程,以及课本5.4.3节使用追赶法解三对角线方程组。 2.3 实验结果 2.3.1 验证样条插值函数的收敛性 首先取n=10,画出f(x)原函数、拉格朗日插值函数和样条插值函数在区间[-1,1]上的图像如图6所示。Matlab脚本Experiment2_2.m。 Figure 6 n=10时,f(x)及其拉格朗日插值函数、样条插值函数图像 继续增加插值点个数,当n=20时得到图7。 数值分析实验二:插值法

6 / 21 Figure 7 n=20时,f(x)及其拉格朗日插值函数、样条插值函数图像 可以看出,样条插值函数的误差明显小于拉格朗日插值函数,而且随着插值节点n的增加,样条插值函数的误差越来越小。对于函数f(x),当n=20时,样条插值函数已经近似和原函数完全重合。 为了验证样条插值的收敛性,取 max, x1,1RSxfx 观察随着n的增加,R的变化,如图8。Matlab脚本Experiment2_2_1.m。 Figure 8 样条插值函数误差R与插值点个数n的关系 数值分析实验二:插值法

7 / 21 从图8中可以看出,随着n的增加,R逐渐减小并收敛于零,说明样条插值函数是收敛的。 2.3.2 编写myspline函数绘制车门曲线 使用matlab编写的myspline函数对表格1中的数据进行样条函数插值,将计算得到的样条函数图像画出来,如图9所示。Matlab脚本Experiment2_2_2.m。 Figure 9 myspline样条函数函数插值结果 可以看出,使用自己编写的myspline函数得到的样条函数的图像和matlab内置函数spline函数的图像基本重合。说明编写的myspline函数的插值结果比较精确。 2.4 分析总结 可以看出,和拉格朗日插值函数相比,样条插值函数对于原函数的逼近是比较理想的。这是由于一方面样条函数采用了分段插值,大大降低了高次拉格朗日插值带来的区间端点震荡的龙格现象。另一方面,样条函数保证了区间端点处的一介导数和二阶导数相等,使得样条曲线更加光滑。 从实验中,我们通过观察到样条插值函数的误差随着插值点个数的增加而减小,从而验证了样条函数的收敛性。 通过编写myspline函数,更加深入的理解了样条函数的推导过程,也掌握了使用追赶法求解三对角线方程组的方法。 3 一维插值函数的应用例题 数值分析实验二:插值法

8 / 21 3.1 实验内容 画你自己的手的形状,在MATLAB中输入 figure('position',get(0,'screensize')); axes('position',[0 0 1 1]); [x,y]=ginput; 将你的手掌张开放在计算机屏幕上,然后使用计算机鼠标选取一系列点勾勒出手的轮廓,按回车键结束ginput过程,这样就获得了一系列你的手掌外形数据点 。也可以这样获得数据点 ,先把手放在一张白纸上,并用笔画出它的轮廓线,然后将纸贴在计算机屏幕上,透过纸能看到平面上的鼠标,并通过ginput记录下轮廓上的点。 将和坐标值看作是两个独立变量的函数,独立变量的取值为从1到记录的点的数目。利用MATLAB的插值函数进行插值,并画出你的手掌外形轮廓。 3.2 实验结果 首先将手掌贴纸上,用笔描出手的形状。然后将纸张贴在屏幕上,通过题目给出的代码可以点选到手的形状的一系列点的坐标x和y,这些数据记录在Matlab的数据文件Experiment2_3_HandPointData.mat中。 然后,分别将x和y看作其角标的函数,使用Matlab内置函数spline插值,将得到的结果重新绘图,可以得到手的形状,如图10所示。Matlab脚本文件为Experiment2_3.m。 Figure 10 通过spline函数插值得到手的形状 数值分析实验二:插值法

9 / 21 4 思考题(二维插值) 4.1 利用二维差值找出丘陵地最高点 4.1.1 实验内容 在一丘陵地带测量高程,x和y方向每隔100米测一个点,得高程数据如下。试用MATLAB的二维插值函数“interp2”进行插值,并由此找出最高点和该点的高程。 y x 100 200 300 400 100 636 697 624 478 200 698 712 630 478 300 680 674 598 412 400 662 626 552 334 4.1.2 实验结果 首先使用Matlab的meshgrid函数生成网格坐标,输入各点的高程。然后再使用interp2函数对已知点进行样条插值,可以得到此丘陵地带的三维图像如图11所示。Matlab脚本文件为Experiment2_ad1.m。 Figure 11 使用interp2的样条插值得到丘陵地带地形图 利用Matlab的max函数可以找到最高点约为x=165,y=180,该点的高程约为721m。 4.2 利用二维插值画出山区地貌图 数值分析实验二:插值法