北京网站推广营销服务电话,做购物网站的步骤,做网站的工作有发展空间没有,视频素材网站推荐多项式插值#xff08;数值计算方法#xff09;Matlab实现 一. 原理介绍二. 程序设计1. 构建矩阵2. 求解矩阵方程3. 作出多项式函数4. 绘制插值曲线5. 完整代码 三. 图例 一. 原理介绍
关于插值的定义及基本原理可以参照如下索引 插值原理#xff08;数值计算方法#xff… 多项式插值数值计算方法Matlab实现 一. 原理介绍二. 程序设计1. 构建矩阵2. 求解矩阵方程3. 作出多项式函数4. 绘制插值曲线5. 完整代码 三. 图例 一. 原理介绍
关于插值的定义及基本原理可以参照如下索引 插值原理数值计算方法前面已经介绍过插值原理的唯一性表述对于分立的数据点方程组 P ( x 0 ) y 0 ⇒ a 0 a 1 x 0 a 2 x 0 2 ⋯ a n x 0 n y 0 , P ( x 1 ) y 1 ⇒ a 0 a 1 x 1 a 2 x 1 2 ⋯ a n x 1 n y 1 , ⋮ P ( x n ) y n ⇒ a 0 a 1 x n a 2 x n 2 ⋯ a n x n n y n . \begin{aligned} P(x_0) y_0 \quad \Rightarrow \quad a_0 a_1 x_0 a_2 x_0^2 \cdots a_n x_0^n y_0, \\ P(x_1) y_1 \quad \Rightarrow \quad a_0 a_1 x_1 a_2 x_1^2 \cdots a_n x_1^n y_1, \\ \quad \vdots \\ P(x_n) y_n \quad \Rightarrow \quad a_0 a_1 x_n a_2 x_n^2 \cdots a_n x_n^n y_n. \end{aligned} P(x0)y0⇒a0a1x0a2x02⋯anx0ny0,P(x1)y1⇒a0a1x1a2x12⋯anx1ny1,⋮P(xn)yn⇒a0a1xna2xn2⋯anxnnyn.
恒有解多项式插值的目标即为在这一过程中求解系数 a 0 、 a 1 、 . . . 、 a n ⟺ [ a 0 a 1 a 2 ⋮ a n ] a_0、a_1、...、a_n\Longleftrightarrow\begin{bmatrix} a_0 \\ a_1 \\ a_2 \\ \vdots \\ a_n \end{bmatrix} a0、a1、...、an⟺ a0a1a2⋮an
即解方程组 [ 1 x 0 x 0 2 ⋯ x 0 n 1 x 1 x 1 2 ⋯ x 1 n ⋮ ⋮ ⋮ ⋱ ⋮ 1 x n x n 2 ⋯ x n n ] [ a 0 a 1 a 2 ⋮ a n ] [ y 0 y 1 y 2 ⋮ y n ] . \begin{bmatrix} 1 x_0 x_0^2 \cdots x_0^n \\ 1 x_1 x_1^2 \cdots x_1^n \\ \vdots \vdots \vdots \ddots \vdots \\ 1 x_n x_n^2 \cdots x_n^n \end{bmatrix} \begin{bmatrix} a_0 \\ a_1 \\ a_2 \\ \vdots \\ a_n \end{bmatrix} \begin{bmatrix} y_0 \\ y_1 \\ y_2 \\ \vdots \\ y_n \end{bmatrix}. 11⋮1x0x1⋮xnx02x12⋮xn2⋯⋯⋱⋯x0nx1n⋮xnn a0a1a2⋮an y0y1y2⋮yn .
关于该方程组的解法在线性代数中有多种这里主要提及两种 ①高斯消元法 ②克莱姆法则 程序设计过程中一般有封装好的库函数如果为了考虑减少库依赖和提高程序运行效率及占用可能会用到上述方法这里就不详细展开了 二. 程序设计
1. 构建矩阵
% 构造Vandermonde矩阵A
A zeros(n, n);
for i 1:nfor j 1:nA(i, j) x_data(i)^(j-1); % Vandermonde矩阵end
endⅠ 构建一个 ( n × n ) (n \times n) (n×n)的矩阵 A 来描述多项式矩阵 [ 1 x 0 x 0 2 ⋯ x 0 n 1 x 1 x 1 2 ⋯ x 1 n ⋮ ⋮ ⋮ ⋱ ⋮ 1 x n x n 2 ⋯ x n n ] \begin{bmatrix} 1 x_0 x_0^2 \cdots x_0^n \\ 1 x_1 x_1^2 \cdots x_1^n \\ \vdots \vdots \vdots \ddots \vdots \\ 1 x_n x_n^2 \cdots x_n^n \end{bmatrix} 11⋮1x0x1⋮xnx02x12⋮xn2⋯⋯⋱⋯x0nx1n⋮xnn
其中 A [ i ] [ j ] x i j − 1 A[i][j] x_{i}^{j-1} A[i][j]xij−1
式中第一列的1是通过 x i 0 x_{i}^{0} xi0得到的。
y_data data(:, 2);Ⅱ 构建系数矩阵 B即原始数据对应的 y 值
2. 求解矩阵方程
% 解线性方程组 A * coefficients y_data
coefficients A \ y_data;注释该部分通过反斜杠运算符 \ 计算线性方程组 A ⋅ c o e f f i c i e n t s y d a t a A ⋅ coefficients y_data A⋅coefficientsydata的解。 ①当方程组超定时方程数大于未知数个数返回最小二乘解即最小化残差平方和 ∥ A ⋅ c o e f f i c i e n t s − y d a t a ∥ 2 ∥ A ⋅ coefficients − y_{data} ∥^2 ∥A⋅coefficients−ydata∥2 ②当方程组适定时返回精确解 ③当方程组欠定时返回最小范数解。 求解出矩阵形式形如 6.0000 -7.8333 4.5000 -0.6667 从上至下为最低次项到最高次项系数 3. 作出多项式函数
% 生成插值多项式的x和y值
x_vals linspace(min(x_data) - 1, max(x_data) 1, 500);
y_vals polyval(flip(coefficients), x_vals); % 计算插值多项式的y值注释: 前面注释提到coefficients数组中的系数对应从左到右为最低到最高次项系数而函数polyval()要求输入具有逆序的项系数flip函数将系数的顺序反转将变为从最高次到最低次项系数 y_vals polyval(flip(coefficients), x_vals) 将计算每一个 x_val 对应的多项式值并返回一个 y_vals 数组包含每个 x_val 对应的 y 值。 4. 绘制插值曲线
% 绘制插值曲线
figure;
plot(x_vals, y_vals, b-, DisplayName, 插值曲线);
hold on;
scatter(x_data, y_data, ro, DisplayName, 数据点);
title(插值多项式);
xlabel(X轴);
ylabel(Y轴);
legend;
grid on;5. 完整代码
% 输入数据 (x, y)
data [1,22,33,54,4
];% 提取x和y值
x_data data(:, 1);
y_data data(:, 2);
n length(data);% 构造Vandermonde矩阵A
A zeros(n, n);
for i 1:nfor j 1:nA(i, j) x_data(i)^(j-1); % Vandermonde矩阵end
end% 解线性方程组 A * coefficients y_data
coefficients A \ y_data;% 输出插值多项式的系数
disp(插值多项式的系数:);
disp(coefficients);% 生成插值多项式的x和y值
x_vals linspace(min(x_data) - 1, max(x_data) 1, 500);
y_vals polyval(flip(coefficients), x_vals); % 计算插值多项式的y值% 绘制插值曲线
figure;
plot(x_vals, y_vals, b-, DisplayName, 插值曲线);
hold on;
scatter(x_data, y_data, ro, DisplayName, 数据点);
title(插值多项式);
xlabel(X轴);
ylabel(Y轴);
legend;
grid on;三. 图例 这要求我们的输入数据都具有上述形式
data [x_1, y_1x_2, y_2x_3, y_3x_4, y_4...]最后我们插值一组随机生成的测试数据
data [7.264384, 3.9312921.943873, 6.2189038.384019, 2.5841035.672210, 9.0326740.294315, 4.7260186.129531, 7.9128469.516347, 1.4782643.824679, 5.596042
]实际应用时应避免数据点过多导致的多项式次数过高 希望能够帮到迷途之中的你知识有限如有学术错误请及时指正感谢大家的阅读
(^^)▽ ▽(^^)