📜  牛顿的除法插值公式(1)

📅  最后修改于: 2023-12-03 14:56:12.701000             🧑  作者: Mango

牛顿的除法插值公式

牛顿的除法插值公式是一种用于插值多项式的方法,由牛顿所提出。这个方法的优点是计算简单且可适用于任何次数的插值问题。

公式

牛顿的除法插值公式的一般形式如下:

$$ P_n(x) = f[x_0] + f[x_0,x_1]\cdot(x-x_0) + f[x_0,x_1,x_2]\cdot(x-x_0)\cdot(x-x_1) +\cdots + f[x_0,x_1,\cdots,x_n]\cdot(x-x_0)\cdot(x-x_1)\cdots(x-x_{n-1}) $$

其中,$f[x_0,x_1,\cdots,x_i]$ 是阶差,表示 $f(x)$ 在点 $x_0,\cdots,x_i$ 处的差商,公式如下:

$$ f[x_i] = f(x_i) $$

$$ f[x_i,x_{i+1},\cdots,x_{i+m}] =\frac{f[x_{i+1},\cdots,x_{i+m}] - f[x_i,\cdots,x_{i+m-1}]}{x_{i+m} - x_i} $$

当 $m=0$ 时,$f[x_i]$ 表示一次阶差,当 $m=1$ 时,$f[x_i,x_{i+1}]$ 表示二次阶差,依次类推。

代码实现

下面是 Python 语言实现牛顿的除法插值公式的示例代码:

from typing import List

def newton_divided_difference(x: List[float], y: List[float]) -> List[List[float]]:
    """
    计算阶差矩阵
    :param x: 插值节点 x 坐标列表
    :param y: 插值节点 y 坐标列表
    :return: 阶差矩阵
    """
    n = len(x)
    r = [[0.0 for j in range(n)] for i in range(n)] # 初始化阶差矩阵
    # 填充一阶差
    for i in range(n):
        r[i][0] = y[i]
    # 填充其余阶差
    for j in range(1, n):
        for i in range(j, n):
            r[i][j] = (r[i][j-1] - r[i-1][j-1]) / (x[i] - x[i-j])
    return r

def newton_interpolation(x: List[float], y: List[float], z: float) -> float:
    """
    计算牛顿插值多项式在 z 处的函数值
    :param x: 插值节点 x 坐标列表
    :param y: 插值节点 y 坐标列表
    :param z: 待求点的 x 坐标
    :return: 函数值
    """
    n = len(x)
    r = newton_divided_difference(x, y)
    p = r[0][0]
    for i in range(1, n):
        s = 1
        for j in range(i):
            s *= (z - x[j])
        p += r[i][i] * s
    return p

函数 newton_divided_difference 计算阶差矩阵,函数 newton_interpolation 利用阶差矩阵计算插值多项式在指定点的函数值。

参考资料
  1. Quarteroni A, Sacco R, Saleri F. Numerical Mathematics (Texts in Applied Mathematics). Springer; 2010.
  2. Burden RL, Faires JD. Numerical Analysis, 10th Edition. Cengage Learning; 2015.
  3. 《算法设计与分析(第三版)》(王晓东等),高等教育出版社,2012 年。