样条插值

在数值分析这个数学分支中，样条插值是使用一种名為样条的特殊分段多项式进行插值的形式。由于样条插值可以使用低阶多项式样条实现较小的插值误差，这样就避免了使用高阶多项式所出现的龙格现象，所以样条插值得到了流行。 使用多项式插值，对给定数据集进行插值的n阶多项式就被给定数据点所唯一地定义出来。但是，对同样的数据进行插值的n阶样条并不是唯一的，为了构建一个唯一的样条插值式它还必须满足另外n-1个自由度。 线性样条插值是最简单的样条插值。数据点使用直线进行连接，结果样条是一个多边形。 从代数的角度来看，每个Si 都是一个如下 S i ( x ) = y i + y i + 1 − y i x i + 1 − x i ( x − x i ) {\displaystyle S_{i}(x)=y_{i}+{\frac {y_{i+1}-y_{i}}{x_{i+1}-x_{i}}}(x-x_{i})} 的线性函数。 样条在每个数据点都必须连续，即 S i ( x i + 1 ) = S i + 1 ( x i + 1 )  ,  i = 1 , … n − 1 {\displaystyle S_{i}(x_{i+1})=S_{i+1}(x_{i+1})\qquad {\mbox{ , }}i=1,\ldots n-1} 我们很容易得到 S i − 1 ( x i ) = y i − 1 + y i − y i − 1 x i − x i − 1 ( x − x i − 1 ) = y i {\displaystyle S_{i-1}(x_{i})=y_{i-1}+{\frac {y_{i}-y_{i-1}}{x_{i}-x_{i-1}}}(x-x_{i-1})=y_{i}} S i ( x i ) = y i + y i + 1 − y i x i + 1 − x i ( x − x i ) = y i {\displaystyle S_{i}(x_{i})=y_{i}+{\frac {y_{i+1}-y_{i}}{x_{i+1}-x_{i}}}(x-x_{i})=y_{i}} 所以以上论述成立。 二次样条插值可以构建为 S i ( x ) = y i + z i ( x − x i ) + z i + 1 − z i 2 ( x i + 1 − x i ) ( x − x i ) 2 {\displaystyle S_{i}(x)=y_{i}+z_{i}(x-x_{i})+{\frac {z_{i+1}-z_{i}}{2(x_{i+1}-x_{i})}}(x-x_{i})^{2}} 通过选择 z 0 {\displaystyle z_{0}} ，然后用递推关系就可以得到系数： z i + 1 = − z i + 2 y i + 1 − y i x i + 1 − x i {\displaystyle z_{i+1}=-z_{i}+2{\frac {y_{i+1}-y_{i}}{x_{i+1}-x_{i}}}} 对于 n + 1 {\displaystyle n+1} 给定点的数据集 { x i } {\displaystyle \{x_{i}\}} ，我们可以用 n {\displaystyle n} 段三次多项式在数据点之间构建一个三次样条。如果 S ( x ) = { S 0 ( x ) ,   x ∈ [ x 0 , x 1 ] S 1 ( x ) ,   x ∈ [ x 1 , x 2 ] ⋯ S n − 1 ( x ) ,   x ∈ [ x n − 1 , x n ] {\displaystyle S(x)=\left\{{\begin{matrix}S_{0}(x),\ x\in [x_{0},x_{1}]\\S_{1}(x),\ x\in [x_{1},x_{2}]\\\cdots \\S_{n-1}(x),\ x\in [x_{n-1},x_{n}]\end{matrix}}\right.} 表示对函数 f {\displaystyle f} 进行插值的样条函数，那么需要： 插值特性， S ( x i ) = f ( x i ) {\displaystyle S(x_{i})=f(x_{i})} 样条相互连接， S i − 1 ( x i ) = S i ( x i ) , i = 1 , … , n − 1 {\displaystyle S_{i-1}(x_{i})=S_{i}(x_{i}),i=1,\ldots ,n-1} 两次连续可导， S i − 1 ′ ( x i ) = S i ′ ( x i ) {\displaystyle S'_{i-1}(x_{i})=S'_{i}(x_{i})} 以及 S i − 1 ″ ( x i ) = S i ″ ( x i ) , i = 1 , … , n − 1 {\displaystyle S''_{i-1}(x_{i})=S''_{i}(x_{i}),i=1,\ldots ,n-1} . 由于每个三次多项式需要四个条件才能确定曲线形状，所以对于组成 S {\displaystyle S} 的 n {\displaystyle n} 个三次多项式来说，这就意味着需要 4 n {\displaystyle 4n} 个条件才能确定这些多项式。但是，插值特性只给出了 n + 1 {\displaystyle n+1} 个条件，内部数据点给出 n + 1 − 2 = n − 1 {\displaystyle n+1-2=n-1} 个条件，总计是 4 n − 2 {\displaystyle 4n-2} 个条件。我们还需要另外两个条件，根据不同的因素我们可以使用不同的条件。 其中一项选择条件可以得到给定 u {\displaystyle u} 与 v {\displaystyle v} 的钳位三次样条， S ′ ( x 0 ) = u {\displaystyle S'(x_{0})=u\,\!} S ′ ( x k ) = v {\displaystyle S'(x_{k})=v\,\!} 另外，我们可以设 S ″ ( x 0 ) = S ″ ( x n ) = 0 {\displaystyle S''(x_{0})=S''(x_{n})=0\,\!} . 这样就得到自然三次样条。自然三次样条几乎等同于样条设备生成的曲线。 在这些所有的二次连续可导函数中，钳位与自然三次样条可以得到相对于待插值函数f的最小震荡。 如果选择另外一些条件， S ( x 0 ) = S ( x n ) {\displaystyle S(x_{0})=S(x_{n})\,\!} S ′ ( x 0 ) = S ′ ( x n ) {\displaystyle S'(x_{0})=S'(x_{n})\,\!} S ″ ( x 0 ) = S ″ ( x n ) {\displaystyle S''(x_{0})=S''(x_{n})\,\!} 可以得到周期性的三次样条。 如果选择， S ( x 0 ) = S ( x n ) {\displaystyle S(x_{0})=S(x_{n})\,\!} S ′ ( x 0 ) = S ′ ( x n ) {\displaystyle S'(x_{0})=S'(x_{n})\,\!} S ″ ( x 0 ) = f ′ ( x 0 ) , S ″ ( x n ) = f ′ ( x n ) {\displaystyle S''(x_{0})=f'(x_{0}),\quad S''(x_{n})=f'(x_{n})\,\!} 可以得到complete三次样条。 三次样条有另外一个非常重要的解释，实际上它是在索伯列夫空间 H 2 ( [ a ; b ] ) {\displaystyle H^{2}([a;b])} 最小化泛函 J ( f ) = ∫ a b | f ″ ( x ) | 2 d x {\displaystyle J(f)=\int _{a}^{b}|f''(x)|^{2}dx} 的函数。 泛函 J {\displaystyle J} 包含对于函数 f ( x ) {\displaystyle f(x)} 全部曲率 | f ″ ( x ) ( 1 + f ′ ( x ) 2 ) 3 2 | {\displaystyle \left|{\frac {f''(x)}{(1+f'(x)^{2})^{\frac {3}{2}}}}\right|} 的近似，样条是 f ( x ) {\displaystyle f(x)} 最小曲率的近似。 由于弹性条的总体能量与曲率成比例，所以样条是受到 n {\displaystyle n} 个点约束的弹性条的最小能量形状。样条也是基于弹性条设计的工具。 它可以定义为 S i ( x ) = z i + 1 ( x − x i ) 3 + z i ( x i + 1 − x ) 3 6 h i + ( y i + 1 h i − h i 6 z i + 1 ) ( x − x i ) + ( y i h i − h i 6 z i ) ( x i + 1 − x ) {\displaystyle S_{i}(x)={\frac {z_{i+1}(x-x_{i})^{3}+z_{i}(x_{i+1}-x)^{3}}{6h_{i}}}+\left({\frac {y_{i+1}}{h_{i}}}-{\frac {h_{i}}{6}}z_{i+1}\right)(x-x_{i})+\left({\frac {y_{i}}{h_{i}}}-{\frac {h_{i}}{6}}z_{i}\right)(x_{i+1}-x)} 以及 h i = x i + 1 − x i {\displaystyle h_{i}=x_{i+1}-x_{i}\,\!} . 通过解下面的方程可以得到它的系数。 { z 0 = 0 h i − 1 z i − 1 + 2 ( h i − 1 + h i ) z i + h i z i + 1 = 6 ( y i + 1 − y i h i − y i − y i − 1 h i − 1 ) z n = 0 {\displaystyle \left\{{\begin{matrix}z_{0}=0\\h_{i-1}z_{i-1}+2(h_{i-1}+h_{i})z_{i}+h_{i}z_{i+1}=6\left({\frac {y_{i+1}-y_{i}}{h_{i}}}-{\frac {y_{i}-y_{i-1}}{h_{i-1}}}\right)\\z_{n}=0\end{matrix}}\right.} 假设要为带有节点 ( x 0 , f ( x 0 ) ) = ( x 0 , y 0 ) = ( − 1 ,   e − 1 ) {\displaystyle (x_{0},f(x_{0}))=(x_{0},y_{0})=\left(-1,\ e^{-1}\right)\,\!} ( x 1 , f ( x 1 ) ) = ( x 1 , y 1 ) = ( − 1 2 ,   e − 1 4 ) {\displaystyle (x_{1},f(x_{1}))=(x_{1},y_{1})=\left(-{\frac {1}{2}},\ e^{-{\frac {1}{4}}}\right)\,\!} ( x 2 , f ( x 2 ) ) = ( x 2 , y 2 ) = ( 0 ,   1 ) {\displaystyle (x_{2},f(x_{2}))=(x_{2},y_{2})=\left(0,\ 1\right)\,\!} ( x 3 , f ( x 3 ) ) = ( x 3 , y 3 ) = ( 1 2 ,   e − 1 4 ) {\displaystyle (x_{3},f(x_{3}))=(x_{3},y_{3})=\left({\frac {1}{2}},\ e^{-{\frac {1}{4}}}\right)\,\!} ( x 4 , f ( x 4 ) ) = ( x 4 , y 4 ) = ( 1 ,   e − 1 ) {\displaystyle (x_{4},f(x_{4}))=(x_{4},y_{4})=\left(1,\ e^{-1}\right)\,\!} 的函数 f ( x ) = e − x 2 {\displaystyle f(x)=e^{-x^{2}}} 找一个线性样条。直接代入样条公式，我们得到如下样条： S ( x ) = { e − 1 + 2 ( e − 1 4 − e − 1 ) ( x + 1 ) x ∈ [ − 1 , − 1 2 ] e − 1 4 + 2 ( 1 − e − 1 4 ) ( x + 1 2 ) x ∈ [ − 1 2 , 0 ] 1 + 2 ( e − 1 4 − 1 ) x x ∈ [ 0 , 1 2 ] e − 1 4 + 2 ( e − 1 − e − 1 4 ) ( x − 1 2 ) x ∈ [ 1 2 , 1 ] {\displaystyle S(x)=\left\{{\begin{matrix}e^{-1}+2(e^{-{\frac {1}{4}}}-e^{-1})(x+1)&x\in [-1,-{\frac {1}{2}}]\\e^{-{\frac {1}{4}}}+2(1-e^{-{\frac {1}{4}}})(x+{\frac {1}{2}})&x\in [-{\frac {1}{2}},0]\\1+2(e^{-{\frac {1}{4}}}-1)x&x\in [0,{\frac {1}{2}}]\\e^{-{\frac {1}{4}}}+2(e^{-1}-e^{-{\frac {1}{4}}})(x-{\frac {1}{2}})&x\in [{\frac {1}{2}},1]\\\end{matrix}}\right.} 样条函数（蓝线）以及所近似的函数（红点）如下图所示： 下图是一个k=4的样条函数（蓝线）与所近似的函数（红线）的例子： 三次埃尔米特样条 NURBS