您的当前位置:首页正文

数学实验--多项式插值计算及其收敛性实验

2023-07-29 来源:步旅网


Lab02.多项式插值计算及其收敛性实验

【实验目的和要求】

1.使学生深入理解Langrage插值法和Newton插值法以两者之间的异同,能用Matlab语言编写按Langrage插值法和Newton插值法计算插值的程序;

2.用所编写的程序进行插值计算、验证Runge现象、分析插值多项式的收敛性;

3.使学生深入理解教材介绍的两种分段低次插值法,熟悉掌握函数interp1的使用;

4.使用函数interp1用不同方法进行插值计算,对教材介绍的几种分段低次插值法进行分析比较。

【实验内容】

1.根据Matlab语言特点,描述Langrage插值法和Newton插值法。

2.用Matlab语言编写按Langrage插值法和Newton插值法计算插值的程序。

1, x[5,5]21x,分别取3个,5个、9个、11个等距节点,用所编写的程序

3.对

y进行插值计算并画图,以验证Runge现象、分析插值多项式的收敛性。

1, x[5,5]1x2,用n=11个节点(等分)作分段线性插值、分

1

4.用函数interp1,对

y

段Hermit插值和三次样条插值,用m=101个插值点(等分)作图,比较结果。

【实验仪器与软件】

1.CPU主频在1GHz以上,内存在128Mb以上的PC;

2.Matlab 6.0及以上版本。

实验讲评:

实验成绩:

评阅教师:

2012 年5 月 1 日

Lab02.多项式插值计算及其收敛性实验

一、算法描述

Langrange算法描述:

1) 若n1次多项式

lj(x)(j1,...,n)在n个节点x1x2...xn上满足条件

2

1 k=jlj(xk)0 kj(j,k1,...n) (1)

就称这n个n1次多项式l1(x),...ln(x)为节点x1,...,xn上的差值基函数。

2) 差值基函数为

(xx1)...(xxk1)(xxk1)...(xxn)(xkx1)...(xkxk1)(xkxk1)...(xkxn)(k1,...,n)

lk(x)显然它满足条件(1)。于是,满足条件(1)的差值多项式Ln(x)可表示为

Ln(x)yklk(x)k1n

Ln(x)就称为拉格朗日Lagrange差值多项式。

Newton插值多项式算法描述:

Newton插值多项式的表达式如下:

Nn(x)c0c1(xx0)cn(xx0)(xx1)(xxn1)

其中每一项的系数ci的表达式如下:

cif(x0,x1,,xi)f(x1,x2,,xi)f(x0,x1,,xi1)xix0

根据ci以上公式,计算的步骤如下:

3

(1)

计算f(x0),f(x1),,f(xn)

(2)

计算f(x0,x1),,f(xn1,xn)

(3) ……

(4)

计算f(x0,x1,,xn1),f(x1,,xn1,xn)(5)

计算f(x0,x1,,xn1,xn)

二、算法程序

编写lagrange函数如下

function y=lagrange(x0,y0,x)

n=length(x0);

m=length(x);

for i=1:m

z=x(i);

s=0.0;

4

for k=1:n

p=1.0;

for j=1:n

if j~=k

p=p*(z-x0(j))/(x0(k)-x0(j)); end

end

s=p*y0(k)+s;

end

y(i)=s;

end

编写Newton插值法如下

function f = Newton(x,y,x0)

5

syms t;

if(length(x) == length(y))

n = length(x);

c(1:n) = 0;

else

display('你所输入的x与y的维数不相等!');

return

end

f = y(1);

y1 = 0;

l = 1;

for(i=1:n-1)

for(j=i+1:n)

6

y1(j) = (y(j)-y(i))/(x(j)-x(i));

end

c(i) = y1(i+1);

l = l*(t-x(i));

f = f + c(i)*l;

simplify(f);

y = y1;

if(i==n-1)

if(nargin == 3)

f = subs(f,'t',x0);

else

f = collect(f);

f = vpa(f, 6);

7

end

end

end

三、插值计算 对

y1, x[5,5]1x2,分别取3个,5个、9个、11个等距节点,用所编写的程序进行

插值计算并画图,以验证Runge现象、分析插值多项式的收敛性。

Langrange算法:

1. 取3个等距节点进行差值计算:

编写m函数如下:

x0=linspace(-5,5,3);

y0=1./(1+x0.^2);

x=-5:0.1:5;

y=1./(1+x.^2);

y1=lagrange(x0,y0,x);

8

plot(x,y,'r',x,y1,'b')

2.

取5个等距节点进行差值计算

x0=linspace(-5,5,5);

y0=1./(1+x0.^2);

x=-5:0.1:5;

y=1./(1+x.^2);

y1=lagrange(x0,y0,x);

9

plot(x,y,'r',x,y1,'b');

3.

