多项式插值的震荡现象.docx
《多项式插值的震荡现象.docx》由会员分享,可在线阅读,更多相关《多项式插值的震荡现象.docx(26页珍藏版)》请在冰豆网上搜索。
![多项式插值的震荡现象.docx](https://file1.bdocx.com/fileroot1/2023-2/13/c03d9896-1185-4977-8b3c-de54e79345db/c03d9896-1185-4977-8b3c-de54e79345db1.gif)
多项式插值的震荡现象
数值分析课程设计
多项式插值的震荡现象
指导教师
学院名称
专业名称
提交日期
一、问题的提出
在一个固定区间上用插值逼近一个函数。
显然,拉格朗日插值中使用的节点越多,插值多项式的次数就越高。
而插值多项式增加时,Ln(x)是否也更加靠近被逼近的函数。
下面就这个问题展开实验。
二、实验内容
1.设区间[-1,1]上的函数
,对其等距划分,写出其拉格朗日插值多项式为
。
通过不断增加分点数n=2,3,…。
并:
I.画出原函数f(x)及插值多项式函数Ln(x)在[-1,1]上的图像;
II.给出每一次逼近的最大误差;
III.比较并分析实验结果。
2.选择其他函数,如定义在区间[-5,5]上的函数
和
,重复上述I、II、III三个步骤看其结果如何。
3.区间[a,b]上切比雪夫点的定义为
k=1,2,…,n+1。
以
…,
为插值节点构造上述各函数的Lagrange插值多项式,比较其结果。
三、实验结果及分析
1.I.画出函数f(x)及其插值多项式函数Ln(x)在[-1,1]上的图像,如下图,
(程序代码1.1.1)
II.由于fminbnd函数的不可靠性,先通过编程绘出每次逼近在定义区间上的误差如下图,(程序代码1.1.2)
观察图像可知每次逼近的最大误差在哪个区间,再通过编程缩小区间,得到其每次逼近最大误差为(截图如下,程序代码1.1.3),
III.比较并分析实验结果:
(1)在同一个坐标系中绘制f(x)及5次、7次等多次插值后的图像。
从图中可以很清楚的看出,在[-0.4,0.4]的区间内,随着插值次数的增加插值图像越来越逼近f(x),然而当|x|>0.8以后,插值曲线围绕原函数曲线发生剧烈震荡现象,尤其是插值次数越多时震荡越强烈。
(2)在同一个坐标系中绘制每次插值后的误差图像。
从图中可以看出较大误差主要出现在中心及两段,而就每次逼近的最大误差分析。
可以观察到:
1.当插值次数在一定区间上增多时,其最大误差变小,即吻合度增高(5次插值最大误差是0.437,7次插值最大误差是0.2474);2.而超过一定区间,随着插值次数增加其最大误差越大,而且其最大误差x的取值越趋向于两端,于是发生了震荡现象。
2.h(x):
I.画出函数h(x)及其插值多项式函数Ln(x)在[-1,1]上的图像,如下图(程序代码2.1.1):
II.同理先通过编程绘出每次逼近在定义区间上的误差如下图(程序代码2.1.2),
再通过缩小区间,编程计算每次逼近最大误差如下(截图如下,程序代码2.1.3):
III.比较并分析实验结果:
(1)在同一个坐标系中绘制h(x)及5次、10次等多次插值后的图像。
与第一个实验相似,从图中可以看出,在[-3,3]的区间内,随着插值次数的增加插值图像越来越逼近h(x),然而当|x|>4以后,插值曲线围绕原函数曲线发生剧烈震荡现象,而无论插值次数多少,震荡都很强烈。
不过插值次数越多偏离越远,误差越大。
(2)就每次逼近的最大误差分析。
可以观察到:
随着插值次数的增加,在区间[-4,4],插值函数的吻合度越大,甚至可以忽略误差。
而在两端却误差增大许多,而且越趋向于两端点。
g(x):
I.画出函数g(x)及其插值多项式函数Ln(x)在[-1,1]上的图像,如下图(程序代码2.2.1),
II.同理先通过编程绘出每次逼近在定义区间上的误差如下图(程序代码2.2.2),
再通过缩小区间,编程计算每次逼近最大误差如下(截图如下,程序代码2.2.3):
III.比较并分析实验结果:
(1)在同一个坐标系中绘制g(x)及5次、10次等多次插值后的图像。
从图中可以看出:
与第1、2个函数不同,这里的10次插值函数整体拟合程度最好,在两端并没有发生较剧烈的震荡现象;而插值次数到了15或20次时,震荡非常强烈。
(2)就每次逼近的最大误差分析。
其结果与上两个函数大致一样,就不做详细说明了。
3.以切比雪夫点为插值点构造上述3个函数的拉格朗日插值公式,并画图,
f(x)(程序代码3.1.1):
h(x)(程序代码3.2.1):
g(x)(程序代码3.3.1):
先通过画图并观察,缩小区间得到每次逼近的最大误差:
f(x)(程序代码3.1.2):
(程序代码3.1.3)
h(x)(程序代码3.2.2):
(程序代码3.2.3)
g(x)(程序代码3.3.2):
(程序代码3.3.3)
通过观察3个原函数及插值函数图象,可以看出随着插值次数的增加插值图象越来越逼近原函数,围绕着原函数图像来回波动,并且在两端并没有出现震荡现象;而分析其3个函数的每次插值函数的误差图像及每次插值的最大误差。
可知:
较大的误差主要出现在区间的中心附近,越靠近两段,误差反而越小,而且插值次数越多,其最大误差越小,即拟合度更高。
由此很明显,以切比雪夫点为插值点的插值函数,比等距划分插值点的插值函数有更好的拟合性和估计性。
四、关于本设计的体会
做了两个星期的课程设计,首先的感触就是很烦,然后感觉收获了很多,包括对Matlab的熟悉程度有很大的提升、对Matlab一些内置函数也有了很好的理解和运用、锻炼了自己自习找资料的能力。
而做这个课程设计的主要的困难就是做出第一个函数的绘图、误差分析等等,因为后面无论是其它两个函数或者用切比雪夫点构造的三个函数的插值函数,都是万变不离其宗。
而这次设计的过程和结果,也存在较多不足之处。
对Matlab一些函数的不了解,导致花大量的时间走了弯路,并得到不太理想的结果,例如:
无法通过一个循环语句;还有就是在分析结果时,不能很透彻的分析到位,尚且有待提高。
五、参考文献
[1]任玉杰,数值分析及其MATLAB实现[M],北京,高等教育出版社,2007
[2]史万明吴裕树,数值分析[M],北京,北京理工大学出版社,2010-4
六、附录
I.运行环境(计算机型号DELLN4030):
II.运行时间:
2012年5月30日星期三20:
00
III.程序代码:
1.定义两个m函数:
f.m:
functionz=f(x)
z=1/(1+25*(x^2))
Lf.m:
functionLn=Lf(x,n)
Ln=0%初始化Ln
fori=1:
n+1
X(i)=-1+2*(i-1)/n;%平均划分节点,并存储在X矩阵内
end
fori=1:
n+1%该循环得出各项ai(x)f(xi)想加之和
q=f(X(i))
forj=1:
n+1%该循环得出每一项的ai(x)f(xi)
ifi~=j
q=q*(x-X(j))/(X(i)-X(j))
end
end
Ln=Ln+q
end
(程序代码1.1.1)【绘图】运行窗口主程序:
fplot('f(x)',[-11],'r')%画出原函数图像
holdon%保留图像
color=['g','b','m','k','c','y']%定义颜色字符组
fplot('Lf(x,5)',[-11],color
(1))%分别画出5,7,9,11,13,15次
fplot('Lf(x,7)',[-11],color
(2))%插值的图像
fplot('Lf(x,9)',[-11],color(3))
fplot('Lf(x,11)',[-11],color(4))
fplot('Lf(x,13)',[-11],color(5))
fplot('Lf(x,15)',[-11],color(6))
legend('原函数','5次','7次','9次','11次','13次','15次')
title('多项式插值的震荡现象')%表明图像名称
axis([-1,1,-1,1])%缩小观察范围
gridon%图像中显示网格,易于观察
(程序代码1.1.2)【绘图表示误差】运行窗口主程序:
holdon%保留图像
color=['g','b','m','k','c','y']%定义颜色字符组
fplot('-abs(f(x)-Lf(x,5))',[-11],color
(1))%分别画出每次插值
fplot('-abs(f(x)-Lf(x,7))',[-11],color
(2))%在定义区间上的误差
fplot('-abs(f(x)-Lf(x,9))',[-11],color(3))
fplot('-abs(f(x)-Lf(x,11))',[-11],color(4))
fplot('-abs(f(x)-Lf(x,13))',[-11],color(5))
fplot('-abs(f(x)-Lf(x,15))',[-11],color(6))
legend('5次','7次','9次','11次','13次','15次')
title('逼近函数与原函数在区间上的误差')%表明图像名称
gridon%图像中显示网格,易于观察
axis([-1,1,-2.2,0])%缩小观察范围
(程序代码1.1.3)【计算误差】运行窗口主程序:
[xmin
(1),ymin
(1)]=fminbnd('-abs(f(x)-Lf(x,5))',-0.2,0.2)
%计算5次插值多项式与原函数之间差的最大值,下面同理
[xmin
(2),ymin
(2)]=fminbnd('-abs(f(x)-Lf(x,7))',-0.2,0.2)
[xmin(3),ymin(3)]=fminbnd('-abs(f(x)-Lf(x,9))',-1,-0.8)
[xmin(4),ymin(4)]=fminbnd('-abs(f(x)-Lf(x,11))',-1,-0.8)
[xmin(5),ymin(5)]=fminbnd('-abs(f(x)-Lf(x,13))',-1,-0.8)
[xmin(6),ymin(6)]=fminbnd('-abs(f(x)-Lf(x,15))',-1,-0.8)
2.
函数:
定义两个m函数:
h.m:
functiony=h(x)
y=x/(1+x^4)
Lh.m:
functionLn=Lh(x,n)
Ln=0%初始化Ln
fori=1:
n+1%平均划分节点,并存储在X矩阵内
X(i)=-5+10*(i-1)/n;
end
fori=1:
n+1%该循环得出各项ai(x)f(xi)想加之和
q=h(X(i))
forj=1:
n+1%该循环得出每一项的
ifi~=j
q=q*(x-X(j))/(X(i)-X(j))
end
end
Ln=Ln+q
end
(程序代码2.1.1)【绘图】运行窗口主程序:
fplot('h(x)',[-55],'r')%画出原函数图像
holdon%保留图像
color=['g','b','m','k']%定义颜色字符组
fplot('Lh(x,5)',[-55],color
(1))%分别画出5,7,9,11,13,15次
fplot('Lh(x,10)',[-55],color
(2))%插值的图像
fplot('Lh(x,15)',[-55],color(3))
fplot('Lh(x,20)',[-55],color(4))
legend('原函数','5次','10次','15次','20次')
title('多项式插值的震荡现象')%表明图像名称
axis([-5,5,-1,1])%缩小观察范围
gridon%图像中显示网格,易于观察
(程序代码2.1.2)【绘图表示误差】运行窗口主程序:
holdon
color=['g','b','m','k']
fplot('-abs(h(x)-Lh(x,5))',[-55],color
(1))
fplot('-abs(h(x)-Lh(x,10))',[-55],color
(2))
fplot('-abs(h(x)-Lh(x,15))',[-55],color(3))
fplot('-abs(h(x)-Lh(x,20))',[-55],color(4))
legend('5次','10次','15次','20次')
title('逼近函数与原函数在区间上的误差')
gridon
(程序代码2.1.3)【计算误差】运行窗口主程序:
[xmin
(1),ymin
(1)]=fminbnd('-abs(h(x)-Lh(x,5))',-5,-4)
[xmin
(2),ymin
(2)]=fminbnd('-abs(h(x)-Lh(x,10))',-5,-4)
[xmin(3),ymin(3)]=fminbnd('-abs(h(x)-Lh(x,15))',-5,-4)
[xmin(4),ymin(4)]=fminbnd('-abs(h(x)-Lh(x,20))',-5,-4)
函数:
定义两个m函数:
g.m:
functiony=g(x)
y=atan(x)
Lg.m:
functionLn=Lg(x,n)
Ln=0%初始化Ln
fori=1:
n+1%平均划分节点,并存储在X矩阵内
X(i)=-5+10*(i-1)/n;
end
fori=1:
n+1%该循环得出各项ai(x)f(xi)想加之和
q=g(X(i))
forj=1:
n+1%该循环得出每一项的
ifi~=j
q=q*(x-X(j))/(X(i)-X(j))
end
end
Ln=Ln+q
end
(程序代码2.2.1)【绘图】运行窗口主程序:
fplot('g(x)',[-55],'r')%画出原函数图像
holdon%保留图像
color=['g','b','m','k']%定义颜色字符组
fplot('Lg(x,5)',[-55],color
(1))%分别画出5,7,9,11,13,15次
fplot('Lg(x,10)',[-55],color
(2))%插值的图像
fplot('Lg(x,15)',[-55],color(3))
fplot('Lg(x,20)',[-55],color(4))
legend('原函数','5次','10次','15次','20次')
title('多项式插值的震荡现象')%表明图像名称
axis([-5,5,-4,4])%缩小观察范围
gridon%图像中显示网格,易于观察
(程序代码2.2.2)【绘图表示误差】运行窗口主程序:
holdon
color=['g','b','m','k']
fplot('-abs(g(x)-Lg(x,5))',[-55],color
(1))
fplot('-abs(g(x)-Lg(x,10))',[-55],color
(2))
fplot('-abs(g(x)-Lg(x,15))',[-55],color(3))
fplot('-abs(g(x)-Lg(x,20))',[-55],color(4))
legend('5次','10次','15次','20次')
title('逼近函数与原函数在区间上的误差')
gridon
(程序代码2.2.3)【计算误差】运行窗口主程序:
[xmin
(1),ymin
(1)]=fminbnd('-abs(g(x)-Lg(x,5))',-5,-4)
[xmin
(2),ymin
(2)]=fminbnd('-abs(g(x)-Lg(x,10))',-5,-4.5)
[xmin(3),ymin(3)]=fminbnd('-abs(g(x)-Lg(x,15))',-5,-4.5)
[xmin(4),ymin(4)]=fminbnd('-abs(g(x)-Lg(x,20))',-5,-4.5)
3.切比雪夫点为插值节点构造f(x)插值多项式:
定义m函数:
Lf0(x,n).m:
functionLn=Lf0(x,n)
Ln=0
fori=1:
n+1
X(i)=cos((2*i-1)*pi/2/(n+1));
end
fori=1:
n+1
q=f(X(i))
forj=1:
n+1
ifi~=j
q=q*(x-X(j))/(X(i)-X(j))
end
end
Ln=Ln+q
end
(程序代码3.1.1)【绘图】运行窗口主程序:
fplot('f(x)',[-11],'r')%画出原函数图像
holdon%保留图像
color=['g','b','m','k','c','y']%定义颜色字符组
fplot('Lf0(x,5)',[-11],color
(1))%分别画出5,7,9,11,13,15次
fplot('Lf0(x,7)',[-11],color
(2))%插值的图像
fplot('Lf0(x,9)',[-11],color(3))
fplot('Lf0(x,11)',[-11],color(4))
fplot('Lf0(x,13)',[-11],color(5))
fplot('Lf0(x,15)',[-11],color(6))
legend('原函数','5次','7次','9次','11次','13次','15次')
title('多项式插值的震荡现象')%表明图像名称
axis([-1,1,0,1])%缩小观察范围
gridon%图像中显示网格,易于观察
(程序代码3.1.2)【绘图表示误差】运行窗口主程序:
holdon%保留图像
color=['g','b','m','k','c','y']%定义颜色字符组
fplot('-abs(f(x)-Lf0(x,5))',[-11],color
(1))
fplot('-abs(f(x)-Lf0(x,7))',[-11],color
(2))
fplot('-abs(f(x)-Lf0(x,9))',[-11],color(3))
fplot('-abs(f(x)-Lf0(x,11))',[-11],color(4))
fplot('-abs(f(x)-Lf0(x,13))',[-11],color(5))
fplot('-abs(f(x)-Lf0(x,15))',[-11],color(6))
legend('5次','7次','9次','11次','13次','15次')
title('逼近函数与原函数在区间上的误差')%表明图像名称
gridon
axis([-1,1,-0.6,0])
(程序代码3.1.3)【计算误差】运行窗口主程序:
[xmin
(1),ymin
(1)]=fminbnd('-abs(f(x)-Lf0(x,5))',-0.2,0.2)
[xmin
(2),ymin
(2)]=fminbnd('-abs(f(x)-Lf0(x,7))',-0.2,0.2)
[xmin(3),ymin(3)]=fminbnd('-abs(f(x)-Lf0(x,9))',-0.2,0.2)
[xmin(4),ymin(4)]=fminbnd('-abs(f(x)-Lf0(x,11))',-0.2,0.2)
[xmin(5),ymin(5)]=fminbnd('-abs(f(x)-Lf0(x,13))',-0.2,0.2)
[xmin(6),ymin(6)]=fminbnd('-abs(f(x)-Lf0(x,15))',-0.2,0.2)
切比雪夫点为插值节点构造h(x)插值多项式:
定义m函数:
Lh0(x,n).m:
functionLn=Lh0(x,n)
Ln=0
fori=1:
n+1
X(i)=5*cos((2*i-1)*pi/2/(n+1));
end
fori=1:
n+1
q=h(X(i))
forj=1:
n+1
ifi~=j
q=q*(x-X(j))/(X(i)-X(j))
end
end
Ln=Ln+q
end
(程序代码3.2.1)【绘图】运行窗口主程序:
fplot('h(x)',[-55],'r')%画出原函数图像
holdon%保留图像
color=['g','b','m','k']%定义颜色字符组
fplot('Lh0(x,5)',[-55],color
(1))%分别画出5,7,9,11,13,15次
fplot('Lh0(x,10)',[-55],color
(2))%插值的图像
fplot('Lh0(x,15)',[-55],color(3))
fplot('Lh0(x,20)',[-55],color(4))
legend('原函数','5次','10次','15次','20次')
title('多项式插值的震荡现象')%表明图像名称
axis([-5,5,-0.6,0.6])%缩小观察范围
gridon%图像中显示网格,易于观察
(程序代码3.2.2)【绘图表示误差】运行窗口主程序:
holdon
color=['g','b','m','k']
fplot('-abs(h(x)-Lh0(x,5))',[-55],color
(1))
fplot('-abs(h(x)-Lh0(x,10))',[-55],color
(2))
fplot('-abs(h(x)-Lh0(x,15))',[-55],color(3))
fplot('-abs(h(x)-Lh0(x,20))',[-55],color(4))
legend('5次','10次','15次','20次')
title('逼近函数与原函数在区间上的误差')
gridon
(程序代码3.2.3)【计算误差】运行窗口主程序:
[xmin
(1),ymin
(1)]=fminbnd('-abs(h(x)-Lh0(x,5))',-1,0)
[xmin
(2),ymin
(2)]=fminbnd('-abs(h(x)-Lh0(x,10))',-1,0)
[xmin(3),ymin(3)]=fminbnd('-abs(h(x)-Lh0(x,15))',-2.5,-1.5)
[xmin(4),ymin(4)]=fminbnd('-abs(h(x)-Lh0(x,20))',-1,0)
切比雪夫点为插值节点构造g(x)插值多项式:
定义m函数:
Lg0(x,n).m:
functionLn=Lg0(x,n)
Ln=0
fori=1:
n+1
X(i)=5*cos((2*i-1)*pi/2/(n+1));
end
fori=1:
n+1
q=g(X(i))
forj=1:
n+1
ifi~=j
q=q*(x-X(j))/(X(i)-X(j))
end
end
Ln=Ln+q
end
(程序代码3.3.1)【绘图】运行窗口主程序:
fplot('g(x)',[-55],'r')%画出原函数图像
holdon%保留图像
color=['g','b','m','k']%定义颜色字符组
fplot('Lg0(x,5)',[-55],color
(1))%分别画出5,7,9,11,13,