数值分析实验(2.3.5章)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

试验2.1 多项式插值的振荡现象

实验目的:

观察多项式插值的振荡现象,了解多项式的次数与逼近效果的关系。

实验内容:

问题提出:考虑在一个固定的区间上用插值逼近一个函数。显然Lagrange 插值中使用的节点越多,插值多项式的次数就越高。我们自然关心插值多项式的次数增加时,Ln(x)是否也更加靠近被逼近的函数。Runge 给出的一个例子是极著名并富有启发性的。设区间[-1,1]上的函数

2

25x

11)x (+=

f ,

考虑区间[-1,1]上的一个等距划分,分点为

n

2i 1x i +

-=,i=0,1,2,…,n

则拉格朗日插值多项式为:

)x (l 25x

11

)x (Ln i n

i 2

i

∑=+=

其中的)x (l i ,i=0,1,2,…,n 是n 次拉格朗日插值基函数。

实验要求:

1、选择不断增大的分点数目n=2,3,………,画出原函数)x (f 及插值多项式函数)x (Ln 在[-1,1]上的图像,比较并分析试验结果。

2、选择其他的函数,例如定义在区间[-5,5]上的函数

4

()1x h x x

=

+,()arctan g x x =,

重复上述的实验看其结果如何。

实验步骤及结果分析:

1、选择不断增大的分点数目n=2,3,4,5,6,7,8,9,10做)x (f 的拉格朗日插值多项式)x (Ln ,并与原函数值做比较,如下图所示。

观察图像可知:

n=2,3时插值函数和原函数差别很大,n=4,5,6时插值函数与原函数的逼近程度相对较好,继续增加插值次数n ,插值函数在插值区域的中间部分收敛,而在

这区间外是发散的,此外,n=7,9时在插值中间区域逼近效果不好。

因此,适当提高插值多项式次数,可以提高逼近的精度,但是次数太高反而产生相反的效果。

2、选择其他的函数进行插值。 原函数4

()1x h x x

=

+,区间[-5,5],插值结果如下图:

观察图像可知:

低次插值时,插值效果不好。

n=7,8,9,10时,在区间[-2,2],插值函数与原函数逼近程度好,但在区间外插值

函数发散。其中,n=8,10插值效果比n=7,9好。

原函数()arctan

,区间[-5,5],插值结果如下图:

g x x

观察图像可知:

n=5,6,7,8,9,10时,在区间[-3,3],插值函数与原函数逼近程度好,但在区间外插值函数发散。其中,n=7,9在插值区间两端发散的更剧烈。

分析在插值区间两端发散的原因:

次数越高,计算量就越大,积累误差也大,在整个区间上做高次多项式,当局部

插值节点处的值有微小偏差时,可能引起整个区间上函数值的很大变化,使计算不稳定。

Matlab程序如下:

function t_charpt2

%数值实验二

%输入:实验选择,函数式选择,插值节点数

%输出:拟合函数及原函数的图形

result=inputdlg({'请选择实验,若选2.1,请输入1,否则输入2:'},'charpt_2',1,{'1'}); Nb=str2num(char(result));

if(Nb~=1)&(Nb~=2) errordlg('实验选择错误!');

return;

end

promps={'请选择实验函数,若选f(x),请输入f,若选h(x),请输入h,若选g(x),请输入g:'};

result=inputdlg(promps,'charpt 2',1,{'f'});

Nb_f=char(result);

if(Nb_f~='f'&Nb_f~='h'&Nb_f~='g')

errordlg('实验选择错误!');

return;

end

result=inputdlg({'请输入插值点数N:'},'charpt_2',1,{'10'});

Nd=str2num(char(result));

if(Nd<1)

errordlg('结点输入错误!');

return;

end

switch Nb_f

case 'f'

f=inline('1./(1+25*x.^2)');a=-1;b=1;

case 'h'

f=inline('x./(1+x.^4)');a=-5;b=5;

case 'g'

f=inline('atan(x)');a=-5;b=5;

end

if(Nb==1)

x0=linspace(a,b,Nd+1);y0=feval(f,x0);

x=a:0.1:b;y=lagrange(x0,y0,x);

% clf;把曲线显示在一张图上

fplot(f,[a,b],'co');

hold on;

plot(x,y,'b--');

xlabel('x') ;ylabel('y=f(x)o and y=ln(x)--');

elseif(Nb==2)

x0=linspace(a,b,Nd+1);y0=feval(f,x0);

x=a:0.1:b;

cs=spline(x0,y0);y=ppval(cs,x);

% clf;把曲线显示在一张图上

fplot(f,[a,b],'co');

hold on;

plot(x,y,'k-');

xlabel('x');ylabel('y=f(x) o and y=spline(x)-'); end

%

function y=lagrange(x0,y0,x)

%Lagrange插值

n=length(x0);

m=length(x);

for i=1:m

z=x(i);

s=0.0;

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=s+p*y0(k);

end

y(i)=s;

end

相关文档
最新文档