📅  最后修改于: 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
利用阶差矩阵计算插值多项式在指定点的函数值。