插值与龙格现象
在区间[-1,1]上对函数 ,选取不同的插值节点构造插值多项式,比较他们的误差。
(1) 取等距节点,n=5,10,15,20。
(2) 取节点 ,k=0,1,2,…n;分别取n=5,10,15,20能有什么样的结论。
1.数学原理:
1.1、拉格朗日(Lagrange)插值原理
拉格朗日(Lagrange)插值公式的基本思想是把的构造问题转化为n+1个插值基函数 。首先我们利用节点直接构造如下多项式:
其中
,
容易验证该多项式具有性质
既满足插值条件。我们称 为拉格朗日插值多项式, 称为拉格朗日插值函数。
1.2、截断误差的实用估计式
上式公式估计误差时不实用,实际中实用估计式应该用如下方法:
假设插值条件中包含n+2组数据
那么利用n+1组数据我们可以构造一个n次拉格朗日插值多项式 ,利用后n+1组数据我们可以构造另一个n次拉格朗日插值多项式 。利用公式(4.1)知,他们各自的插值余项为
两式相减得
并可写成
注意到上式中利用 该条件在很多情况下是成立的。
利用上式可得
上式给出了用 或 作近似计算时的实用误差估计式,它不需要计算高阶导数,也不用估计插值区间上高阶导数的界。
总之,拉格朗日插值法的公式结构紧凑,在理论分析中十分方便,然而在计算中,但插值点增加或减少时,所对应的基本多项式就得重新计算而且图像发生很大变化。像逐次线性插值法、牛顿插值法等都是在拉格朗日插值多项式的基础上延伸出来的。我们根据实际中的具体问题,为减少插值误差来选取相应的插值法来快速的解决问题。
2.结果分析和讨论:
图1.1
由上图可以看出随着等分值n的值增大拟合精度会越来越小,但是在函数的两边值会出现巨变,这也就是所谓的龙格现象。
图1.2
由图1.2可以得出,当取节点 ,k=0,1,2,…n时,随着等分值n的增加,拟合现象会越来越好,并且没有出现龙格现象,故改变节点的值可以避免龙格现象。
3.程序设计:
(1)取等距节点,n=5,10,15,20.
%x0、y为被插值函数变量,n为等分数,x(k)为插值点,W_x为Li(x)的分子乘(x-x(j),W1_x为Li(x)的分母,Ln_x为插值函数多项式
syms x0 x1 y x n x_para
x0=-1:0.02:1;%作为画图的点
y=1./(1+25.*(x0.^2));
for n=[5,10,15,20]
k=0:n; %k的范围从0到n,共n+1项
x(k+1)=-1+2*k/n; %从x(1)到x(n+1),共n+1项,即从第0点到第n点
for i=1:(n+1) %共k+1项
part_x(i)=(x_para-x(i)); %每个因式的组成,共k+1种
end
for i=1:(n+1) %共k+1项
W1_x(i)=1;
for j=1:(n+1)
if i~=j
W1_x(i)=W1_x(i)*(x(i)-x(j)); %每个因式的组成,共k+1种
end
end
end
W_x(n+1)=prod(part_x); %累乘函数求w_x
for j=1:(n+1)
ln_x(j)=(1/(1+25*(x(j)^2))) * W_x(n+1) / ( (x_para-x(j))*(W1_x(j)) );
end
Ln_x=sum(ln_x);
x_vector=-0.99:0.008:0.99;
Ln_x=subs(Ln_x,x_para,x_vector);
m=n/5;
subplot(2,2,m);plot(x0,y);
hold on
subplot(2,2,m);plot(x_vector,Ln_x);
legend ('被插值函数','插值函数')
ylabel('f(x) and Ln(x) ');
end
(2)取节点,k=0,1,2,…n;分别取n=5,10,15,20能有什么样的结论。
%x0、y为被插值函数变量,n为等分数,x(k)为插值点,W_x为Li(x)的分子乘(x-x(j),W1_x为Li(x)的分母,Ln_x为插值函数多项式
syms x0 x1 y x n x_para
x0=-1:0.02:1;%作为画图的点
y=1./(1+25.*(x0.^2));
for n=[5,10,15,20]
k=0:n; %k的范围从0到n,共n+1项
x(k+1)=cos(k*3.1415926/n); %从x(1)到x(n+1),共n+1项,即从第0点到第n点
for i=1:(n+1) %共k+1项
part_x(i)=(x_para-x(i)); %每个因式的组成,共k+1种
end
for i=1:(n+1) %共k+1项
W1_x(i)=1;
for j=1:(n+1)
if i~=j
W1_x(i)=W1_x(i)*(x(i)-x(j)); %每个因式的组成,共k+1种
end
end
end
W_x(n+1)=prod(part_x); %累乘函数求w_x
for j=1:(n+1)
ln_x(j)=(1/(1+25*(x(j)^2))) * W_x(n+1) / ( (x_para-x(j))*(W1_x(j)) );
end
Ln_x=sum(ln_x);
x_vector=-0.99:0.008:0.99;
Ln_x=subs(Ln_x,x_para,x_vector);
m=n/5;
subplot(2,2,m);plot(x0,y);
hold on
subplot(2,2,m);plot(x_vector,Ln_x);
legend ('被插值函数','插值函数')
ylabel('f(x) and Ln(x) ');
end
如需要代码请在此链接下下载:https://download.csdn.net/download/weixin_41788456/10854164
如有志同者请发邮箱chenshuai0614@hrbeu.edu.cn联系我!