插值 是什么
到手的总是疏疏落落的点。传感器每 1 秒量的温度、表里记下的几个值、动画的几帧关键帧。想知道中间的时候,立起一条穿过这些点的光滑函数,把空档填上,这就是插值。和用一个点的导数来模仿曲线不同,插值用许多点的位置来立曲线。N 个点唯一地确定一条次数为 N-1 的多项式。可是把点胡乱加多,曲线反而会发疯,这就是龙格现象这个陷阱。所以实际里要么把点放得聪明,要么用每一段低次拼接的样条。插值是图形、动画、数据分析和数值积分的底子。
拖动这些点的高度,无论怎么移,都有一条金色曲线跟着,恰好穿过全部五个点。这就是插值多项式。两个点是一条 1 次的直线,三个点是一条 2 次的抛物线,五个点是一条 4 次的。N 个点唯一地确定一条次数为 N-1 的多项式,不多也不少。连接这些点的曲线有无数条,可是加上次数为 N-1 的多项式这个条件,答案就钉成恰好一条。这是插值的起点。
那条唯一的多项式怎么写?拉格朗日的办法很优雅。每个节点做一个基函数,这个基在自己的节点上值为 1,在其他每个节点上为 0。选中的基画成金色,自己节点上的点也是金色。按下按钮可以一个一个点亮基。于是插值多项式只是这些基按高度加权的和。P(x) = Σ yᵢ Lᵢ(x)。放进某个节点 xk,只有 Lk 是 1,其余是 0,所以 P(xk) = yk。恰好穿过每一个点是白送的保证。不必解方程组。
点越多越准,想来是这样,可是有陷阱。用等距的点去插值钟形的龙格函数。灰色是真函数,金色是插值曲线。点数增加,中间变好,两端的曲线却上下疯狂摇晃。次数到 15 左右,端部的误差比函数值大上好几倍,误差的文字变成红色。这就是龙格现象。高次多项式喜欢在节点之间自由地弯,点打得越密,中间就摇得越大。教训很清楚。插值里把次数胡乱升高,不是答案。
那么答案是什么?惊人的是插值方法原样不动,只改点放在哪里。从等距换成切比雪夫布置,这是越往两端点越密的布置。等距时曲线是金色,切比雪夫时曲线是绿色。同样的个数、同样的拉格朗日插值,端部的爆发却像假的一样平息。直觉是这样。多项式想在端部摇,就把更多的点打在端部,预先把那摇晃按住。望远镜镜面设计和函数逼近里切比雪夫成为标准,理由就在这里。问题不是插值,是点的布置。
很多时候点的位置不能自己选,只能照给的用。那时干脆换策略。不拿一条高次多项式盖住整条曲线,而是把只看相邻两点的低次 3 次小段光滑地接起来,这就是 3 次样条。把点加多,金色多项式在端部摇晃,蓝色样条却紧贴真值。一段不受远处点的影响,这种局部性让一处的摇晃不蔓延到整条曲线。字体的曲线、汽车车身设计 (CAD)、动画路径,都是样条。插值不只是把点连起来,而是选择怎么连。