DOSEIの日記

技術メモ+日常ログ

Spline のまとめ

以下の記事は、上記ページから読み取って推測した結果。成書を参考にしたほうがそりゃいいんだけど、負けかなと思って(謎

定義

(一般の)スプラインは、以下の性質をもった1変数関数のことである。

  1. 区間 [a, b] で定義される。
  2. その区間を適当に区分して、各区分で多項式である。区分の端点を knot という。 knot を全部並べたベクトルを knot vector という。
  3. knot でどっちの多項式を採用するかは適当。

スプラインのタイプ

knot が等間隔のとき、 uniform、そうでないとき non-uniform であるという。両端点以外の knot での近傍が何階微分まで一致しているかを全部集めたベクトルを smoothness vector という。
不連続なスプラインは、複数の knot が重複していると考えることで構成できる。このような knot が重なっているものを multiple knot といい、それで書かれた拡張 knot vector でスプラインのタイプを完全に表現できる。次数 n に対してある knot での smoothness を r としたとき、なめらかさの損失 *1 j = n − r を考える。各 knot を j 個ずつ重複させたのが拡張 knot vector である。連続する多項式の間の knot での smoothness が n なら、両多項式は同一であるので、拡張 knot vector からは消える(よなぁ、この定義だと)*2
したがって、 multiple knots では、 smoothness が負になることもあり、スプラインは不連続であるかもしれない

区間多項式の次数の最大値が n のとき、 order が n+1 であるという(らしい)。

X(t), Y(t) がスプラインで、(最大の)次数*3、knot が同じ時、 c(t) = (X(t), Y(t)) をスプライン曲線という。

いろいろなスプライン

  • 0 次の場合、いわゆる階段関数となる。
  • すべて 1 次の場合、折れ線。端点がつながっていれば、多角形である。
  • すべての区分多項式が 3 次で、 smoothness vector の値がすべて 2 であるとき、cubic spline (C spline) という。両端区分以外は一意に定まる。両端区分を定めるために両端で 2 階微分を 0 (変曲点)としたのが、 natural cubic spline。一般によくつかわれるスプラインで、単にスプラインといってこれを指すことも多い。
  • 与えられた knot と値の組に対して、すべての区間で同じ次数 n の区分多項式で、 knot でその値になる連続な(つまり smoothness が 0 以上、連続である)スプラインを考えることが、いわゆるスプライン補間である。一般には一意ではないので、自由度分の制約が必要。

スプラインの表現

ある knot vector t, smoothness vector r, 次数 n に対するスプラインはたくさんある*4。この集合は線型空間を成す(関数の値の和、関数の値のスカラ倍に関して)。 Srn(t) と書く。

cubic spline, natural cubic spline など、特定の条件を満たすもの全体は、部分空間になる。
スプラインの表現によって、 B-spline, Bézier spline などがある。
各区分多項式が、何らかの基底の線型和であらわされているとき、条件によっては単純に和を求めず、うまい再帰的な手法で求めることができたりする。したがって、スプラインによって計算方法はさまざまになる。

次回予告

  • B spline
  • Bézier spline

*1:連続性の損失ともかかれている

*2:きっと、スプラインのタイプを区別するだけの情報であって、実用的な意味は特にないのかな。このベクトルの集合と部分空間が1対1に対応するとか。

*3:区間の次数がすべて同じという意味なのか、最大次数が同じという意味なのか? Wikipedia の記述からははっきりしない。

*4:knot での値を指定しているわけでなく、区分多項式とそのつながり方を指定しているだけであることに注意