• ベストアンサー

3次スプライン補間?

3次スプライン補間ですが、3次関数で補間するので既知の3点より、 補間したい値を求めると思っていたのですが、 下記の資料を見ると、既知の2点から値を求めています。 接線を使って、計算しているみたいですが、イマイチ分かりません。 分かりやすく教えていただけないでしょうか? http://www.caero.mech.tohoku.ac.jp/publicData/Daiguji/Chapter4.pdf

質問者が選んだベストアンサー

  • ベストアンサー
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.1

> 3次関数で補間するので  ここを誤解なさってるようです。そうはなくて、「2階微分まで連続な区分的3次関数」で補間するんです。 「n-1階微分まで連続な区分的n次関数」f(x)というのは、あらかじめ点列 k[j] (j=0,1,…, N) (これらを"knot" (「つなぎ目」という意味)と言います)が決めてあるものとし、また、f[j](x)をn次関数の列 (j=1,2,…,N)として、 k[0] ≦ x ≦ k[N]で定義される関数 f(x) が (1) k[j-1] ≦ x ≦ k[j] のとき f(x) = f[j](x) であって、しかも (2) fのxによる0階微分f(x), 1階微分f'(x), 2階微分f''(x), …, n-1階微分(f^(n-1))(x)がどれもk[0] ≦ x ≦ k[N]の範囲で至る所連続 である、という意味。  もちろん(1)から、k[j-1] < x < k[j] ならf(x), f'(x), f''(x), …, (f^(n-1))(x)が連続なのは自明。だから、xが丁度knot k[1], …, k[N-1]に等しいときにf(x)が(2)を満たすことが、f(x)が(2)を満たすための必要十分条件。つまり、   (f[j]^(r))(k[j+1]) = (f[j+1]^(r))(k[j+1]) (r=0,1,2,…, n-1; j=1,…,N-1) …(★) ということです。  n次関数ならn+1個の係数がある。(ご質問には「3次関数で補間するので既知の3点」とありますが、勝手な3次関数なら既知の4点が必要。これはラグランジュ補間ですね。)  しかし(2)の制約条件が付くため、f[j](x)は勝手なn次関数では駄目です。関数がN個あるんだから全部で(n+1)N個の係数がある。けれども、k[1], …, k[N-1]のN-1個のknotそれぞれについてn個の拘束条件(★)があるために、自由度は(n+1)N - n(N-1) = N+n だけしかない。この自由度を使って補間するんだから、結局「既知のN+n点 <x[i], y[i]> (i=1,2,…,N+n)を通るようにする」という補間をする。すなわち、   f(x[i]) = y[i] (i=1,2,…,N+n) と上記の式★とを連立した連立方程式を解くことによってfが決まるんです。  なお問題によっては、一番端のknot k[0], k[N]におけるfのr階微分が予め指定されていたり(たとえば (f^(r))(k[0])=(f^(r))(k[N])=0 (r=2,3,…,n)とか)、あるいはfが周期的( (f^(r))(k[0])=(f^(r))(k[N]) (r=0,1,…,n) )であったり、といった条件が付く場合もあり、このときにはさらに自由度が減ることになります。

関連するQ&A