取9个等距节点进行插值计算

x0=linspace(-5,5,9);

y0=1./(1+x0.^2);

x=-5:0.1:5;

y=1./(1+x.^2);

y1=lagrange(x0,y0,x);

plot(x,y,'r',x,y1,'b')

10

4.

取11个等距节点进行差值计算

x0=linspace(-5,5,11);

y0=1./(1+x0.^2);

x=-5:0.1:5;

y=1./(1+x.^2);

y1=lagrange(x0,y0,x);

plot(x,y,'r',x,y1,'b');

11

从图上看,在区间[-1,1]上,插值的误差比较小,在两端出现明显的振荡现象,即:Runge现象

Newton插值法:

(1)

取3个等距节点进行差值计算:

编写m函数如下:

x0=linspace(-5,5,3);

y0=1./(1+x0.^2);

x=-5:0.1:5;

y=1./(1+x.^2);

y1=Newton(x0,y0,x);

12

plot(x,y,'r',x,y1,'b')

(2) 取5个等距节点进行差值计算

x0=linspace(-5,5,5);

y0=1./(1+x0.^2);

x=-5:0.1:5;

y=1./(1+x.^2);

y1=Newton(x0,y0,x);

plot(x,y,'r',x,y1,'b');

13

(3) 取9个等距节点进行插值计算

x0=linspace(-5,5,9);

y0=1./(1+x0.^2);

x=-5:0.1:5;

y=1./(1+x.^2);

y1=Newton(x0,y0,x);

plot(x,y,'r',x,y1,'b');

14

(4) 取11个等距节点进行差值计算

x0=linspace(-5,5,11);

y0=1./(1+x0.^2);

x=-5:0.1:5;

y=1./(1+x.^2);

y1=Newton(x0,y0,x);

plot(x,y,'r',x,y1,'b');

15

虽然牛顿迭代做了改进,但从图上看,在区间[-1,1]上,插值的误差比较小,在两端还是存在明显的振荡现象(Runge现象)。

1, x[5,5]21x,用n=11个节点(等分)作分段线性插值、分

4、用函数interp1,对

y段Hermit插值和三次样条插值,用m=101个插值点(等分)作图,比较结果。

解:编写分段线性插值的m文件分别如下:

a) 用n=11个节点(等分)作分段线性插值

➢ m函数1:

function y = fenduan_linear(x0,y0,m,n)

16

%**************************************

%x0------------------------横坐标

%y0------------------------纵坐标

%m-------------------------x的值

%n-------------------------迭代的次数%**************************************

for i = 1:n-1

if (m >= x0(i)) &(m <= x0(i+1))

y = (m - x0(i+1))/(x0(i) - x0(i+1))*y0(i) + ( m- x0(i))/(x0(i+1) - x0(i))*y0(i+1);

end

end

➢ m函数2:

function y=fun_12(x)

y = 1./(1+x.^2);

17

end

m函数3:

function linshi11()

n = input('输入=:');

x0 = linspace( -5,5,n);

for x = -5:0.01:5

y = fenduan_linear(x0,fun_12(x0),x,n);

hold on;

plot(x,y,'g');

plot(x,fun_12(x),'b');

end

18

编写三次样条插值的m文件如下:

注意:此程序需在matlab中运行

function linshi14()

19

%*******************************************************

%spline-------------------matlab中自带的三次样条差值

%n----------------------插值点

%'o'----------------------原函点 %*****************************************************

n = input('输入=:');

x0 = linspace( -5,5,n);

for x = -5:0.01:5

hold on;

plot(x0,fun_12(x0),'ro',x,spline(x0,fun_12(x0),x))

end

20

数值的

四、算法分析

通过图像及数值的对比都可以看到:

拉格朗日多项式,当n 增大时,并不能保证在所有区间都收敛于原函数——由于拉格朗

21

日多项式的次数增大,在收敛区间外的点上,高阶导数不为零。光滑性变差,从而产生了极大的振荡。也就是说只有已知插值点落在收敛区间以内时,才可采用。所以影响了这种方法的实用价值。

牛顿多项式与拉格朗日差值多项式具有一样的性质,但是由于具有的承袭性,使得计算的量大为减少。

分段线性插值的曲线不如拉格朗日和三次样条的曲线光滑。但是当n 趋于无穷时,它总能处处收敛于原函数。因此,分段线性插值一般应用在需要快速计算而又无特殊要求的情况下。

三次样条插值,当n 趋于无穷时,它也总能处处收敛于原函数。而且它的曲线更光滑。

五、总结

由于拉格朗日和牛顿多项式的次数增大,产生了极大的振荡;分段线性插值虽然曲线没前两个光滑,但在n 趋于无穷时,它总能处处收敛于原函数;因此最好的使用分段低次差值。

22

因篇幅问题不能全部显示,请点此查看更多更全内容