データ解析のためのIgorPro活用術
複数の系統的なデータをシステマティックにフィッティングさせる
このIgorPro のProcedureはある関数でグラフ上にある複数のwaveを一度にフィッティングし、N回目に
フィッティングを行ったパラメータを別のwaveのNポイント目に記録するというものです。
Programの内容
ここでは3つのプログラムを紹介します。まずmaketestwaves()は
デモンストレーション用に10の異なるガウス波形を表示させるものです。
そしてpre_analysis()においてはフィッティングの出力waveをactive windowに表示させ、
それぞれのパラメータと誤差を格納するための出力用のwaveを作成するものです。
最後のsystematicanalysis()はフィッティング結果以外のwaveを系統的に
フィッティングさせ、得られたパラメータと誤差を別のwaveに格納するものです。
使用方法
- フィッティングしたいwavesをグラフ上に表示させ、そのグラフをActiveWindowにする。
なお、maketestwaves()を実行すると以下のようなグラフが表示されます。
- GraphのReorderTracesを実行し、フィッティングさせたい順序に並べ替える。
- pre_analysis()を実行し、フィティングパラメータ及び誤差を格納するwavesを作成する。
- 最後にsystematicanalysis()を実行する。すると、それぞれのフィッティングパラメータが
Out_0, _1,... に出力されている
カスタマイズ、その他
- CurveFit のところで目的にあったコマンドに書き換えましょう。またそれに応じてOut_..やSigma_..の
数も変更しましょう。
- x軸に別のwaveを指定したい場合はpre_analysis()のAppendToGraphの箇所、及びsystematicanalysis()のCurveFitのところを修正しましょう。
※ここでは全てのy軸を表示させるwaveは同じx軸のwaveを用いているということを想定しています。
ここからProcedureです。
/////////////////////////////////////////////////
// This procedure is for systematical fitting
// of all waves in the active graph
// created by M. Nagai on May., 1997,
// modified on March. 1, 2003
/////////////////////////////////////////////////
Macro maketestwaves() //make waves for demonstration
String www="wave_"
String www1
iterate(10)
www1=www+num2istr(i)
Make/D/O $www1
$www1=exp(-(x-5*i-40)^2/(10+i*10))
loop
Display wave_0,wave_1,wave_2,wave_3,wave_4,wave_5,wave_6,wave_7,wave_8,wave_9
EndMacro
Macro pre_analysis() //procedure before systematical fitting
String ywavename
Variable Num=0, yNum=0, gotwave,gots, gotfit=0
Silent 1
PauseUpDate
// enumerate the waves on the top graph window
do
ywavename= WaveName("",Num,1)
gotwave=cmpstr(ywavename, "")
gots=strsearch(ywavename,"fit_wave",0)
if(gotwave!=0)
if(gots<0)
yNum+=1
else
gotfit=1
endif
endif
Num+=1
while (gotwave)
//make destination wave of coefficients and sigma
Make/N=(yNum)/D/O Out_0, Out_1, Out_2, Out_3
Make/N=(yNum)/D/O Sigma_0, Sigma_1, Sigma_2, Sigma_3
//if there is no destination wave of fitting("fit_wave") on the top graph window,
// make wave and add it into the top graph window
if (gotfit==0)
ywavename= WaveName("",0,1)
Duplicate/O $ywavename fit_wave
AppendToGraph fit_wave
ModifyGraph rgb(fit_wave)=(0,0,52224)
endif
EndMacro
Macro systematicanalysis() //main procedure
String ywavename,message
Variable gotwave,gots, Num=0
Silent 1
DoUpDate
do
ywavename= WaveName("",Num,1)
gotwave=cmpstr(ywavename, "")
gots=strsearch(ywavename,"fit_wave",0)
if(gotwave!=0)
if(gots<0)
ModifyGraph rgb=(65535,65535,65535)
ModifyGraph rgb($ywavename)=(65535,0,0)
ModifyGraph rgb(fit_wave)=(0,0,65535)
CurveFit/Q gauss $ywavename /D=fit_wave
message=ywavename+", Coef=("+num2str(W_coef[0])+", "
message+=num2str(W_coef[1])+", "+num2str(W_coef[2])+", "+num2str(W_coef[3])+") "
print message
endif
endif
//write coefficients and sigmas in destination waves
Out_0[Num]=W_coef[0]
Out_1[Num]=W_coef[1]
Out_2[Num]=W_coef[2]
Out_3[Num]=W_coef[3]
Sigma_0[Num]=W_sigma[0]
Sigma_1[Num]=W_sigma[1]
Sigma_2[Num]=W_sigma[2]
Sigma_3[Num]=W_sigma[3]
Num+=1
while (gotwave)
ModifyGraph rgb=(65535,0,0)
EndMacro
ここまで
最終更新日: 2003.3.1
一つ上の項目に戻る