二次样条插值是由二次多项式方程表示的抛物线曲线,可以在曲线上至少已知三个点的情况下生成。二次样条的标准形式意味着样条方程是在空间域中计算的,即在 平面上。假设给定的点是 和 。选择一个起始的二次方程,它以矩阵形式表示如下:
将给定的点代入起始方程中以生成三个方程。它们足以解出三个未知系数 和 。
这三个方程可以像之前一样以矩阵形式写为 :
求解方程以找到系数的值:
系数的值被代入起始方程中,得到样条的方程
找出通过点 和 的二次样条的方程。 选择起始方程
以矩阵形式写出方程
解得
代入起始方程中得到
验证:(见图)。
% 清除工作区和命令窗口
clear all; clc;
% 定义符号变量 x
syms x;
% 指定三个数据点的坐标
x1 = 3; y1 = 2;
x2 = 6; y2 = 5;
x3 = 8; y3 = -4;
% 将数据点的坐标存储在向量 X 和 Y 中
X = [x1, x2, x3];
Y = [y1, y2, y3];
% 构建系数矩阵 C,这是二次样条插值的关键矩阵
C = [1, x1, x1^2; 1, x2, x2^2; 1, x3, x3^2];
% 通过求逆矩阵运算计算系数向量 A
A = inv(C) * Y';
% 提取系数 a、b 和 c
a = A(1);
b = A(2);
c = A(3);
% 显示所需的二次样条方程
fprintf('Required equation : \n');
y = a + b * x + c * x^2;
y = vpa(y) % 使用vpa函数以高精度方式显示结果
% 绘制图形
d = 0.5; % 文本标签的偏移量
% 创建 x 值的范围
xx = linspace(x1 - 2, x3 + 2);
% 计算对应于 x 值的 y 值
yy = subs(y, x, xx);
% 绘制二次样条曲线
plot(xx, yy, 'b-');
hold on;
grid;
% 绘制数据点
scatter(X, Y, 20, 'r', 'filled');
% 添加轴标签和图例
xlabel('x');
ylabel('y');
axis square;
axis tight;
% 在数据点旁边添加标签
text(x1 + d, y1, 'P_1');
text(x2 + d, y2, 'P_2');
text(x3 + d, y3, 'P_3');
hold off;
联系客服