next up previous contents index
Next: パラメトリック曲線 Up: 補間法と多項式近似 Previous: Hermite補間   目次   索引

3次スプライン補間法

前節で,任意の関数をある区間上の$ n+1$個のノードで,微分係数と関数の値が一致する多項式について学んだ。しかし,高次の多項式は振れが大きいため扱いにくいという問題がある。そこで,区間を小区間に分けて,それぞれの区間で別々の補間多項式を作るという方法が考えられる。この方法のことを区分的多項式近似(piecewise-polynomial approximation)という。

区分的多項式近似の中で最も簡単なのは,1次式での近似である。つまり,$ n+1$個のデータ点を順に直線で結んでいく方法である。この方法を用いたときに発生する問題は,ノードにおいて微分可能でないことである。つまり,この方法で作られた曲線はノードで滑らかでないということである。

そこで考えられる方法は,それぞれの小区間において,Hermite型の多項式を見つけた後,ノードで滑らかになるようにする方法である。もし2次のHermite型の多項式を用いたとしよう。ここで点 $ (x_{0},a_{0}), (x_{1},a_{1})$を通る放物線を$ S_{0}(x)$,点 $ (x_{1},a_{1}), (x_{2},a_{2})$を通る放物線を$ S_{1}(x)$とすると,

$\displaystyle S_{0}(x)$ $\displaystyle =$ $\displaystyle a_{0} + b_{0}(x-x_{0}) + c_{0}(x-x_{0})^{2}$  
$\displaystyle S_{1}(x)$ $\displaystyle =$ $\displaystyle a_{1} + b_{1}(x-x_{1}) + c_{1}(x-x_{1})^{2}$  

となり,全部で6個の未知数がある。次に,$ S_{0}(x)$$ S_{1}(x)$からなる曲線を$ S(x)$とすると, $ f(x_{0}) = S(x_{0})$, $ f(x_{1}) = S(x_{1})$, $ f(x_{2}) = S(x_{2})$より,
$\displaystyle a_{0}$ $\displaystyle =$ $\displaystyle S(x_{0})$  
$\displaystyle a_{1}$ $\displaystyle =$ $\displaystyle S_{0}(x_{1}) = a_{0} + b_{0}(x_{1} - x_{0}) + c_{0}(x_{1}-x_{0})^{2}$  
$\displaystyle a_{1}$ $\displaystyle =$ $\displaystyle S_{1}(x_{1})$  
$\displaystyle a_{2}$ $\displaystyle =$ $\displaystyle S(x_{2}) = a_{1} + b_{1}(x_{2}-x_{1}) + c_{1}(x_{2}-x_{1})^{2}$  

さらに, $ S'_{0}(x_{1}) = S'_{1}(x_{1})$より,

$\displaystyle b_{0} + 2c_{0}(x_{1} - x_{0}) = b_{1}$

よって,5つの式に6個の未知数となり曲線を決定できない。

そこで,3次の多項式で小区間を近似する方法が必要となる。これが3次スプライン補間法(cubic spline interpolation)とよばれる方法である。

定義 3.3   $ [a,b]$で定義された関数$ f$と,$ n+1$個のノード $ a = x_{0} < x_{1} < \cdots < x_{n} = b$が与えられたとき,$ f$の3次スプライン補間$ S$は次の条件を満たす。
  1. 区間 $ [x_{j},x_{j+1}]$上での3次多項式$ S(x)$は,$ S_{j}(x)$と表す。
  2. $ j = 0,1,\ldots,n-2$において $ S(x_{j}) = f(x_{j})$が成り立つ。
  3. $ j = 0,1,\ldots,n-2$において $ S_{j+1}(x_{j+1}) = S_{j}(x_{j+1})$が成り立つ。
  4. $ j = 0,1,\ldots,n-2$において $ S'_{j+1}(x_{j+1}) = S'_{j}(x_{j+1})$が成り立つ。
  5. $ j = 0,1,\ldots,n-2$において $ S''_{j+1}(x_{j+1}) = S''_{j}(x_{j+1})$が成り立つ。
  6. 次のどちらかの境界条件を満たす。

    \begin{displaymath}\begin{array}{l}
(i)  S''(x_{0}) = S''(x_{n}) = 0  {\rm 自チ...
..._{n}) = f'(x_{n})  {\rm 締境界(clamped boundary)}
\end{array}\end{displaymath}

自然境界のとき,自然スプラインといい,そのグラフは境界点 $ (x_{0},f(x_{0}))$ $ (x_{n},f(x_{n}))$で曲点となる。 一般に,締境界条件は関数に関して条件が多いので,良い近似を与えることが多い。しかし,締境界条件を満たすためには,境界における微分係数かその近似を得ることができなければならない。

図 3.1:
\begin{figure}\begin{center}\includegraphics[width=8cm]{NUMERICAL/figure3-4.eps}\end{center}\vspace{-0.9cm}
\end{figure}

