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: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の読み込み完了

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

Igor : waveをファイルに保存する

コメントをどうぞ


前項では,waveを作成する方法を書いたが,本稿では,waveの内容をファイルに出力する方法を記述する。

ファイルに出力するプログラム

ファイルに出力するプログラム

Variable f1
によってファイル参照番号を格納する数値変数を定義する。
C言語で言うところのFILE *fpと同じである。
Open f1
によってファイル保存先を指定するダイアログがでてくる。
C言語では,f1=fopen(“sample.csv”, “w”);といった感じで記述する。
fprintf f1,”wave1, wave2, wave3\r”
f1で指定したファイルに”wave1, wave2, wave3″と出力する。
\rは「改行」を表す。
wfprintf f1, “%g, %g, %g\r” wave1, wave2, wave3
f1で指定したファイルにwave1とwave2とwave3の内容を出力する。
wfprintfはwaveの内容を出力するコマンドだ。
%gはint, float, doubleそれぞれ自動で認識してテキストとして出力する。
関数の実行結果,保存先を指定するダイアログがでてくる。

ファイル保存ダイアログ
ファイル保存ダイアログ

ここでは,abc.txtと指定した。
保存ファイルを開いた結果が下図である。

wave出力結果
wave出力結果

 

コマンドの詳細はHurinks社のWEBページに詳しい。

例えばOpenについては以下のリンクを参照
http://www.hulinks.co.jp/support/igor/reference/operations/Open.html