3. 多项式插值的局限
在上一节中,我们把插值问题归结为“给定 n+1 个互异节点,寻找一个次数不超过 n 的多项式穿过全部数据点”。从纯代数的角度看,这个问题有唯一解,而且可以用拉格朗日公式或牛顿差商公式显式写出来。初学者很容易由此得出一个直觉:节点越多、多项式次数越高,逼近效果就越好。这个直觉在理论上有部分依据(Weierstrass 定理说明连续函数可被多项式一致逼近),但在数值实践中却常常失效。本节要讨论的正是这种“理论上可行、实践中危险”的落差,以及它如何直接催生了分段低次插值的思想。
高次插值的第一个隐患:系数求解的病态性
若采用最朴素的单项式基 {1, x, x², …, xⁿ} 建立方程组 Vc = y,其中 V 是范德蒙矩阵,那么随着 n 增大,V 的条件数会急剧增长。以节点均匀分布在 [0,1] 为例,n=10 时范德蒙矩阵的条件数已在 10⁷ 量级,n=20 时可轻易超过 10¹²。这意味着输入数据中哪怕只有 10⁻¹⁰ 量级的舍入误差,解出的系数也可能完全失真。更麻烦的是,即便系数算得“准确”,高次多项式系数的微小扰动也会在求值时被放大——因为 xⁿ 在区间端点附近对系数的敏感度极高。
下面是一段可直接运行的 Python 示例,用于观察这一现象(示例参数为教学设定,非实测数据):
import numpy as np
from numpy.polynomial import polynomial as P
for n in [5, 10, 15, 20]:
x = np.linspace(0, 1, n + 1)
V = np.vander(x, increasing=True)
print(n, "cond =", np.linalg.cond(V))
运行后可以看到条件数随 n 近似指数上升。这提示我们:高次插值的困难首先不是“公式不对”,而是“计算过程对扰动过于敏感”。这正是数值稳定性讨论的起点。
Runge 现象:高次多项式在区间边缘的剧烈振荡
比系数病态更直观、也更具教学价值的现象是 Runge 现象。考虑经典函数 f(x) = 1/(1+25x²) 在区间 [−1, 1] 上,取等距节点做 n 次插值多项式 pₙ(x)。当 n 较小时,pₙ 与 f 贴合尚可;但当 n 增大到 10 以上,区间中部逼近变好,而靠近端点 ±1 处却出现幅度越来越大的振荡,最大误差不降反升。这一现象由 Runge 于 1901 年给出,因此得名。
其机理可以从两个角度理解。其一是节点分布:等距节点在区间中部密集、在端点稀疏,而高次多项式在端点附近的导数增长极快,插值条件被“强行”满足后,端点外侧的余项被放大。其二是余项公式:f(x) − pₙ(x) = f⁽ⁿ⁺¹⁾(ξ)/(n+1)! · ∏(x − xᵢ)。等距节点下 ∏(x − xᵢ) 在端点附近的值远大于中部,而 f⁽ⁿ⁺¹⁾ 对 1/(1+25x²) 这类函数增长很快,两者相乘导致端点误差爆炸。值得注意的是,若改用 Chebyshev 节点(即 xᵢ = cos((2i+1)π/(2n+2)) 的变体),Runge 现象会显著减弱——这说明问题不在“多项式”本身,而在“节点与次数的搭配方式”。
上图把三种策略的误差分布画在同一坐标系中:红色曲线代表等距节点高次插值,中部误差很小,但两端出现明显振荡;蓝色曲线代表改用 Chebyshev 节点后的高次插值,误差整体被压平;绿色曲线代表分段低次插值,误差量级最低且分布均匀。这张图想传达的核心信息是:“提高次数”不是唯一出路,甚至常常是错误出路。
数值稳定性:为什么“算得出来”不等于“算得准”
数值稳定性讨论的是算法对输入扰动和舍入误差的敏感程度。对高次插值而言,有三处不稳定来源需要区分:
- 问题本身的病态性:范德蒙矩阵条件数大,属于问题固有属性,换算法也难根治;
- 算法引入的额外误差:例如用单项式基求系数再回代求值,会放大舍入误差;改用牛顿差商形式或重心拉格朗日形式可显著改善;
- 求值阶段的放大:高次多项式在端点附近对系数扰动敏感,即使系数精确,浮点求值也可能失真。
实践中一个常被忽视的细节是:用重心拉格朗日公式求值比展开成单项式系数再求值稳定得多。重心公式为 p(x) = Σ (wᵢ/(x−xᵢ)) yᵢ / Σ (wᵢ/(x−xᵢ)),其中 wᵢ = 1/∏_{j≠i}(xᵢ−xⱼ)。它避免了显式求系数,计算量为 O(n) 每次求值,且对中等规模的 n 表现良好。但即便如此,当 n 很大且节点等距时,Runge 现象依然存在——稳定性改善的是“计算误差”,改善不了“逼近误差”。这一区分非常重要:数值稳定性解决的是“算得准”,Runge 现象暴露的是“模型选错了”。
分段低次插值的动机与基本做法
既然高次全局多项式在端点易振荡、系数求解病态,一个自然的思路是:放弃“一个多项式管全局”,改为“多个低次多项式管局部”。这就是分段插值。最直接的形式是分段线性插值:把区间分成若干子区间,每个子区间用一条直线连接两端点。它计算简单、无振荡,但光滑性差(一阶导数不连续),在节点处出现“折角”。
更进一步是分段三次 Hermite 插值:在每个子区间 [xᵢ, xᵢ₊₁] 上构造三次多项式,使其满足两端点的函数值和导数值。这样得到的曲线一阶导数连续(C¹),视觉上已经“光滑”。若再要求二阶导数连续(C²),就进入三次样条插值的范畴——这正是本课程后续要展开的核心内容。分段低次插值的共同优点是:
- 每个子区间只涉及少量节点,局部误差可控,不会因全局次数升高而振荡;
- 系数矩阵通常是带状或三对角的,条件数良好,求解稳定;
- 便于局部修改:改动一个数据点只影响相邻少数几段,适合交互式曲线编辑。
一个可操作的对比示例
仍以 f(x)=1/(1+25x²)、区间 [−1,1] 为例,取 11 个等距节点。用三种方式构造插值并比较最大误差(以下为教学设定的典型量级,具体数值随实现而异):
| 方法 | 次数/结构 | 端点附近表现 | 典型最大误差量级 |
|---|---|---|---|
| 全局等距高次插值 | 10 次多项式 | 明显振荡 | 10⁰ 量级,端点处可达数倍于函数值 |
| 全局 Chebyshev 节点插值 | 10 次多项式 | 平缓 | 10⁻¹~10⁻² 量级 |
| 分段线性插值 | 10 段直线 | 无振荡,有折角 | 10⁻² 量级 |
| 分段三次 Hermite | 10 段三次 | 光滑,无振荡 | 10⁻³~10⁻⁴ 量级 |
这张表说明:在节点固定的前提下,分段低次方法在误差和稳定性上都优于全局高次插值。它也为后续引入三次样条埋下伏笔——分段 Hermite 已能做到 C¹,但要达到工程上常用的 C² 光滑,还需要在节点导数上施加连续性约束,这正是样条插值要解决的问题。
小结本节的三条主线:高次插值带来系数求解的病态性,这是数值稳定性问题;等距节点高次插值在端点产生 Runge 振荡,这是逼近质量问题;两者共同构成了分段低次插值的动机——用局部低次结构换取稳定、可控、可局部修改的曲线构造方式。理解这三者的区别与联系,是后续学习三次样条、B 样条与光滑曲线构造方法的必要前提。