在数值分析这个数学分支中,样条插值是使用一种名為样条的特殊分段多项式进行插值的形式。由于样条插值可以使用低阶多项式样条实现较小的插值误差,这样就避免了使用高阶多项式所出现的龙格现象,所以样条插值得到了流行。
样条插值
使用多项式插值,对给定数据集进行插值的n阶多项式就被给定数据点所唯一地定义出来。但是,对同样的数据进行插值的n阶样条并不是唯一的,为了构建一个唯一的样条插值式它还必须满足另外n-1个自由度。
线性样条插值
线性样条插值是最简单的样条插值。数据点使用直线进行连接,结果样条是一个多边形。
从代数的角度来看,每个Si 都是一个如下
![{\displaystyle S_{i}(x)=y_{i}+{\frac {y_{i+1}-y_{i}}{x_{i+1}-x_{i}}}(x-x_{i})}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ebd9a73e21236c6753ecb8aede2704eaf2ece5c8)
的线性函数。
样条在每个数据点都必须连续,即
![{\displaystyle S_{i}(x_{i+1})=S_{i+1}(x_{i+1})\qquad {\mbox{ , }}i=1,\ldots n-1}](https://wikimedia.org/api/rest_v1/media/math/render/svg/78507ee968b362bb9c537ff08a53efba52dbbef7)
我们很容易得到
![{\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}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1d507ec12d0c262ad4a665fa9afc8a553cfba1d2)
![{\displaystyle S_{i}(x_{i})=y_{i}+{\frac {y_{i+1}-y_{i}}{x_{i+1}-x_{i}}}(x-x_{i})=y_{i}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5367b3015e32cd9010952b3611ed90bbd6b11f13)
所以以上论述成立。
二次样条插值
二次样条插值可以构建为
![{\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}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/6f1d1f6d884fb9e3418f9767f41b82f5b52acbf2)
通过选择
,然后用递推关系就可以得到系数:
![{\displaystyle z_{i+1}=-z_{i}+2{\frac {y_{i+1}-y_{i}}{x_{i+1}-x_{i}}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8d20461c00a90235d3adf80b75fa6349a55e076f)
三次样条插值
对于
给定点的数据集
,我们可以用
段三次多项式在数据点之间构建一个三次样条。如果
![{\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.}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7f35dee4ef590d2232993e367a632ee2488419d2)
表示对函数
进行插值的样条函数,那么需要:
- 插值特性,
![{\displaystyle S(x_{i})=f(x_{i})}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e7b5c52b17468c425d46f1f5011219af3569a4e0)
- 样条相互连接,
![{\displaystyle S_{i-1}(x_{i})=S_{i}(x_{i}),i=1,\ldots ,n-1}](https://wikimedia.org/api/rest_v1/media/math/render/svg/89886428e7365e025ef81f94252660beebc52af2)
- 两次连续可导,
以及
.
由于每个三次多项式需要四个条件才能确定曲线形状,所以对于组成
的
个三次多项式来说,这就意味着需要
个条件才能确定这些多项式。但是,插值特性只给出了
个条件,内部数据点给出
个条件,总计是
个条件。我们还需要另外两个条件,根据不同的因素我们可以使用不同的条件。
其中一项选择条件可以得到给定
与
的钳位三次样条,
![{\displaystyle S'(x_{0})=u\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/68b391f9f914322d9ad3dacc5c3b9cd72fc7f202)
![{\displaystyle S'(x_{k})=v\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ec816db79f2fda5ef9ccf8675b3a93e83a90d38c)
另外,我们可以设
.
这样就得到自然三次样条。自然三次样条几乎等同于样条设备生成的曲线。
在这些所有的二次连续可导函数中,钳位与自然三次样条可以得到相对于待插值函数f的最小震荡。
如果选择另外一些条件,
![{\displaystyle S(x_{0})=S(x_{n})\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1013457b433825eab43794f77e4e8aa41107bf58)
![{\displaystyle S'(x_{0})=S'(x_{n})\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/62c416068be4abae2d6f39c33354bb0d409568f5)
![{\displaystyle S''(x_{0})=S''(x_{n})\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f035538a4eda8ceb7e6eccea0c2b35d87ea8aac3)
可以得到周期性的三次样条。
如果选择,
![{\displaystyle S(x_{0})=S(x_{n})\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1013457b433825eab43794f77e4e8aa41107bf58)
![{\displaystyle S'(x_{0})=S'(x_{n})\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/62c416068be4abae2d6f39c33354bb0d409568f5)
![{\displaystyle S''(x_{0})=f'(x_{0}),\quad S''(x_{n})=f'(x_{n})\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f726055e1a6b7e064a0a54e097c6d080e8900bc5)
可以得到complete三次样条。
三次样条的最小性
三次样条有另外一个非常重要的解释,实际上它是在索伯列夫空间
最小化泛函
![{\displaystyle J(f)=\int _{a}^{b}|f''(x)|^{2}dx}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8534b8ab29e9fd619eee09c3cebb206ecc45b278)
的函数。
泛函
包含对于函数
全部曲率
的近似,样条是
最小曲率的近似。
由于弹性条的总体能量与曲率成比例,所以样条是受到
个点约束的弹性条的最小能量形状。样条也是基于弹性条设计的工具。
使用自然三次样条的插值
它可以定义为
![{\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)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/07baad36b482a94843611dc098b042e781282c94)
以及
.
通过解下面的方程可以得到它的系数。
![{\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.}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e025da1f0a40db279961889b2f336f6fd3d62590)
示例
线性样条插值
假设要为带有节点
![{\displaystyle (x_{0},f(x_{0}))=(x_{0},y_{0})=\left(-1,\ e^{-1}\right)\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e6c1cfa7bf11ca6f77f7d8baac2225972a567bcb)
![{\displaystyle (x_{1},f(x_{1}))=(x_{1},y_{1})=\left(-{\frac {1}{2}},\ e^{-{\frac {1}{4}}}\right)\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/41aa4b64abde88e23c4f2a651331252f471f7cca)
![{\displaystyle (x_{2},f(x_{2}))=(x_{2},y_{2})=\left(0,\ 1\right)\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/29ad5a7b4a64c0dbad62cb47d2de9b78088875af)
![{\displaystyle (x_{3},f(x_{3}))=(x_{3},y_{3})=\left({\frac {1}{2}},\ e^{-{\frac {1}{4}}}\right)\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4ad45a4e30b74b718de91442715b1e687ca0a93a)
![{\displaystyle (x_{4},f(x_{4}))=(x_{4},y_{4})=\left(1,\ e^{-1}\right)\,\!}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7e04f6226b87f4d252d7fb01e1d380dae2efb533)
的函数
![{\displaystyle f(x)=e^{-x^{2}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1bed0b77b34cab03996deb42d464becab2f05636)
找一个线性样条。直接代入样条公式,我们得到如下样条:
![{\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.}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c37490562e492ac73939afcaa3357411e1d2a3ae)
样条函数(蓝线)以及所近似的函数(红点)如下图所示:
![](//images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/f/f2/Linearspline.png)
二次样条插值
下图是一个k=4的样条函数(蓝线)与所近似的函数(红线)的例子:
![](//images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/4/4f/Quadraticspline_jaredwf.png)
参见