MATLAB: 牛顿插值与三次样条插值比较
本代码使用 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 次牛顿插值多项式和三次样条插值函数,并以图像方式展示二者的比较结果。结果表明,牛顿插值多项式在插值点附近表现良好,但在插值点之间则会出现明显的振荡现象。而三次样条插值函数则能够在插值点之间保持较好的平滑度,更适合用于实际应用。
相关资源:
原文地址: https://www.cveoy.top/t/topic/n1Qv 著作权归作者所有。请勿转载和采集!