scipy 插值重心拉格朗日

问题描述

我一直在阅读有关插值的不同方法,例如-this article。它建议使用 barycentric_lagrange 而不是拉格朗日,因为它更稳定,运行时间为 O(n) 而不是 O(n^2)。这一切都很好,但我想知道它与拉格朗日本身有何不同。 我正在寻找的是对重心和传统拉格朗日之间差异的定性解释。 我曾尝试查看 mathematical papers 的相关内容,但数学计算并不容易。

“权重”是否只是一种加权接近您正在插入的点的方法?要是这么简单就好了。

解决方法

我通过一些实验发现重心拉格朗日并没有像我希望的那样“加权”点。如果您的输入数组很大(即它仍然试图构造 n 次多项式),它仍然非常不稳定。 当较大时,重心具有稳定性改进。 如果您的 x 和 y 接近 0,拉格朗日是好的。所以 x = [20000,20001,20002] 将远不如 [0,1,2] 稳定。因此,重心中的权重只是将值缩放到 0 的一种方式。 所以拉格朗日插值如下:

x_scaled = x - x[0]
y_scaled = y - y[0]
polynomial = scipy.lagrange(x_scaled,y_scaled)
interp_y = polynomial(interp_x - x[0]) + y[0]

等同于:

interp_y = scipy.barycentric_interpolate(x,y,interp_x)

很明显,第二个在代码中实现要容易得多,而且它们给出了相同的结果。