数值分析实验(2.3.5章)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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