理論から分かるように、スプライン補間を行うためには以下の2つの計算
が必要である。
- 各点での2次導関数の値の計算
- 係数を求めて、補間の値の計算
それぞれ、C言語の関数を作成することにする。それぞれの関数の作成方法について、以
下に述べる。
まず最初の関数で、標本点
と
から、
での2次導関数の値
を計算する
プログラムである。この関数は、最初に1回呼び出すだけでよく、結果は補間値を計算す
る次の関数に渡す。この2次導関数の値を計算するプログラムは、独立した関数としてモ
ジュール化するのが常套手段である。そのほうが、プログラムが分かりやすくなり、メン
テナンスも容易である。
C言語の関数でこれを実現するための関数のプロトタイプ宣言は、
void spline_cal_u(int n, double x[], double y[], double u[]);
のようにすればよい。
nは標本点の最大の番号である。標本点の番号
は、0から始まり
nで終わる。配列
x[]と
y[]に標
本のxとy座標の値を入れる。配列
u[]は計算された2次導関数の値が
入る。
この関数での処理の内容は、
- 標本点での2次導関数の値が満たす連立方程式を作成する。
- その連立方程式を解く。
である。要するに連立方程式を作り、そして解いているのである。解くべき連立方程式は、
次の通りである。
ただし、
と
は以下のとおり。
この関数のフローチャートを図1に示す。この関数では、
連立方程式を解く必要がある。この連立方程式は、以下の特徴がある。
- 係数は、3重対角行列である。
- 対角成分は、ゼロにならない。
通常はLU分解、あるいは反復法で解くことになる。しかし、そのプログラムを書くのも面
倒なので、以前作成したピボット選択のないガウス・ジョルダンを使えばよい。連立方程
式により解かれた2次導関数の値は、配列
u[]に入れられて呼び出し側に戻る。
連立方程式により計算される2次導関数の値は、
である。両端は自然境界条件で、
とする。こ
この関数では最後にその条件を配列をu[0]=0, u[n]=0とすることで実
現している。
図 1:
2次導関数を求める関数。
|
2次導関数の値が分かったので、残りの処理は、その値を利用して任意の
の補関値を求
めることである。スプライン補間は、3次の区分多項式で標本点の間を補完するのは今まで述べた
とおりである。そのためには、標本点の座標と2次導関数の値、即ち
が
わかれば計算できる。2次導関数の値
は予め、先の関数
spline_cal_u(n, x, y, u)で計算しておくものとする。
スプライン補間の計算に必要な
から、補間点の値を求める関数を作ろう。C
言語の関数でこれを実現するための関数のプロトタイプ宣言は、
double spline(int n, double x[], double y[], double u[], double xx);
のようにすればよい。この関数の実引数
xxに補関値を求めたい
を入れるので
ある。そして、この関数の戻り値が
での補間値
となる。
この関数の処理の内容は、
- 補間値を求めるが、どの標本点の間にあるか探す。
- 見つかった標本点の場所から、3次関数の係数を計算する。
- 3次関数からの時の値、を計算する。
である。ここで重要なことは、
がある区間を探し、3次関数の係数を求めることである。
2次導関数と標本点の値から、それらの係数は
と計算できる。これらの係数から、補間の値
は
となる。
この関数のフローチャートを図2に示す。まず初めに、が存在す
る区間を2分探索により探している。これがわかれば、を挟む場所のの値がわ
かる。そうすると、式(4)〜(7)を用いて、3次関数の補間式
の係数の値が計算できる。そして、式(8)から補間値がわかる。
補間したい点が変わる毎にspline(n, x, y, u, xx)を呼び出せばよいわけで
ある。
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成17年1月18日