1、 第二次实验 多项式插值计算及其收敛实验 Lab02.多项式插值计算及其收敛性实验 【实验目的和要求】 1.使学生深入理解Langrage插值法和Newton插值法以两者之间的异同,能用Matlab语言编写按Langrage插值法和Newton插值法计算插值的程序; 2.用所编写的程序进行插值计算、验证Runge现象、分析插值多项式的收敛性; 3.使学生深入理解教材介绍的两种分段低次插值法,熟悉掌握函数interp1的使用; 4.使用函数in
2、terp1用不同方法进行插值计算,对教材介绍的几种分段低次插值法进行分析比较。 【实验内容】 1.根据Matlab语言特点,描述Langrage插值法和Newton插值法。 2.用Matlab语言编写按Langrage插值法和Newton插值法计算插值的程序。 3.对,分别取3个,5个、9个、11个等距节点,用所编写的程序进行插值计算并画图,以验证Runge现象、分析插值多项式的收敛性。 4.用函数interp1,对,用n=11个节点(等分)作分段线性插值、分段Hermit插值和三次样条插值,用m=101个插值点(等分)作图,比较结果。 【实验仪器与软件】 1.CPU主频
3、在1GHz以上,内存在128Mb以上的PC; 2.Matlab 6.0及以上版本。 实验讲评: 实验成绩: 评阅教师: 2012 年04 月20 日 Lab02.多项式插值计算及其收敛性实验 一、算法描述 拉格朗日插值法:若n次多项式在n+1个节点上满足条件 并且n+1个节点的n次插值多项式满足 , 则插值多项式为: (1) 形如(1)的插值多项式称为拉
4、格朗日插值多项式。 牛顿插值法:n次插值多项式满足: , 则可表示为: 其系数为 , 且 所以 这样就称为牛顿均差插值多项式。 二、算法程序 拉格朗日插值法的程序如下: function y = Myfun_1(x0,y0,x) n=length(x0) m=length(x); for i=1:m sum=0.0; for j=1:n p=1.0; for k=1:n
5、if (k~=j) p=p*((x(i)-x0(k))/(x0(j)-x0(k))); end end sum=sum+p*y0(j); end y(i)=sum; end end 举一个例如下: clear all; clc; y0=[0 -3 4]; x0=[1 -1 2]; x=6; y = Myfun_1(x0,y0,x) n = 3 y = 36.6667 牛顿插值法程序如下: function y=
6、newton(x0,y0,x) %d牛顿插值法 n=length(x0); m=length(x); d=zeros(n,n);%d为差商表矩阵 for j=1:n d(j,1)=y0(j);%差商表第一列 end for j=2:n %差商表为下三角矩阵 for i=j:n d(i,j)=(d(i,j-1)-d(i-1,j-1))./(x0(i)-x0(i-j+1));%求差商表矩阵中各值 end end d for k=1:m z=x(k); r=d(1,1); t=1; f
7、or i=2:n t=t*(z-x0(i-1)); r=r+d(i,i)*t; end y(k)=r; End 举一个例如下: clear all; clc; y0=[0 -3 4]; x0=[1 -1 2]; x=6; y=newton(x0,y0,x) 三、 插值计算 用拉格朗日插值法: clear all; clc; x0=linspace(-5,5,3); y0=1./(1+x0.^2); x=-5:0.1:5; y = Myfun_1(x0,y0,x) z=1./(1+x.^2); n=size(x0) plot(
8、x,z,x,y,':') legend('原始图象','Lagrange插值') clear all; clc; x0=linspace(-5,5,5); y0=1./(1+x0.^2); x=-5:0.1:5; y = Myfun_1(x0,y0,x) z=1./(1+x.^2); n=size(x0) plot(x,z,x,y,':') legend('原始图象','Lagrange插值') clear all; clc; x0=linspace(-5,5,9); y0=1./(1+x0.^2); x=-5:0.1:5; y = Myfun
9、1(x0,y0,x) z=1./(1+x.^2); n=size(x0) plot(x,z,x,y,':') legend('原始图象','Lagrange插值') clear all; clc; x0=linspace(-5,5,11); y0=1./(1+x0.^2); x=-5:0.1:5; y = Myfun_1(x0,y0,x) z=1./(1+x.^2); n=size(x0) plot(x,z,x,y,':') legend('原始图象','Lagrange插值') 用牛顿插值法: clear all; clc; x0=l
10、inspace(-5,5,3); y0=1./(1+x0.^2); x=-5:0.1:5; y = newton(x0,y0,x) z=1./(1+x.^2); n=size(x0) plot(x,z,x,y,':') legend('原始图象','newton插值') clear all; clc; x0=linspace(-5,5,5); y0=1./(1+x0.^2); x=-5:0.1:5; y = newton(x0,y0,x) z=1./(1+x.^2); n=size(x0) plot(x,z,x,y,':') legend('原始图象','
11、newton插值') clear all; clc; x0=linspace(-5,5,9); y0=1./(1+x0.^2); x=-5:0.1:5; y = newton(x0,y0,x) z=1./(1+x.^2); n=size(x0) plot(x,z,x,y,':') legend('原始图象','newton插值') clear all; clc; x0=linspace(-5,5,11); y0=1./(1+x0.^2); x=-5:0.1:5; y = newton(x0,y0,x) z=1./(1+x.^2); n=size(x0
12、) plot(x,z,x,y,':') legend('原始图象','newton插值') 根据图中所示,当在区间[-3,3]上时,插值多项式能很好的逼近函数,收敛性较好,而在其两端震荡比较明显,不能很好的逼近,收敛性较差,则称这种现象为Runge现象。 分段线性插值、分段Hermit插值和三次样条插值程序: clear all clc x0=linspace(-5,5,11); y0=1./(1+x0.^2); x=-5:0.1:5; y=1./(1+x.^2); y2=interp1(x0,y0,x,'linear'); %分段线性插值 y3=interp
13、1(x0,y0,x,'spline'); %三次样条插值 y4=interp1(x0,y0,x,'pchip'); %分段Hermit插值 subplot(221) plot(x,y,'r') subplot(222) plot(x,y2,'m+') subplot(223) plot(x,y3,'y.') subplot(224) plot(x,y4,'g^') clear all clc x0=linspace(-5,5,101); y0=1./(1+x0.^2); x=-5:0.1:5; y=1./(1+x.^2); y2
14、interp1(x0,y0,x,'linear'); %分段线性插值 y3=interp1(x0,y0,x,'spline'); %三次样条插值 y4=interp1(x0,y0,x,'pchip'); %分段Hermit插值 subplot(221) plot(x,y,'r') subplot(222) plot(x,y2,'m+') subplot(223) plot(x,y3,'y.') subplot(224) plot(x,y4,'g^') 四、算法分析 拉格朗日插值多项式,公式结构紧凑,相对于理论分析比较重要。当插值节点增加或减
15、少时,计算要全部重新开始,计算量大;其插值曲线光滑,误差估计有表达式。但当节点再次增加时,它就会表现出Runge现象。牛顿插值多项式,具有一定的继承性,计算方便。分段低次插值﹑分段Hermit插值﹑三次样条插值都避免了Runge现象的产生。但分段低次插值函数的导数是间断的;分段Hermit插值比分段低次插值效果较好。但它要给出节点上的导数值,要的信息太多,并且也不太光滑,即,光滑度不高。所以三次样条插值就避免了以上的缺点。 五、 总结 通过以上实验,两种方法都是当取的节点数超过一定的数目时,得到的误差就会越大。而另外三种(分段低次插值﹑分段Hermit插值﹑三次样条插值)表现不太明显。 - 7 -






