介绍了拉格朗日插值法,通过一组点计算一个经过这些点的多项式,并提供了Python代码示例。
Lagrange 插值是一种用于计算通过一组 n 个点的多项式的技术。
考虑如果我们有两个点,可以用一条直线来插值它们。例如,给定 (1,1) 和 (2,2),我们可以画一条穿过这两个点的直线,它将是一个 1 次多项式 y=x。
现在考虑如果我们有一个点,可以通过这个点画一条 0 次多项式的直线。例如,如果点是 (3,5),我们可以通过它画一条直线 y=5(这是一个 0 次多项式)。
我们可以用至多 n-1 次多项式“通过”n 个点的模式适用于任意数量的点。例如,点 (0,0),(1,1),(2,4) 可以用 y=x² 插值。如果这些点恰好是一条直线,例如 (0,0),(1,1),(2,2),那么我们可以用 1 次多项式 y=x 通过 (1,1) 和 (2,2) 画一条直线,但通常情况下,三个点不会共线,因此我们需要一个 2 次多项式来穿过所有点。
出于我们的目的,了解如何计算这个多项式并不重要,因为有数学库可以为我们完成。最常用的算法是 Lagrange 插值,我们展示了如何在 Python 中实现它。
我们可以使用 Lagrange 插值计算一个多项式 p(x),它通过点 (1,4),(2,8),(3,2),(4,1)。
from scipy.interpolate import lagrange
x_values = [1, 2, 3, 4]
y_values = [4, 8, 2, 1]
print(lagrange(x_values, y_values))
## 3 2
## 2.5 x - 20 x + 46.5 x - 25
让我们使用与之前相同的多项式,但这次我们将使用有限域 F17 而不是浮点数。
import galois
import numpy as np
GF17 = galois.GF(17)
xs = GF17(np.array([1,2,3,4]))
ys = GF17(np.array([4,8,2,1]))
p = galois.lagrange_poly(xs, ys)
assert p(1) == GF17(4)
assert p(2) == GF17(8)
assert p(3) == GF17(2)
assert p(4) == GF17(1)
回到我们之前的点 (1,1),(2,2) 的示例,插值它们的最低次多项式是 y=x。一般来说,
对于一组 n 个点,存在一个唯一的最低次多项式,其次数最多为 n-1,可以插值这些点。
插值这些点的最低次多项式有时称为 Lagrange 多项式。
其结果是,
如果我们使用点 (1,2,…,n) 作为 x 值,通过 Lagrange 插值将一个长度为 n 的向量转换为多项式,那么所得到的多项式是唯一的。
换句话说,给定一个一致的 x 值基来插值一个向量,存在一个唯一的多项式来插值给定的向量。换句话说,每个长度为 n 的向量都有一个唯一的多项式表示。
非正式地,每个 n 次向量都有一个唯一的 n-1 次多项式“表示”它。如果点共线等,次数可能会更少,但向量将是唯一的。
“最低次”部分非常重要。给定两个点,有极多的多项式通过这两个点——但最低次多项式是唯一的。
- 原文链接: rareskills.io/post/pytho...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!