本代码使用 MATLAB 实现基于五个插值点的 4 次牛顿插值多项式和三次样条插值函数,并将其在图像中进行比较。

首先,定义了插值点的横纵坐标 'x1', 'y1',并计算出差商 'c',用于求解牛顿插值多项式。

然后,定义了符号变量 'x',并利用差商和 'x1' 求解出牛顿插值多项式 'P4'。

接着,调用了 MATLAB 自带的三次样条插值函数 'csape',并将其结果存储在变量 'pp' 中。

最后,利用 'ezplot' 函数将牛顿插值多项式和三次样条插值函数的图像进行比较。同时,还绘制了样条插值点的图像,并用绿色的圆点标注出来。

代码:

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(:);
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);
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) %P4即为4次牛顿插值多项式,并保留小数点后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;

解释:

  • 代码行 1-4: 清除工作区、命令窗口和图形窗口。
  • 代码行 5-6: 定义插值点的横纵坐标 'x1' 和 'y1'。
  • 代码行 7-13: 计算差商 'c',用于求解牛顿插值多项式。
  • 代码行 14-19: 定义符号变量 'x',并利用差商和 'x1' 求解出牛顿插值多项式 'P4'。
  • 代码行 20: 调用 MATLAB 自带的三次样条插值函数 'csape',并将其结果存储在变量 'pp' 中。
  • 代码行 21-24: 利用 'ezplot' 函数将牛顿插值多项式和三次样条插值函数的图像进行比较。
  • 代码行 25-29: 绘制样条插值点的图像,并用绿色的圆点标注出来。
  • 代码行 30: 设置图形标题。

结论:

本代码成功实现了基于五个插值点的 4 次牛顿插值多项式和三次样条插值函数,并以图像方式展示二者的比较结果。结果表明,牛顿插值多项式在插值点附近表现良好,但在插值点之间则会出现明显的振荡现象。而三次样条插值函数则能够在插值点之间保持较好的平滑度,更适合用于实际应用。

相关资源:

MATLAB: 牛顿插值与三次样条插值比较

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

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