Thu, September 16, 2004
Igor Pro lecture No. 30
Functionの作成例:フィッティング関数2
■振幅、線幅、ピーク位置がそれそれ異なる複数のガウスデータの作成と、このようなマルチガウスデータに対するフィッティング関数の作成方法について解説する。簡単なフィッティング関数の作成方法については過去の記事で解説済みであるで、基本操作を忘れた場合は第7回の記事を参照する事。
あらかじめ、解析結果を格納するための w という wave と、テストスペクトルである TestSpectrum という wave を作成しておこう。ガウス関数は、f(x) = f(x0) exp[-{(x-x0)/width}^2] の形で与えられるため、一つのガウスピークあたりで必要なパラメータは、(1)ピーク高さ, f(0)、(2)ピーク位置, x0 と(3)ピーク幅, "width" の3つだ。従って、ピークを5つ出現させたければ、パラメータ w の数は、15となる。w の データ数を15、TestSpectrumのデータ数をデフォルトの128に設定するために、以下のコマンドを実行しよう。
make/O/D/N=15 w
make/O/D TestSpectrum
今回はTestSpectrumに対するX軸を特に指定せず、scaleの変更のみを行うことにする。以下のコマンドにより、TestSpectrum のX値は、0〜4の間で等間隔にデータが内}(/I)される形となる。setscaleについては第13回の記事を参照のこと
setscale/I x 0,4,"", TestSpectrum
続いて w のテストデータを準備しよう。以下のコマンドを実行すると、「0を平均値とする」ガウスノイズから1を引いた値の絶対値を w に与える。(1を引いたのは、プロット範囲との兼ね合いだけの問題なので、慣れたら適当に変更してもよい。)edit w を実行すれば、w の中身が確認できよう。
w=abs(gnoise(1)-1)
さて、IGOR Pro の Windows メニューから Procedure Window を開いて、以下のようなプログラムを作成しよう。
Function multiGauss1D(w, xx)
wave w
variable xx
variable Out1D
variable i=0
do
Out1D+=w[i]*exp(-((xx-w[i+1])/w[i+2]*10)^2)
i+=3
while (i < numpnts(w))
return Out1D
end
上のプログラムのように、フィッティング関数の中身にループを設置したり分岐命令を多く事ができる。上述のように1つのガウス関数には3つのパラメータが必要だから、ループカウンタ i は、一つのピークを記述したら+3する仕組みになっている。
プログラムの入力が終わったら、コマンドラインから以下のコマンドを実行し、これまでの方法に従って各自グラフを作成しよう。
TestSpectrum=multiGauss1D(w,x)
グラフでピークが確認できたら、さらに若干のノイズを加えよう。
TestSpectrum+=gnoise(0.02)
この段階で以下のようなグラフが表示されていたら合格だ。
ピークの形状が気に入らない場合には、w=abs(gnoise(1)-1)とTestSpectrum=multiGauss1D(w,x)をコマンドラインから再実行すればよい。
■第7回と同様の方法で、Procedureで定義した関数フィットを行ってみよう。
FuncFit/Q/N/W=0 multiGauss1D w TestSpectrum /D
IGOR Pro のメニューからCurveFitting を実行してもよいが、上記コマンドをコマンドラインから実行してもフィッティングが行える。ここで、/Qというオプションは、ヒストリーエリアに結果が散在するのを防ぐオプションで、自分でプログラムを組む場合に有効なオプションだ。また、/W=0 というオプションは、フィッティング終了時に出現するウインドウを自動で(OKとして)閉じるオプションで、これもまた循環解析プログラムを自作する場合にすこぶる有効なオプションだ。/D オプションはデフォルトでフィッティング関数をグラフに描くオプションで、自分で回帰曲線用のウェーブを用意していない場合は、デフォルト設定が有効だろう。以下のようなグラフが得られたら完成だ。
ちなみに、ピークの数やそれぞれのピークに関する情報が不明である場合には、パラメータの検出にはいくつかの技術を必要とする。ノイズレベルを検出した後、1階・2階の微分係数からピークを自動検出するプログラムが作成できるが、それについては後日紹介する事にする。
posted at September 16, 2004 12:45 PM
« Igor Pro lecture No. 29 | ホームに戻る | Igor Pro lecture No. 31 »
さんのサイン・インを確認しました。 (サイン・アウト)
(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)