スプライン関数の求め方

 

3次スプラインの解き方
n 個の点
 (X_1, Y_1),(X_2,Y_2) , \ldots ,(X_{n-1},Y_{n-1}) , (X_n,Y_n)
が与えられたとき
各区間は3次関数で、かつ各点で、値、傾き、曲率が等しくなるような曲線を求める。
(ただし、区間(-\infty,X1), (X_n,\infty) は1次関数)

区間(X_{m-1} ,X_m) の関数をF_m=a_mx^3+b_mx^2+c_mx+d_m とすると、
(2 <= m <= n-1 のとき)
 F_m(X_m)= a_mX_m^3+b_mX_m^2+c_mX_m+d_m =Y_m
 F_{m+1}(Xm)= a_{m+1}X_m^3+b_{m+1}X_m^2+c_{m+1}X_m+d_{m+1} =Y_m
 F_m'(X_m) = 3a_mX_m^2+2b_mX_m+c_m= F_{m+1}'(X_m) =3a_{m+1}X_m^2+2b_{m+1}X_m+c_{m+1}
 F_m''(X_m) = 6a_mX_m+2b_m= F_{m+1}''(X_m) = 6a_{m+1}X_m+2b_{m+1}

4n-8 個の条件が出てきます。

また、m=1 のときは
 F_1(X_1)= c_1X_1+d_1 =Y_1
 F_2(X1)= a_2X_1^3+b_2X_1^2+c_2X_1+d_2 =Y_1
 F_{1}' (X_1)= c_1 = F_{2}'(X_1) = 3 a_2 X_1^2 + 2b_2X_1 + c_2
 F_{1}''(X_n)= 0 = F_{2}''(X_1)= 6a_2X_1 + 2 b_2

m=n のときは
 F_n(Xn)= anXn3+bnXn2+cnXn+dn =Yn
 F_{n+1}(Xn)= cn+1X1+dn+1 =Yn
 F_n'(X_n)= 3a_nX_n^2+2b_nX^n+c_n = F_{n+1}'(X_n)= c_{n+1}
 F_n''(X_n)= 6a_nX_n+2b_n= F_{n+1}''(X_n)=0

これを行列で書くと

2 <= m <= n-1 のとき
  \alpha_m=  \left(  \begin{array}{cccccccc}  X_m^3 & X_m^2 & X_m & 1 & 0 & 0 & 0 & 0 \\  0 & 0 & 0 & 0 & X_{m+1}^3 & X_{m+1}^2 & X_{m+1} & 1 \\  3X_m^2 & 2X_m & 1 & 0 & - 3X_{m+1}^2 & -2X_{m+1} & -1 & 0 \\  6X_m & 2 & 1 & 0 & - 6X_{m+1} & -2 & 0 & 0 \\  \end{array}  \right)

m=1 のとき
  \alpha_1=  \left(  \begin{array}{cccccccccccccccccc}  X_1 & 1 & 0 & 0 & 0 & 0 \\  0 & 0 & X_1^3 & X_1^2 & X_1 & 1 \\  1 & 0 & -3X_1^2 & 2X_1 & -1 & 0 \\  0 & 0 & - 6X_1 & -2 & 0 & 0 \\  \end{array}  \right)

m=n のとき
  \alpha_n=  \left(  \begin{array}{cccccccccccccccccc}  X_n^3 & X_n^2 & X_n & 1 & 0 & 0 \\  0 & 0 & 0 & 0 & X_n & 1 \\  3X_n^2 & 2X_n & 1 & 0 & -1 & 0 \\  6X_n & 2 & 0 & 0 & 0 & 0 \\  \end{array}  \right)

として、

  \left(  \begin{array}{cccccc}  \alpha_1 & 0 & \ldots & 0 & 0 \\  0 & \alpha_2 & \ldots & 0 & 0 \\  \vdots & \vdots & \ddots & \vdots & \vdots \\  0 & 0 & \ldots & \alpha_{n-1} & 0 \\  0 & 0 & \ldots & 0 & \alpha_n \\  \end{array}  \right)   \left(  \begin{array}{cccccccccccccccccc}  c_1 \\ d_1 \\ a_2 \\ b_2 \\ c_2 \\ d_2 \\ a_3 \\ b_3 \\ \vdots \\ a_n \\ b_n \\ c_n \\ d_n \\ c_{n+1} \\ d_{n+1}  \end{array}  \right)  =  \left(  \begin{array}{cccccccccccccccccc}  Y_1 \\ Y_1 \\ 0 \\ 0 \\ Y_2 \\ Y_2 \\ 0 \\ 0 \\ \vdots \\ 0 \\ 0 \\ Y_n \\ Y_n \\ 0 \\ 0  \end{array}  \right)
という関係になります。本当は\alpha が作る行列は\alpha_m\alpha_{m+1} が左右にめり込むような形になるんですが、Latexでそれをどうやって表現したらいいかわかりません。
とにかく、\alpha が作る行列は正方行列になって、これの逆行列を解くということになります。あとは省略。

 Posted by at 9:16 PM