スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 | --/--/-- --:--

数値計算プログラミング

以前の記事で書いたように、日頃実験データの解析や簡単な数値計算などには、
Wave Metrics 社の Igor Pro というソフトを使用しています。

このソフト、グラフ描画や数値解析機能には申し分ないのですが、
内部の専用プログラミング言語が劣悪すぎて、
プログラミングにストレスがたまりまくるんです。

計算の時は、このソフトを使わずに、C++で書くこともあるのですが、
できれば、計算途中にリアルタイムでグラフ表示をさせたんですよね。

その Igor というソフトにも別売りでC++とのインターフェースも存在するようなのですが、
その使用サンプルを眺めてみると、かなりめんどくさそう・・・
それならば、いっそのこと、C++でグラフ表示まで自作するか、
既存のグラフ描画ライブラリーを使用するか・・・
ということで、NPlot というライブラリーを使ってみようかなというのが前回の話でした。

で、グラフ描画の話はさておいて、
この Igor のデータ構造、非常に使い勝手がいいんです。

実際の数値データを扱うのですから、通常、1次元配列のようなものになりますが、
Igor の場合、それに加えて個々のデータが独自の横軸(X軸)情報を保有しているんです。

考えてみれば、自然科学ではほとんどのデータに横軸が存在してるんですよね。
たとえば、オシロスコープで取った波形では、横軸は時間ですし、
I-V特性のようなデータは、横軸が電圧ですね。
横軸の存在しないデータといえば、クラス50人分の身長データのような
統計的サンプルぐらいしか思い浮かびません。

Excel などを使っていると、通常、グラフにするとき、
横軸と縦軸の2本のデータ配列を使って、XYプロットをすると思います。
でも、横軸というのはたいていの場合、等間隔で並んだ数値列になっているだけなんですよね。

たとえば、オシロで取った波形を考えると、横軸は等間隔に並んだ時刻の羅列です。
結局、有意な情報は最初(画面左端)の時刻と最後(画面右端)の時刻だけです。
あるいは、最初の時刻と刻み間隔(○s/divの値)でもいいかもしれません。

要は電圧の値の時間変化の1次元配列に、
この最初と最後の時刻情報だけ追加しておけば、事足りるんですね。

個々のデータにこの横軸情報をインクルードしておけば、
XYプロットのように、2つのデータの紐づけをいちいち管理しなくても、
個々のデータを個別に管理するだけでよいというわけです。

たとえば、こちらは Igor のグラフプロットの例ですが、
Igor-wave-02.png
赤い方のデータは、[0,10]、青い方のデータは[-5,5]という横軸情報を独自に持っているので、
2本のデータをプロットするだけで、しかるべき横軸の場所にプロットされます。

また、データ自身が横軸を持っているので、
微分や積分やフーリエ変換など、横軸を必要とする演算はすべて、
そのデータに付属するメソッドとして、インプリメントできます。

というわけで、話が長くなりましたが、
自作ライブラリを作るうえで、このデータ構造を採用したいと思うのです。

つまり、データ配列に加えて、横軸情報を追加したものをクラスとして定義してやって、
そこに微分、積分、フーリエ変換などの演算をメソッドとして追加する
というイメージを考えています。
配列間における四則演算なども演算子の多重定義で実現したいですね。

Igor では、このデータ構造を「ウェーブ」と呼んでいるので、
double型(実数)のデータ配列に対して、 DWave というクラスでカプセル化して、

DWave d1, d2, d3;
・・・
d1 = 0; //すべての要素に 0 を入れる
d1.SetScale(-100,100); //横軸を [-100,100]に設定
・・・
double x = d2.Integrate(-1,1); //d2 を [-1,1]で積分して、x に入れる
d3 = d1 + d2;   //すべての要素で、d3[i] = d1[i] + d2[i]
・・・

というような感じで扱えるようにできれば・・・と思っています。

実は以前から作成していて、もうほとんど完成して実際に使っているのですが・・・
もう一度見直してみて、改良しながら、ここに記録していきたいなと思います。

ちなみに、僕はプログラミングはド素人なので、
かなり我流で危なげでプログラミングをしていると思いますが、
その点は、ご容赦ください^^;
スポンサーサイト
ジャンル:[学問・文化・芸術]  テーマ:[自然科学
C++プログラミング | コメント(0) | 2014/06/06 12:22
コメント

管理者のみに表示

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。