数值分析仿真报告--插值与拟合

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

2.1:多项式插值的振荡现象

一、 实验问题:

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

2

1

()125f x x =

+

二、 实验内容:

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

21,0,1,2,,i i

x i n n

=-+

=

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

201

()()125n

n i

i i

L x l x x ==+∑

其中,(),0,1,2,,i l x i n =是n 次Lagrange 插值基函数。

三、 实验要求:

(1)选择不断增大的分点数目2,3,

n =,画出原函数()f x 及插值多项式函

数L n (x)在[-1, 1]上的图像,比较并分析实验结果。

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

4

(),()arctan 1x

h x g x x x =

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

四、 仿真结果及分析

1. 2

1

()125f x x =+

由上面12种不同分点数目n 下的插值函数与原函数的拟合图像可以分析得出以下几点结论:

✓ 随着n 的增大,插值多项式在区间中部的拟合情况逐渐趋优,尤其当n 大于

10时,区间中部的插值曲线与原曲线几乎重合;

✓ 随着n 的增大,插值多项式在两端点附近的拟合情况既不是逐渐趋劣,也不

是逐渐趋优,而是呈现不断振荡的特性,且振荡幅度呈现越来越大的趋势; ✓ 并不是n 越大,插值多项式的拟合效果越好。比如n=20时,插值式与原曲

线几乎完美拟合,但当n=25时,两端附近相对误差可大于100%,因此再在实际应用时,应准确把握n 的大小。 2. 4

()1x

f x x =

+ 与21()125f x x =

+,对4

()1x

f x x =+进行拉格朗日多项式插值时,随着n 的增

大,插值多项式函数在区间中部的拟合情况愈来愈好,但是在端点附近的拟合情况会出现振荡的情况,且误差逐渐增大。

3. ()arctan f x x

与前两个函数类似,随着n的增大,插值多项式函数在区间中部的拟合情况愈来愈好,但是在端点附近的拟合情况会出现振荡的情况,且误差逐渐增大。

五、实验小结

往往我们在进行拉格朗日多项式插值时,会错认为分点数目n越大拟合效果会越好,本实验证明随着n的增大,插值多项式函数在区间中部的拟合情况愈来愈好,但是在端点附近的拟合情况会出现振荡的情况,且误差逐渐增大。就整体拟合情况而言,也不是n越大越好,因此在实际应用时应该按某种误差准则(如最小最大偏差)来控制n的大小和断点附近的误差。

六、matlab源码

1. 人机交互模块—函数选择和阶数输入:

clear all; clc;

%函数选择

promps={'请选择试验函数,若选f(x),请输入f,若选h(x),请输入h,若选g(x),请输入g:'}; result = inputdlg(promps,'charpter 2',1,{'f'}); Nb_f = char(result);

if(Nb_f~='f' & Nb_f~='h' & Nb_f~='g') errordlg('试验函数选择错误!');

return;

end

%插值多项式最高阶数输入

result = inputdlg({'请输入插值多项式的次数N:'},'charpter_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

2. 主函数:

%% 多项式插值

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],'k*');hold on;

plot(x,y,'r-','Linewidth',2);

TempLegend = legend('y=f(x)','y=Ln(x)');set(TempLegend,'FontSize',15);title('n=25')

3. Lagrange函数—计算拉格朗日插值函数值

function y = Lagrange(x0,y0,x)

% n为分点个数,m要求的数据个数,x0,y0为样本数组,y为求得的插值多项式函数值数组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

end

相关文档
最新文档