関数$ f$の3次スプライン補間を作成するには,次の3次多項式に定義の条件を当てはめていけばよい。

$\displaystyle S_{j}(x) = a_{j} + b_{j}(x-x_{j}) + c_{j}(x-x_{j})^{2} + d_{j}(x-x_{j})^{3},  i = 0,1,\ldots,n-1$

条件2より $ S_{j}(x_{j}) = a_{j} = f(x_{j})$。 条件3より

$\displaystyle a_{j+1} = S_{j+1}(x_{j+1}) = S_{j}(x_{j+1}) = a_{j} + b_{j}(x_{j+1}-x_{j}) + c_{j}(x_{j+1}-x_{j})^{2} + d_{j}(x_{j+1}-x_{j})^{3}$

ここで, $ h_{j} = x_{j+1}-x_{j}$ $ a_{n} = f(x_{n})$とおくと,

$\displaystyle a_{j+1} = a_{j} + b_{j}h_{j} + c_{j}h_{j}^{2} + d_{j}h_{j}^{3}$ (3)

同様に, $ b_{n} = S'(x_{n})$とおくと

$\displaystyle S'_{j}(x) = b_{j} + 2c_{j}(x-x_{j}) + 3d_{j}(x-x_{j})^{2}$

より $ j = 0,1,\ldots,n-1$に対して $ S_{j}(x_{j}) = b_{j}$が成り立つ。ここで,条件4を用いると $ j = 0,1,\ldots,n-1$に対して

$\displaystyle b_{j+1} = b_{j} + 2c_{j}h_{j} + 3d_{j}h_{j}^{2}$ (4)

が成り立つ。 $ c_{n} = S''(x_{n})/2$とおき,条件5を用いると $ j = 0,1,\ldots,n-1$において

$\displaystyle c_{j+1} = c_{j} + 3d_{j}h_{j}$

が成り立つ。これを$ d_{j}$について解くと

$\displaystyle d_{j} = \frac{c_{j+1} - c_{j}}{3h_{j}}$ (5)

となり,この$ d_{j}$を式(3.1)と式(3.2)に代入すると
$\displaystyle a_{j+1}$ $\displaystyle =$ $\displaystyle a_{j} + b_{j}h_{j} + \frac{h_{j}^{2}}{3}(2c_{j} + c_{j+1})$ (6)
$\displaystyle b_{j+1}$ $\displaystyle =$ $\displaystyle b_{j} + h_{j}(c_{j}+ c_{j+1})$ (7)

となる。この2つの式から$ b_{j}$を求める。式(3.4)より

$\displaystyle b_{j} = \frac{1}{h_{j}}(a_{j+1} - a_{j}) - \frac{h_{j}}{3}(2c_{j}+c_{j+1})$ (8)

ここで,番号を1つ減らすと

$\displaystyle b_{j-1} = \frac{1}{h_{j-1}}(a_{j} - a_{j-1}) - \frac{h_{j-1}}{3}(2c_{j-1}+c_{j})$

これらを番号を1つ減らした式(3.5)に代入すると
$\displaystyle b_{j}$ $\displaystyle =$ $\displaystyle \frac{1}{h_{j}}(a_{j+1} - a_{j}) - \frac{h_{j}}{3}(2c_{j}+c_{j+1})$  
  $\displaystyle =$ $\displaystyle \frac{1}{h_{j-1}}(a_{j} - a_{j-1}) - \frac{h_{j-1}}{3}(2c_{j-1}+c_{j}) + h_{j-1}(c_{j-1} + c_{j})$  

これより $ j = 0,1,\ldots,n-1$において

$\displaystyle h_{j-1}c_{j-1} + 2(h_{j-1} + h_{j})c_{j} + h_{j}c_{j+1} = \frac{3}{h_{j}}(a_{j+1}-a_{j}) - \frac{3}{h_{j-1}}(a_{j}-a_{j-1})$ (9)

が成り立つ。 この式において, $ \{a_{j}\}_{j=0}^{n}$ $ \{h_{j}\}_{j=0}^{n}$の値は与えられているので, $ \{c_{j}\}_{j=0}^{n}$だけが未知数である。この $ \{c_{j}\}_{j=0}^{n}$の値が求まると, $ \{b_{j}\}_{j=0}^{n-1}, \{d_{j}\}_{j=0}^{n-1}$の値は式(3.6)と式(3.3)から求まる。したがって, $ \{S_{j}(x)\}_{j=1}^{n-1}$が求まる。

となると,問題は式(3.7)から $ \{c_{j}\}_{j=0}^{n}$が求まるかということになる。この答えは次の定理である。

定理 3.5   関数$ f$ $ a = x_{0} < x_{1} < \cdots < x_{n} = b$で定義されているならば,ノード $ x_{0},x_{1},\ldots,x_{n}$において$ f$にはただ1つの自然スプライン補間$ S$が存在する。

