3. 多项式插值基础与龙格现象
在曲线重建任务中,多项式插值是最先被想到、也最容易被误用的工具。它的基本承诺很诱人:给定 n+1 个互异节点及其函数值,总能找到唯一一个次数不超过 n 的多项式穿过全部数据点。问题不在于"能不能插上",而在于"插上之后曲线在节点之间长什么样"。本节围绕拉格朗日插值与牛顿插值两种等价构造,说明高次多项式振荡的成因,并给出工程上可落地的规避策略。
两种构造,同一个多项式
拉格朗日插值把结果写成基函数的线性组合:
L(x) = Σ y_i · ℓ_i(x)
ℓ_i(x) = Π_{j≠i} (x − x_j) / (x_i − x_j)
每个 ℓ_i(x) 在自身节点处取 1、在其余节点处取 0,因此组合后必然穿过所有数据点。它的优点是形式对称、便于理论分析;缺点是每增加一个节点,所有基函数都要重算,且没有"复用已有结果"的机制。
牛顿插值改用差商构造:
N(x) = f[x_0] + f[x_0,x_1](x−x_0)
+ f[x_0,x_1,x_2](x−x_0)(x−x_1) + …
差商表逐列递推,新增节点时只需在表尾追加一列,已有差商全部保留。这正是工程实现中优先选牛顿形式的实际原因——它天然支持增量加点。需要强调:对同一组节点,拉格朗日多项式与牛顿多项式在数学上是同一个多项式,只是书写方式不同,插值结果完全一致,不存在"牛顿更准"的说法。
高次振荡从哪里来
经典反例是龙格函数 f(x)=1/(1+25x²) 在 [−1,1] 上的等距插值。节点加密到 11 个、21 个时,区间中部逼近尚可,但靠近两端出现幅度越来越大的剧烈摆动,最大误差随节点数增加反而发散。成因可以拆成三层来看:
- 基函数本身在振荡。高次拉格朗日基函数在区间边缘会出现大幅正负交替的"瓣",节点越密,瓣的峰值越大。
- 误差放大因子不受控。插值误差上界含一项 Π(x−x_i),等距节点下该乘积在端点附近急剧增大,把微小的函数值扰动放大成可见摆动。
- 等距节点分布不合理。等距采样在区间中部过密、两端过疏,而多项式在端点附近恰恰最"敏感",两者叠加导致端点误差主导。
下面的示意图对比了同一组等距节点下低次与高次插值的形态差异,以及改用切比雪夫节点后端点振荡被压制的效果。
工程规避策略
知道成因后,规避思路就清晰了。实际项目中可按以下优先级决策:
- 控制次数,分段插值。最稳妥的做法是不追求单一高次多项式,改用分段低次插值(分段线性、分段三次)。把区间切成若干子段,每段只用 3~4 个节点,误差被限制在局部,不会出现全局振荡。这是工程曲线重建的默认选择。
- 换节点分布。若确实需要单一高次多项式,把等距节点换成切比雪夫节点 x_k = cos((2k+1)π/(2(n+1))),端点加密可显著压低 Π(x−x_i) 的峰值,龙格现象基本消失。
- 改用样条。三次样条在节点处保证二阶连续,兼顾光滑性与局部性,是"既要平滑又要稳定"场景下的常用方案,代价是需要额外给出边界条件(自然边界、固定斜率或周期边界)。
- 增量加点用牛顿形式。当数据是逐步采集、需要在线更新时,用差商表追加节点,避免每次重建全部基函数。
一个可复现的判断示例
假设在 [−1,1] 上对 f(x)=1/(1+25x²) 采样,取 11 个等距节点做拉格朗日插值。实现时可直接用差商表计算牛顿系数,再在密集网格上求值观察形态:
import numpy as np
def divided_diff(x, y):
n = len(x); c = y.astype(float).copy()
for j in range(1, n):
for i in range(n-1, j-1, -1):
c[i] = (c[i] - c[i-1]) / (x[i] - x[i-j])
return c
def newton_eval(x, c, xq):
n = len(x); p = np.full_like(xq, c[-1])
for k in range(n-2, -1, -1):
p = p * (xq - x[k]) + c[k]
return p
x = np.linspace(-1, 1, 11)
y = 1.0 / (1.0 + 25.0 * x**2)
c = divided_diff(x, y)
xq = np.linspace(-1, 1, 401)
yq = newton_eval(x, c, xq)
print("端点附近最大偏差:", np.max(np.abs(yq - 1/(1+25*xq**2))))
观察要点不是具体数值,而是形态:若 yq 在 x 接近 ±1 处出现远大于 1 的尖峰或深谷,即判定为龙格振荡。此时把节点换成切比雪夫节点重跑,或直接改用 scipy.interpolate.CubicSpline 做分段三次插值,对比端点偏差是否回落。这个"先看形态、再看数值、最后换方案"的流程,比单纯比较误差数字更能暴露插值方法的结构性问题。
把拉格朗日与牛顿看作同一多项式的两种写法,把龙格现象看作节点分布与高次基函数共同作用的结构性缺陷,就能在选型时避开"次数越高越好"的陷阱,让曲线重建既穿过数据点,又在数据点之间保持可信的形态。