Matlab 牛顿插值与三次样条插值比较

本代码使用 Matlab 实现对已知数据点的四次牛顿插值多项式和三次样条插值函数的求解,并进行比较。

代码:

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. 数据准备:

    • 首先,定义已知数据点的横坐标值 x1 和纵坐标值 y1
    • 计算数据点的数量 n 和差商 cc 存储了用于构建牛顿插值多项式的系数。
  2. 牛顿插值多项式求解:

    • 使用符号计算工具箱 syms 定义符号变量 x,用于表示插值多项式的自变量。
    • 定义两个符号向量 dfd,分别存储牛顿插值多项式的每一项的导数和每一项的系数。
    • 通过 for 循环,逐项计算牛顿插值多项式的导数 df 和系数 d
    • 使用 sum 函数求和得到最终的牛顿插值多项式 P4,并使用 vpa 函数保留小数点后 5 位数。
  3. 三次样条插值函数求解:

    • 使用 Matlab 自带的三次样条插值函数 csape 求解三次样条插值函数 pp,并将其系数存储在 q 中。
  4. 绘图:

    • 使用 ezplot 函数绘制牛顿插值多项式 P4 的图像,并指定绘图区间。
    • 使用 fnval 函数计算三次样条插值函数 pp 在指定点 x2 上的值,并绘制其图像。
    • 使用绿色圆点标出三次样条插值函数在数据点处的函数值。

总结:

本代码通过 Matlab 代码实现了对已知数据点的四次牛顿插值多项式和三次样条插值函数的求解,并进行了比较,并提供了详细的代码解析。

注意:

  • 需安装 Matlab 符号计算工具箱才能使用符号变量和符号函数。
  • 代码中部分变量名和注释以英文形式展示,方便理解。
  • 代码中的 vpa 函数用于保留小数点后 5 位数,可以通过修改参数值来调整保留的小数位数。
  • 代码中使用 hold onhold off 函数来控制绘图叠加,方便对比不同插值函数的图像。
Matlab 牛顿插值与三次样条插值比较

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

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