3次スプライン補間
前のページで書いたように3次スプライン補間は2次の導関数を$$\small x’’(t) = x’’_{i-1} + \frac{x’’_{i}-x’’_{i-1}}{t_{i}-t_{i-1}} (t-t_{i-1}), \quad t_{i-1} \leq t < t_i$$とおいて、原データの値をすべて通るように\(\small x’’_{1},x’’_{2},\cdots,x’’_{n-1}\)を求める。愚直に積分すると$$\small \qquad x’(t) = x’_{i-1} + x’’_{i-1}(t-t_{i-1}) + \frac{1}{2}\frac{x’’_{i}-x’’_{i-1}}{t_{i}-t_{i-1}}(t-t_{i-1})^2, \quad t_{i-1} \leq t < t_i \qquad \qquad \\ \small \qquad x(t) = x_{i-1} + x’_{i-1}(t-t_{i-1}) + \frac{1}{2}x’’_{i-1}(t-t_{i-1})^2+\frac{1}{6}\frac{x’’_{i}-x’’_{i-1}}{t_{i}-t_{i-1}}(t-t_{i-1})^3 \qquad \quad \;$$となる。\(\small t=t_i\)のとき、\(\small x(t_i) = x_i\)で連続関数でなければならないので、$$\small x’_{i-1} =\frac{x_{i}-x_{i-1}}{t_{i}-t_{i-1}}-\frac{1}{2}x’’_{i-1}(t_i-t_{i-1})-\frac{1}{6}(x’’_{i}-x’’_{i-1})(t_i-t_{i-1})$$と置き換えることができる。
1次の導関数についても連続性を満たすようにすると、\(\small t=t_i\)のとき、\(\small x’(t_i) = x’_i\)で連続関数でなければならないので、$$\small x’_i=x’_{i-1}+x’’_{i-1}(t_i – t_{i-1})+\frac{1}{2}\frac{x’’_{i}-x’’_{i-1}}{t_{i}-t_{i-1}}(t_i-t_{i-1})^2$$が成り立たなければならない。\(\small x’_{i-1},x’_{i}\)を上記の式を利用して消去して、整理すると$$\small \frac{x_{i+1}-x_{i}}{t_{i+1}-t_{i}}-\frac{x_{i}-x_{i-1}}{t_{i}-t_{i-1}}=\frac{t_i-t_{i-1}}{6}x’’_{i-1} + \frac{t_{i+1}-t_{i-1}}{3}x’’_{i}+\frac{t_{i+1}-t_{i}}{6}x’’_{i+1}$$が成り立つ。左辺は観測できるデータであるから、この条件から\(\small x’’_0,x’’_1,\cdots,x’’_{n-1}\)を求めてやればよいことがわかる。2次スプライン補間と同様に、連立方程式として解く必要があることに注意する。$$\small a_i=\frac{t_i-t_{i-1}}{6},\;b_i=\frac{t_{i+1}-t_{i-1}}{3},\;c_i=\frac{t_{i+1}-t_{i}}{6},\;d_i=\frac{x_{i+1}-x_{i}}{t_{i+1}-t_{i}}-\frac{x_{i}-x_{i-1}}{t_{i}-t_{i-1}}$$とおけば、連立方程式は$$\small \left[ \begin{array}{ccccccccc} b_1&c_1&0&0&\cdots&0&0&0&0\\ a_2&b_2&c_2&0&\cdots&0&0&0&0\\ 0&a_3&b_3&c_3&\cdots&0&0&0&0\\ 0&0&a_4&b_4&\cdots&0&0&0&0\\ \vdots&\vdots&\vdots&\vdots&\ddots&\vdots&\vdots\\ 0&0&0&0&\cdots&b_{n-5}&c_{n-5}&0&0\\ 0&0&0&0&\cdots&a_{n-4}&b_{n-4}&c_{n-4}&0\\ 0&0&0&0&\cdots&0&a_{n-3}&b_{n-3}&c_{n-3}\\ 0&0&0&0&\cdots&0&0&a_{n-2}&b_{n-2}\\ \end{array} \right] \left[ \begin{array}{c} x’’_1\\ x’’_2\\ x’’_3\\ x’’_4\\ \vdots\\ x’’_{n-5}\\ x’’_{n-4}\\ x’’_{n-3}\\ x’’_{n-2}\\ \end{array} \right]=\left[ \begin{array}{l} d_1-a_1 x’’_0\\ d_2\\ d_3\\ d_4\\ \vdots\\ d_{n-5}\\ d_{n-4}\\ d_{n-3}\\ d_{n-2}-c_{n-2} x’’_{n-1}\\ \end{array} \right]$$と表すことができる。このような行列は3重対角行列といわれており、通常の連立方程式を解くよりも高速に解を求めることができる。ただし、求める値が\(\small n\)個であるのに対して方程式が\(\small n-2\)個しかないので、\(\small x’’_0,x’’_{n-1}\)は何らかの値を指定する必要がある。
\(\small x’’_0=x’’_{n-1}=0\)と置く場合を自然3次スプライン補間という。代わりに\(\small x’_0,x’_{n-1}\)を指定して\(\small x’’_0,x’’_{n-1}\)を推定することもできて、固定端3次スプライン補間といわれる。境界条件に重要性が見いだせない場合は自然3次スプライン補間を適用すればよいと考えられる。推定した\(\small x’’_0,x’’_1,\cdots,x’’_{n-1}\)を用いて、任意の\(\small t\)に対する\(\small x(t)\)は$$ \small \qquad x(t) = x_{i-1} + x’_{i-1}(t-t_{i-1}) + \frac{1}{2}x’’_{i-1}(t-t_{i-1})^2+\frac{1}{6}\frac{x’’_{i}-x’’_{i-1}}{t_{i}-t_{i-1}}(t-t_{i-1})^3 \qquad \qquad \; \\ \small x’_{i-1} =\frac{x_{i}-x_{i-1}}{t_{i}-t_{i-1}}-\frac{1}{2}x’’_{i-1}(t_i-t_{i-1})-\frac{1}{6}(x’’_{i}-x’’_{i-1})(t_i-t_{i-1}), \quad t_{i-1} \leq t < t_i $$と計算することができることは上に示した通りである。