logo

数値解析におけるB-スプライン 📂数値解析

数値解析におけるB-スプライン

テキストと数式を読むのが嫌なら、図を見て理解しても全く問題ない。

定義 1

区間 $[a,b]$ を$a \le x_{0} < x_{1} < \cdots < x_{n} < \cdots x_{N} \le b$のようなノードポイントで分割したとする。与えられた自由度 $K$ に対して、$x_{-K} < x_{-K + 1} < \cdots < x_{-1} < x_{0}$ と $x_{N} < x_{N + 1} < \cdots < x_{N+K-1} < x_{N+K}$ の追加のノードを考え、$i$番目のノードポイントと自由度$1 \le k \le K$に依存する再帰関数 $$ B_{i,k}(x) := \begin{cases} \chi_{[x_{i} , x_{i+1} )} (x) & , k=1 \\ {{ x - t_{i} } \over {t_{i+k-1} - t_{i} }} B_{i , k-1} (x) - {{ x - t_{i+k} } \over {t_{i+k} - t_{i+1} }} B_{i+1, k-1} (x) & , k > 1 \end{cases} $$ を定義しよう。これに基づき与えられたデータをインターポレートするスプライン $\displaystyle \sum_{i=-3}^{n-1} \alpha_{i} B_{i , K} (x)$ をB-スプラインb-Splineという。

定理

  • 2: $x \notin (x_{i} , x_{i+K} )$ に対して、$B_{i, K} (x) = 0$
  • 3: 全ての$x$ に対して、$0 \le B_{i} (x) \le 1$

  • $\chi$ は領域$A$ に対して$\chi_{A} (x) := \begin{cases} 0 & , x \notin A \\ 1 & , x \in A \end{cases}$ として定義された指示関数を表す。

説明

B-スプラインとは、ベーシスを持ち、ピースワイズな多項式インターポレートを行うスプラインの中でも特にそのようなスプラインのことだ。関数$B_{i,K}$は元の関数を再構築するためのBasisという意味で、$B$というアルファベットを使う。

定理についての説明

証明は省略する。

実用性について言えば、コンピュータグラフィックスを始めとした応用分野が広く、理論的にも数学的にも良い特性を豊富に持っているため、B-スプラインだけで一冊の本が出るほどだ。ここで詳細に説明するのは難しいが、どんな概念なのか簡単にチェックしてみよう。定義を見るだけでは手が出ないほど難しそうに見えるが、実際の概念はそこまで難しくはない。

視覚的な理解

例を始める前に、実際のB-スプラインがカバーするノードは、上記の定義よりも遥かに厳しくても構わないことに注意しよう。同じ点があってもよく、追加のノードは想像以上に自由だ。しかし、理解を助けるために、例では等間隔で与えられたノードのみを考えることにする。

20190415\_145943.png 自由度$k=1$の時、データをインターポレートするための$B_{i,1}$は上のような形をしている。これらの組み合わせによって元のデータをインターポレートすることは、文字通り、ただ四角い柱の高さを適当に調節して合わせることに他ならない。しかし、関数の線形結合で元のデータを復元するというアイデアを説明するにはこれ以上ない。

20190415\_145953.png 自由度$k=2$の時、$B_{i,2}$は上と同じ形をしていることが数式的に簡単に確認できる。ただし、簡単であることと単純であることは異なることに注意しよう。自由度$k=1$の時と比べると、$\displaystyle \sum_{i=-3}^{n-1} \alpha_{i} B_{i , K} (x)$は少し角が取れた形をしているだろう。図では別に表現されていないが、自由度が増加するにつれて$x_{-1} = -1$や$x_{5} = 5$のような追加のノードが次々と生まれ、そこでの$B_{i,2}$も新たに作られる。

20190415\_150000.png 自由度$k=3$の時、$B_{i,3}$は区間ごとにクアドラティックである。もちろん、再帰的に定義された$B_{i,k}$の特性上、全区間で二次関数であるとは限らず、実際にはそうでない場合がほとんどである。上の例と最も大きく異なる点は、ついに曲線になったということだ。

B-スプラインとは、このように、特定の区間で扱いやすく、それ以外では関数値がすべて$0$の関数の線形結合でインターポレートする関数のことを指す。だから、定義は複雑に書かれているが、実際の概念はより多く、より悪い条件で同じ作業を繰り返すことに過ぎない。

参照


  1. Atkinson. (1989). An Introduction to Numerical Analysis(2nd Edition): p173. ↩︎