牛顿插值和三次样条插值比较:龙格现象及应用场景分析
该程序通过牛顿插值和三次样条插值两种方法对给定的数据点进行插值,并绘制了插值函数的图像。通过观察插值函数的图像可以得到以下结论:
-
牛顿插值多项式和三次样条插值函数在插值节点处都能很好地拟合数据,但在插值节点之外,样条插值函数的拟合效果更好,更加平滑。
-
在插值节点之外,牛顿插值多项式会出现龙格现象,即插值函数在远离插值节点的地方会出现较大的振荡。
因此,在插值节点之外的区域,建议使用三次样条插值函数来进行插值。
程序代码:
clear; %清空工作区变量
clc; %清空命令窗口
clf; %清空图像窗口
x1=[0.2 0.4 0.6 0.8 1.0]; %给定的插值节点
y1=[0.98 0.92 0.81 0.64 0.38]; %给定的插值节点处的函数值
n=length(y1); %插值节点的个数
c=y1(:); %将y1列向量化
for j=2:n %求插值节点处的差商
for i=n:-1:j
c(i)=(c(i)-c(i-1))/(x1(i)-x1(i-j+1));
end
end
syms x df d; %定义符号变量
df(1)=1;d(1)=y1(1); %df和d分别表示插值多项式的差商和系数,初始化
for i=2:n %求解牛顿插值多项式的系数和常数项
df(i)=df(i-1)*(x-x1(i-1));%递推求解差商
d(i)=c(i)*df(i);%递推求解插值多项式系数
end
P4=vpa(sum(d),5) %将插值多项式写成符号表达式,并保留小数点后5位数
pp=csape(x1,y1, 'variational'); %调用三次样条函数,生成样条插值函数
q=pp.coefs; %取出样条插值函数的系数
for i=1:4 %循环计算四段样条插值函数,并打印结果
S=q(i,:)*[(x-x1(i))^3;(x-x1(i))^2;(x-x1(i))^1;(x-x1(i))^0];
S=vpa(collect(S),5)
end
figure %新建一个绘图窗口
ezplot(P4, [0.2,1.08]); %绘制牛顿插值多项式的图像
hold on; %保持图像
x2=0.2:0.08:1.08; %生成更密集的数据点
y2=fnval(pp, x2); %计算样条插值函数在更密集数据点处的函数值
ind=[1,2,11,10]; %选取几个插值节点
y3=fnval(pp,x2(ind)); %计算样条插值函数在选取插值节点处的函数值
plot(x2,y2,'r',x2(ind),y3,'go') %将插值结果和插值节点处的函数值绘制在同一张图上
title('Newton interpolation with deg=4 and cubic splines'); %添加图像标题
hold off; %关闭保持图像状态
结论:
- 当插值节点数量较少或插值区间较小时,牛顿插值方法可以较好地拟合数据。
- 当插值节点数量较多或插值区间较大时,牛顿插值方法容易出现龙格现象,导致插值结果出现较大误差。
- 三次样条插值方法可以有效避免龙格现象,在大多数情况下都能获得较为准确的插值结果。
应用场景:
- 对于插值节点数量较少、插值区间较小的场景,可以使用牛顿插值方法。
- 对于插值节点数量较多、插值区间较大的场景,建议使用三次样条插值方法。
- 在需要对数据进行平滑处理的场景,可以使用三次样条插值方法。
总结:
牛顿插值和三次样条插值是两种常用的插值方法,它们各有优缺点。在实际应用中,应该根据具体的场景选择合适的插值方法。
原文地址: https://www.cveoy.top/t/topic/n4pm 著作权归作者所有。请勿转载和采集!