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 : 拡散方程式 Diffusion equation を解く

コメントをどうぞ


「みその計算物理学」では,一次元の拡散方程式(Diffusion equation)を,
CプログラムやJavaプログラムでの例が紹介されている。
http://www.geocities.jp/supermisosan/kakusan.html

本稿では,Igorで同じ問題を解く(間違っている可能性もあるが)。

一定の温度に熱せられた1次元の系が、両端が温度0にふれているという条件で解く。

Diffusion equation procedure window

拡散方程式(Diffusion equation)のプロシージャ

Function Diffusion_1D_main()
Variable i,j
for (i=0;i<1000;i+=1)
Make /O/N=100 $("wave"+num2str(i))=100 //初期値として100℃にする。
Bound_routine($("wave"+num2str(i))) //境界条件を適用する関数
endfor
for(i=0;i<999;i+=1) //
for(j=1;j<99;j+=1) // 拡散方程式を解く関数Diffuを呼び出す
Diffu($("wave"+num2str(i+1)),$("wave"+num2str(i)),j)
endfor
if (mod(i,100)==0) //iが100でと割り切れる場合に,Tableに追加
AppendToTable $("wave"+num2str(i))
endif
endfor
AppendToTable $("wave"+num2str(i)) //テーブルにwaveを追加する。
Displaywave0,wave100,wave200,wave300,wave400,wave500,wave600,
wave700,wave800,wave900,wave999 //グラフ化する。
End

Function Bound_routine(w) //境界条件を適用する関数
wave w
w[0]=0 //両端の温度を0℃にする。
w[99]=0
end

Function Diffu(w0,w1,jj) //拡散方程式を解く関数
Variable jj
wave w0,w1
w0[jj]=w1[jj]+0.5*(w1[jj+1]+w1[jj-1]-2*w1[jj])
end

図のように,
プロシージャーウィンドウで,
Diffusion_1D_main()
を実行する。

テーブルに計算結果であるwaveが追加され,
グラフ表示される。

Diffusion equation graph and table

グラフとテーブル

Igor:waveを読み込む

コメントをどうぞ


他のアプリケーションソフトで作成したデータファイルをIgorに読み込む方法を記述する。

例として,以下のようなcsvファイルを読み込む。

csvファイルの例

読み込むcsvファイルの例

読み込みには,
LoadWaveというコマンドを用いる。
csvファイルはテキストデータであるので,
/Jという“読み込み対象がテキストデータである”ことを意味するフラグを用いる。
また,読み込んだwaveをテーブルに表示させるために,
/E=2という“waveを既存のテーブルに追加し表示する”フラグを用いる。
/E=1は“新規のテーブルを作成しwaveを表示する”フラグ。

LoadWave /J /E=2

LoadWave実行

LoadWaveの実行

ファイルタイプとして,csv形式を選択すると,今回の読み込み対象である”Book1.csv”が表示されるため選択する。

読み込んだwaveのプレビューが表示される。

読み込んだwaveのプレビュー

読み込んだwaveのプレビュー

wave名を変更したり,スキップする行をしてしたりすることができる。
Loadをクリックすると,読み込んだwaveがテーブルに表示される。

waveの読み込みが完了し,テーブルに表示される。

waveの読み込み完了

細かい設定は,HULINKSのホームページに詳しい。
http://www.hulinks.co.jp/support/igor/reference/operations/LoadWave.html