资源描述
第二次实验 多项式插值计算及其收敛实验
Lab02.多项式插值计算及其收敛性实验
【实验目的和要求】
1.使学生深入理解Langrage插值法和Newton插值法以两者之间的异同,能用Matlab语言编写按Langrage插值法和Newton插值法计算插值的程序;
2.用所编写的程序进行插值计算、验证Runge现象、分析插值多项式的收敛性;
3.使学生深入理解教材介绍的两种分段低次插值法,熟悉掌握函数interp1的使用;
4.使用函数interp1用不同方法进行插值计算,对教材介绍的几种分段低次插值法进行分析比较。
【实验内容】
1.根据Matlab语言特点,描述Langrage插值法和Newton插值法。
2.用Matlab语言编写按Langrage插值法和Newton插值法计算插值的程序。
3.对,分别取3个,5个、9个、11个等距节点,用所编写的程序进行插值计算并画图,以验证Runge现象、分析插值多项式的收敛性。
4.用函数interp1,对,用n=11个节点(等分)作分段线性插值、分段Hermit插值和三次样条插值,用m=101个插值点(等分)作图,比较结果。
【实验仪器与软件】
1.CPU主频在1GHz以上,内存在128Mb以上的PC;
2.Matlab 6.0及以上版本。
实验讲评:
实验成绩:
评阅教师:
2012 年04 月20 日
Lab02.多项式插值计算及其收敛性实验
一、算法描述
拉格朗日插值法:若n次多项式在n+1个节点上满足条件
并且n+1个节点的n次插值多项式满足
,
则插值多项式为:
(1)
形如(1)的插值多项式称为拉格朗日插值多项式。
牛顿插值法: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
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=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;
for 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(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_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=linspace(-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('原始图象','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)
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=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^')
clear all
clc
x0=linspace(-5,5,101);
y0=1./(1+x0.^2);
x=-5:0.1:5;
y=1./(1+x.^2);
y2=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^')
四、算法分析
拉格朗日插值多项式,公式结构紧凑,相对于理论分析比较重要。当插值节点增加或减少时,计算要全部重新开始,计算量大;其插值曲线光滑,误差估计有表达式。但当节点再次增加时,它就会表现出Runge现象。牛顿插值多项式,具有一定的继承性,计算方便。分段低次插值﹑分段Hermit插值﹑三次样条插值都避免了Runge现象的产生。但分段低次插值函数的导数是间断的;分段Hermit插值比分段低次插值效果较好。但它要给出节点上的导数值,要的信息太多,并且也不太光滑,即,光滑度不高。所以三次样条插值就避免了以上的缺点。
五、 总结
通过以上实验,两种方法都是当取的节点数超过一定的数目时,得到的误差就会越大。而另外三种(分段低次插值﹑分段Hermit插值﹑三次样条插值)表现不太明显。
- 7 -
展开阅读全文