参考原文链接https://blog.csdn.net/m0_54563743/article/details/116096015
第四章 插值法与曲线拟合
4.1、拉格朗日插值法
拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值.
就是给定些“点”,可以找到一个式子,把这些点穿起来
-
线性插值(两点插值)(两点确定一条直线)
-
(x0 , y0)、(x1 , y1)
-
用中学学过的直线方程的求解方法把这条直线表示出来。
-
再将直线方程写为插值基函数×函数值的形式。
L 1 ( x ) = y 0 x − x 1 x 0 − x 1 + y 1 x − x 0 x 1 − x 0 L_{1}(x) = y_0\frac{x-x_1}{x_0-x_1} + y_1\frac{x-x_0}{x_1-x_0} L1(x)=y0x0−x1x−x1+y1x1−x0x−x0
-
-
三点插值公式的推导(抛物线插值):待定系数法
-
(x1 , y1),(x2 , y2),(x3 , y3)。这三点不在同一条直线上,则它们可以确定一条抛物线
-
设抛物线的方程为:
y = a x 2 + b x + c y = ax^2+bx+c y=ax2+bx+c -
将这三个点代入该方程中有:
{ a x 1 2 + b x 1 + c = y 1 a x 2 2 + b x 2 + c = y 2 a x 3 2 + b x 3 + c = y 3 \left\{ \begin{array}{c} ax_1^2+bx_1+c=y_1\\ ax_2^2+bx_2+c=y_2\\ ax_3^2+bx_3+c=y_3 \end{array} \right. ⎩ ⎨ ⎧ax12+bx1+c=y1ax22+bx2+c=y2ax32+bx3+c=y3 -
其中x1、x2、x3、y1、y2、y3是已知量,将a,b,c当作未知量。写成矩阵乘法的形式(3×3 × 3×1==>3×1),如下所示:
[ x 1 2 x 1 1 x 2 2 x 2 1 x 3 2 x 3 1 ] [ a b c ] = [ y 1 y 2 y 3 ] \left[\begin{matrix} x_1^2 & x_1 & 1\\ x_2^2 & x_2 & 1\\ x_3^2 & x_3 & 1\\ \end{matrix}\right]\left[\begin{matrix} a\\ b\\ c\\ \end{matrix}\right]= \left[\begin{matrix} y_1\\ y_2\\ y_3\\ \end{matrix}\right] ⎣ ⎡x12x22x32x1x2x3111⎦ ⎤⎣ ⎡abc⎦ ⎤=⎣ ⎡y1y2y3⎦ ⎤ -
等式两边同时左乘A的逆后再同时左乘[x2 , x , 1],即可得到该抛物线的方程。
- 在这里解释一下为什么左乘[x2 , x , 1],因为这样一乘就可以直接得出该抛物线方程的表达式:1×3 × 3×1 ==>式子
因此该抛物线方程可以写成如下形式,(求逆的时候我用的方法是有伴随除以行列式)
A − 1 = A ∗ ∣ A ∣ A^{-1} = \frac{A^*}{|A|} A−1=∣A∣A∗y = [ x 2 x 1 ] ∗ [ x 2 − x 3 − ( x 1 − x 3 ) x 1 − x 2 − ( x 2 2 − x 3 3 ) ( x 1 2 − x 3 2 ) − ( x 1 2 − x 2 2 ) x 2 x 3 ( x 2 − x 3 ) − x 1 x 3 ( x 1 − x 3 ) x 1 x 2 ( x 1 − x 2 ) ] ∗ 1 ∣ A ∣ ∗ [ y 1 y 2 y 3 ] y= \left[\begin{matrix} x^2 & x & 1\\ \end{matrix}\right] * \left[\begin{matrix} x_2-x_3 & -(x_1-x_3) & x_1-x_2\\ -(x_2^2-x_3^3) & (x_1^2-x_3^2) & -(x_1^2-x^2_2)\\ x_2x_3(x_2-x_3) & -x_1x_3(x_1-x_3) & x_1x_2(x_1-x_2)\\ \end{matrix}\right] * \frac{1}{|A|} * \left[\begin{matrix} y_1\\ y_2\\ y_3\\ \end{matrix}\right] y=[x2x1]∗⎣ ⎡x2−x3−(x22−x33)x2x3(x2−x3)−(x1−x3)(x12−x32)−x1x3(x1−x3)x1−x2−(x12−x22)x1x2(x1−x2)⎦ ⎤∗∣A∣1∗⎣ ⎡y1y2y3⎦ ⎤
-
接下来就是计算这个乘法,首先用左边的行向量乘A*,结果记为L(一行三列的向量)。
-
L = [ x 2 ( x 2 − x 3 ) − x ( x 2 2 − x 3 2 ) + x 2 x 3 ( x 2 − x 3 ) − x 2 ( x 1 − x 3 ) + x ( x 1 2 − x 3 2 ) − x 1 x 3 ( x 1 − x 3 ) x 2 ( x 1 − x 2 ) − x ( x 1 2 − x 2 2 ) + x 1 x 2 ( x 1 − x 2 ) ] L= \left[\begin{matrix} x^2(x_2-x_3)-x(x_2^2-x_3^2)+x_2x_3(x_2-x_3) & -x^2(x_1-x_3)+x(x_1^2-x_3^2)-x_1x_3(x_1-x_3) & x^2(x_1-x_2)-x(x_1^2-x^2_2)+x_1x_2(x_1-x_2)\\ \end{matrix}\right] L=[x2(x2−x3)−x(x22−x32)+x2x3(x2−x3)−x2(x1−x3)+x(x12−x32)−x1x3(x1−x3)x2(x1−x2)−x(x12−x22)+x1x2(x1−x2)]
提取公因子后将L化简为如下对称的形式:
L = [ ( x 2 − x 3 ) ( x − x 2 ) ( x − x 3 ) ( x 3 − x 1 ) ( x − x 3 ) ( x − x 1 ) ( x 1 − x 2 ) ( x − x 1 ) ( x − x 2 ) ] L= \left[\begin{matrix} (x_2-x_3)(x-x_2)(x-x_3) & (x_3-x_1)(x-x_3)(x-x_1) & (x_1-x_2)(x-x_1)(x-x_2)\\ \end{matrix}\right] L=[(x2−x3)(x−x2)(x−x3)(x3−x1)(x−x3)(x−x1)(x1−x2)(x−x1)(x−x2)] -
此时该抛物线的方程可以表示为如下形式:
-
y = L ∗ 1 ∣ A ∣ ∗ [ y 1 y 2 y 3 ] y = L*\frac{1}{|A|}* \left[\begin{matrix} y_1\\ y_2\\ y_3\\ \end{matrix}\right] y=L∗∣A∣1∗⎣ ⎡y1y2y3⎦ ⎤
-
将系数提到最外面先算两个向量的乘积,此时方程形式为:
-
y = y 1 ∗ ( x 2 − x 3 ) ( x − x 2 ) ( x − x 3 ) ∣ A ∣ + y 2 ∗ ( x 3 − x 1 ) ( x − x 3 ) ( x − x 1 ) ∣ A ∣ + y 3 ∗ ( x 1 − x 2 ) ( x − x 1 ) ( x − x 2 ) ∣ A ∣ y= y_1*\frac{(x_2-x_3)(x-x_2)(x-x_3)}{|A|}+y_2*\frac{(x_3-x_1)(x-x_3)(x-x_1)}{|A|}+y_3*\frac{(x_1-x_2)(x-x_1)(x-x_2)}{|A|} y=y1∗∣A∣(x2−x3)(x−x2)(x−x3)+y2∗∣A∣(x3−x1)(x−x3)(x−x1)+y3∗∣A∣(x1−x2)(x−x1)(x−x2)
-
求行列式的值时根据有y(x1) = y1,所以把x1代入上式可以发现后两项的值均为零。即可得如下关系
-
y 1 = y 1 ∗ ( x 2 − x 3 ) ( x 1 − x 2 ) ( x 1 − x 3 ) ∣ A ∣ y_1 = y_1*\frac{(x_2-x_3)(x_1-x_2)(x_1-x_3)}{|A|} y1=y1∗∣A∣(x2−x3)(x1−x2)(x1−x3)
-
所以可以直接得到行列式的值为:
-
∣ A ∣ = ( x 2 − x 3 ) ( x 1 − x 2 ) ( x 1 − x 3 ) |A|=(x_2-x_3)(x_1-x_2)(x_1-x_3) ∣A∣=(x2−x3)(x1−x2)(x1−x3)
-
不放心的话也很好验证,用线代里面行列式的解法算一下就可以了。
-
此时就可以把|A|代入抛物线的方程中,发现每个分子都可以和分母约掉一项。
-
所以最后就得到了该抛物线的方程为:
-
y = y 1 ∗ ( x − x 2 ) ( x − x 3 ) ( x 1 − x 2 ) ( x 1 − x 3 ) + y 2 ∗ ( x − x 3 ) ( x − x 1 ) ( x 2 − x 1 ) ( x 2 − x 3 ) + y 3 ∗ ( x − x 1 ) ( x − x 2 ) ( x 3 − x 1 ) ( x 3 − x 2 ) y= y_1*\frac{(x-x_2)(x-x_3)}{(x_1-x_2)(x_1-x_3)}+y_2*\frac{(x-x_3)(x-x_1)}{(x_2-x_1)(x_2-x_3)}+y_3*\frac{(x-x_1)(x-x_2)}{(x_3-x_1)(x_3-x_2)} y=y1∗(x1−x2)(x1−x3)(x−x2)(x−x3)+y2∗(x2−x1)(x2−x3)(x−x3)(x−x1)+y3∗(x3−x1)(x3−x2)(x−x1)(x−x2)
-
其中在约分的时候可能出现一些正负号的问题。如第二项约分时(x1-x3)与(x3-x1)差个符号,这时可以调整分母的(x1-x2)变为(x2-x1),保持形式的一致。这就是三点插值的公式的推导过程。
-