2007-12-17

スプライン

n次のスプラインとは
  1. 節点以外ではn次多項式
  2. 節点ではn-1階微分までが節点の左右で一致
するものです。
一般に上記を満たすように各節点間の多項式の係数を決めるのは大変ですので、上記を満たす基底関数を作ってその線形和として表します。

さらに、n次スプライン基底関数をいきなり作るのも大変ですので、0次スプラインから順に作っていきましょう。
0次スプラインとは、定義どおりに

  1. 節点以外では0次多項式、つまり定数。
  2. 節点では-1階微分までが節点の左右で一致、つまり不連続で構わない。
    注)0階微分までが節点の左右で一致というのは連続ということです。
ということですので、簡単のために節点を0と1とすると、
  1. 0から1の間では1
  2. その他では0
という関数ですので、Rで書くと
sp=function(x) {
if (x >= 0 && x <= 1) {
return(1)
} else {
return(0)
}
}
になります。

しかしこのままでは引数としてベクトルを与えたときに成分ごとに計算してくれませんので、ifを使わずに組み込み関数の組み合わせで表現することにします。
どこかでジャンプのある関数が必要ですので、正負を返す関数signを使って
sp0=function(x) {
return((sign(x)-sign(x-1))/2 )
}
と書きます。

plot(sp0,-1,2)
と入力して、このグラフの形を見てみましょう。

次に、この0次スプライン基底関数同士を組み合わせて1次スプラインを作ります。2つのスプラインを組み合わせるには、まず節点の幅だけずらした基底関数を用意し、左側はその幅の間で1から0へ減る重みをかけて、右側は0から1へ増える重みをかけます。分かりづらいので式で書くと
sp1=function(x) {
return( (x)*sp0(x) + (2-x)*sp0(x-1) )
}
となります。
この方法を組み合わせて、2次、3次スプライン関数を作ってください。通常3次スプラインが良く使われます。

0 件のコメント: