Igorで数値積分

コメントをどうぞ


本稿では,Igorで数値積分を実行する。

IgorにはIntegrate1dというコマンドがあり,シンプソン法やルンベルク法を用いた数値積分が簡単に行えるようになっている。
詳しくは,以下のリンクを参照のこと。
http://www.hulinks.co.jp/support/igor/reference/functions/integrate1D.html

例題として,sin(x)の数値積分を行った。
積分範囲は0からπまでとする。
結果は数値積分するまでもないが,2となる。

プロシージャーウィンドウで以下の関数(do_integとinteg_func)を記述する。
関数の名前は任意。
そして,エクスペリメントプロシージャウィンドウで,
Print do_integ(0,pi)
と記述する。
すると答えが得られて,
2
と出力される。

sin(x)の数値積分

 

Function do_integ(xmin,xmax)
    Variable xmin,xmax //積分範囲
    return Integrate1d(integ_func,xmin,xmax,1)  //引数の1はRomberg法の意
End

Function integ_func(inY) //積分したい関数を記述
    Variable inY
 Variable func
 func = sin(inY) //積分したい関数
    return (func) //Integrate1dに値を返す
End

積分範囲を0から2πにしたければ,
Print do_integ(0,2*pi)
とすればよい。
結果はNaN(0の意)が出力される。

積分したい関数をx^2にしたければ,
integ_func関数内のfunc = sin(inY)のところを,
func = inY*inY
とすればよい。

また,以下のように,関数内で積分結果を利用することも当然できる。
先の関数にmain関数を追加して,エクスペリメントプロシージャで,
main()
コマンドを入力すると,
answer = 2
と出力される。

数値積分の他の関数での利用

数値積分の他の関数での利用

Function main()
    Variable imin, imax, c
    imin = 0
    imax = pi
    c = do_integ(imin, imax)
    Printf “answer = %g”, c
End

Function do_integ(xmin,xmax)
    Variable xmin,xmax //積分範囲
    return Integrate1d(integ_func,xmin,xmax,1)  //引数の1はRomberg法の意
End

Function integ_func(inY) //積分したい関数を記述
    Variable inY
 Variable func
 func = sin(inY) //積分したい関数
    return (func) //Integrate1dに値を返す
End

Igor:for文を用いてwaveを複数作成する

コメントをどうぞ


C言語でおなじみのfor文を用いてwaveを複数作成する方法を述べる。
後で参照しやすいようにwave名も工夫する。

新規でプロシージャを作成し,for文の構文を確認する。

以下の関数test()を作成する。

Function test() //testという関数作成
    Variable i //変数定義
    for(i=0;i<5;i+=1) //i=0からi<5まで+1ずつ増加
        print i   //iの値を出力
        print “wave”+num2str(i) //数値変数iを文字列に
    endfor  //for文終了
End    //関数終了

print “wave”+num2str(i)について補足。
num2strというコマンドを利用して,数値変数iを文字列に変換する。
そして”wave”という文字列の後につなげることで,
wave1,wave2,…wave9となるようにし,画面に出力する。

エクスペリメントプロシージャでtest()を実行後の結果は次のようになる。

for文の確認

for文の確認

これを踏まえて,waveの作成を行う。

waveの作成はMakeというコマンドを用いる。
Make /N=10 wave2
とすることで,wave2という名前で10行のwaveが作成される。
ここで,先ほど述べたことを応用して,
Make /N=10 $(“wave”+num2str(i))
とする。
$というのは,“文字列をwaveの参照に変換する”コマンドである。
http://www.hulinks.co.jp/support/igor/programming/p_0313.html

作成したwaveをテーブルに追加する。
AppendToTable /O $(“wave”+num2str(i))

次のようにtestという関数を作成する。
Function test()
   Variable i  //変数定義
   for(i=0;i<5;i+=1) //i=0からi<5まで+1ずつ増加
       Make /N=8 /O $(“wave”+num2str(i))  //waveの作成
       AppendToTable /O $(“wave”+num2str(i)) //waveをテーブルに追加
    endfor   //for文終了
End

実行後の結果は次のようになる。

for文を利用したwaveの作成

for文を利用したwaveの作成

Igor:waveの読み込み2

コメントをどうぞ


前回のIgor:waveの読み込みでは,数値データのみの読み込みを行った。
本稿では,ある列にテキストデータがあるデータを読み込む。
例として,以下の図のcsvファイルを読み込む。

読み込むcsvファイルの例
読み込むcsvファイルの例

 

前回のコマンド
LoadWave /J /E=2
では3列目のテキストデータ列が読み込めない。
フラグとして,
/B=”F=0;F=0;F=-2;”
を追加する。
/B“個別の列の特性を指定する”フラグである。
そして,F=<>により,列のデータフォーマットを指定する。

-2 テキスト。
-1 フォーマット不明。Igor がフォーマットを推論。
0 から 5 数値
6 日付
7 時刻
8 日付/時刻
9 8進数
10 16 進数

それぞれの列はセミコロン“;”で区切る。

またFの他に
N=” “とすることで列名を指定できる。
同一列での特性指定の追加する際にはカンマで区切る。
LoadWave /J /E=2 /B=”F=0;F=0;F=-2,N=Day”

 

コマンド実行後のwaveプレビュー
コマンド実行後のwaveプレビュー

列名は”Day”とした。

waveの読み込み完了
waveの読み込み完了