補間ライブラリのつかいかた

■はじめに

地味にアクセスがあるmiscライブラリにある線形補間ライブラリ利用例について述べます。
(※古いシロモノなので、間違っている可能性もあります。なんかダメなら連絡ください。)

なお、下記点にご留意ください。

  • どういう理屈でなにが起こっているのかについては、別途論文なり解説ページなりを参照してください。
  • ある値xに対する唯一のyが決まる場合利用できます。そうでない場合、共通の媒介変数t(時間軸など)を別途準備し実装してください。
  • 内挿のみで外挿はしません。格子点外側(下記例では x < 0, 10 < x の範囲)では例外エラーとなります。
  • もう10年以上前の成果物です。いまのC++コンパイラーでは動作しないかもしれません。
  • なんかありましたらコメント欄かtwitterにでも連絡ください。
  • もし学術論文にでも利用した場合、参考文献にでもURLを書いといてください。僕が喜びます。
  • このプログラムを書いた時はPPARC所属でした。

■秋間法による線形補間実装例

miscライブラリから次のファイルを取り出し、main.cppと同じフォルダにおきます。

  • akima.h
  • akima.inl

main.cppにはコードを書いてコンパイルします。

#include <vector>
#include "akima.h"

int main() {
	// この例では格子点、(0,0), (1,5), (3,-5), (5,10), (10,12)について記述します
	using namespace lui::interpolation;
	akima<> a;
	
	// このようにして格子点を追加します。
	a.add(0, 0);
	a.add(1, 5);
	a.add(3,-5);
	a.add(5,10);
	a.add(10,12);
	
	// 格子点すべてを追加したら内部演算処理を行います。
	a.establish();
	
	// 任意の位置(但し x = [0,10])のy値を取得します。
	// ここで出力される値をgnuplotなどで確認してください。
	for( double x = 0; x < 10; x+=0.01 )
	{
		double y = a.get(x);
		std::cout << x << "\t" << y << "\n";
	}
}

■3次のスプライン曲線による線形補間実装例

miscライブラリから次のファイルを取り出し、main.cppと同じフォルダにおきます。

    • spline.h
  • spline.inl

main.cppにはコードを書いてコンパイルします。

#include <vector>
#include "spline.h"

int main() {
	// この例では格子点、(0,0), (1,5), (3,-5), (5,10), (10,12)について記述します
	using namespace lui::interpolation;
	spline<> a;
	
	// このようにして格子点を追加します。
	a.add(0, 0);
	a.add(1, 5);
	a.add(3,-5);
	a.add(5,10);
	a.add(10,12);
	
	// 格子点すべてを追加したら内部演算処理を行います。
	a.establish();
	
	// 任意の位置(但し x = [0,10])のy値を取得します。
	// ここで出力される値をgnuplotなどで確認してください。
	for( double x = 0; x < 10; x+=0.01 )
	{
		double y = a.get(x);
		std::cout << x << "\t" << y << "\n";
	}
}