証明 境界条件 $ S''(a) = 0 = S''(b)$より $ c_{n} = S''(x_{n})/2 = 0$かつ

$\displaystyle 0 = S''(x_{0}) = 2c_{0} + 6d_{0}(x_{0} - x_{0})$

よって,$ c_{0} = 0$.

次に, $ c_{0} = 0, c_{n} = 0$と式(3.7)より連立方程式が得られる。ベクトル方程式で表すと $ A {\vec x} = {\vec b}$,ここで$ A$ $ (n+1) \times (b+1)$の行列

$\displaystyle A = \left(\begin{array}{cccccc}
1 & 0 & 0 & \cdots & \cdots & 0\\...
...-2} + h_{n-1}) & h_{n-1}\\
0 & \cdots & \cdots & 0 & 0 & 1
\end{array}\right)$

であり,$ {\vec b}$

$\displaystyle {\vec b} = \left(\begin{array}{c}
0\\
\frac{3}{h_{1}}(a_{2} - a...
...a_{n} - a_{n-1}) - \frac{3}{h_{n-2}}(a{n-1} - a_{n-2})\\
0
\end{array}\right)$

であり,$ {\vec x}$

$\displaystyle {\vec x} = \left(\begin{array}{c}
c_{0}\\
c_{1}\\
\vdots\\
c_{n}
\end{array}\right)$

である。このとき,行列$ A$は対角成分が他を圧倒しているので,この連立方程式は一意の解を持つ。 $  \blacksquare$

3次の自然スプライン法アルゴリズム


$ n+1$個の点 $ x_{0},x_{1},\ldots,x_{n}$で関数$ f$に対する3次スプライン補間

$\displaystyle S(x) = S_{j}(x) = a_{j} + b_{j}(x-x_{j}) + c_{j}(x-x_{j})^{2} + d_{j}(x-x_{j})^3,  x_{j} \leq x \leq x_{j+1}$

を求める。ただし, $ S''(x_{0}) = S''(x_{n}) = 0$とする。

================================================

\begin{displaymath}\begin{array}{l}
{\rm 入力}\hspace{2.8ex} {数}  n; x_{0},x_{...
...
{\rm 出力}\hspace{2.8ex} a_{j},b_{j},c_{j},d_{j}
\end{array}\end{displaymath}

\begin{displaymath}\begin{array}{l}
(1)\hspace{4ex} {\rm for}  i = 1,2,\ldots,n...
...ftarrow 0;\\
\hspace{7ex} z_{0} \leftarrow 0.\\
\end{array}\end{displaymath}

\begin{displaymath}\begin{array}{l}
(4)\hspace{4ex} {\rm for}  i = 2,3,\ldots,n...
...j = 0,1,2,\ldots,n-1);\\
\hspace{7ex} {\rm STOP}.
\end{array}\end{displaymath}

================================================

例題 3.6   次のデータにマッチする3次スプラインを求めよ。

\begin{displaymath}\begin{array}{c\vert cccccccccccccc}
x&0.9&1.3&1.9 & 2.1 & 2....
...2.4 & 2.15 & 2.05 & 2.1 & 2.25 & 2.3 & 2.25 & 1.95
\end{array}\end{displaymath}

\begin{displaymath}\begin{array}{lllrrr}\hline
\par i & x_{i} & a_{i} & b_{i} & ...
...0.15 & -0.13 & 0.04\\
13 & 9.2 & & & &   \hline
\end{array}\end{displaymath}

演習問題 3.4  


1. $ f(0) = 0, f(1) = 1, f(2) = 2$を満たす自然3次スプライン補間$ S$を求めよ。

2. 次のデータより3次スプライン補間$ S$を求めよ。

(a) \begin{displaymath}\begin{array}{ll}\hline
x & f(x)   \hline
8.3 & 17.56492 \\
8.6 & 18.50515   \hline
\end{array}\end{displaymath}

(b) \begin{displaymath}\begin{array}{ll}\hline
x & f(x)   \hline
-0.5 & -0.0247500 \\
-0.25 & 0.3349375 \\
0 & 1.1010000   \hline
\end{array}\end{displaymath}

3. 次のデータで,締3次スプライン補間を求めよ。

(a) \begin{displaymath}\begin{array}{lll}\hline
x & f(x) & f'(x)  \hline
8.3 & 17....
... & 1.116256\\
8.6 & 18.50515 & 1.151762  \hline
\end{array}\end{displaymath}

(b) \begin{displaymath}\begin{array}{lll}\hline
x & f(x) & f'(x)  \hline
-0.5 & -0...
...& 2.1890000\\
0 & 1.1010000 & 4.0020000  \hline
\end{array}\end{displaymath}


next up previous contents index
Next: パラメトリック曲線 Up: 補間法と多項式近似 Previous: Hermite補間   目次   索引
administrator 平成16年10月26日