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