在數值分析這個數學分支中,樣條插值是使用一種名為樣條的特殊分段多項式進行插值的形式。由於樣條插值可以使用低階多項式樣條實現較小的插值誤差,這樣就避免了使用高階多項式所出現的龍格現象,所以樣條插值得到了流行。
樣條插值
使用多項式插值,對給定數據集進行插值的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)
參見