牛顿插值与三次样条插值对比分析

本文通过代码实现牛顿插值和三次样条插值,并绘制插值结果图,对比分析两种插值方法的优缺点。

代码实现:

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; %关闭保持图像状态
function y =lagrange (x0,y0,x) %定义拉格朗日插值函数,输入已知数据的x坐标、y坐标和需要插值的x坐标,输出插值的y坐标
m=length(x); %需要插值的x坐标个数
n=length(x0); %已知数据个数
for i=1:m %逐个计算需要插值的x坐标的y坐标
     z=x(i); %取出一组需要插值的x坐标
    s=0; %初始化插值的y坐标
   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=p*y0(k)+s; %将每一项相加得到插值的y坐标
     end
y(i)=s; %将插值的y坐标存入结果向量中
end
clear; clc; clf;

% 定义函数
x0=[-1:0.02:1];
y0=1./(1+25*x0.^2);

% 绘制原始函数
plot(x0,y0,'b');
hold on;

% 计算并绘制拉格朗日插值多项式
for i=[11,21]
    x1=linspace(-1,1,i);
    y1=1./(1+25*x1.^2);
    y0=lagrange(x1,y1,x0);
    plot(x0,y0,'--');
end

legend('原始函数','拉格朗日插值(11个节点)','拉格朗日插值(21个节点)');
title('拉格朗日插值多项式');
xlabel('x');
ylabel('y');
hold off;

结论:

该代码实现了对一个给定函数进行牛顿插值和三次样条插值,并绘制了插值结果和插值节点处的函数值在同一张图上。在插值节点处,两种插值方法的结果是相同的。随着插值节点数的增加,插值函数的拟合效果越来越好,但是在插值节点之外的区域,牛顿插值多项式的振荡现象明显,而三次样条插值函数的拟合效果更为平滑。因此,三次样条插值方法通常比牛顿插值方法更可靠。

分析:

  • 牛顿插值是一种基于差商的多项式插值方法,其插值多项式的次数与插值节点的个数相同。当插值节点数较少时,牛顿插值多项式能够较好地拟合函数。但是,当插值节点数较多时,牛顿插值多项式的次数会很高,容易出现振荡现象,导致插值结果失真。
  • 三次样条插值是一种分段三次多项式插值方法,它在每个插值节点处使用三次多项式来拟合函数,并保证插值函数及其一阶导数在节点处连续。由于三次样条插值函数的次数较低,而且能够保证函数在节点处连续,因此其拟合效果通常比牛顿插值多项式更加平滑,也更可靠。

总结:

在实际应用中,选择插值方法需要根据具体情况进行考虑。如果需要对函数进行高精度的拟合,并且插值节点数较少,那么可以选择牛顿插值方法。如果需要对函数进行平滑的拟合,并且插值节点数较多,那么可以选择三次样条插值方法。


原文地址: https://www.cveoy.top/t/topic/n4pV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录