スペクトルフィット
奥村先生のスペクトルのフィットを見ていたら、普段使っている道具でやってみたくなったのでやってみた。
普段使っているのがIgor Proなので、今回もそれで。データは、mikageさんの放射線スペクトル表示ツールの、FN-401の牛乳のスペクトル測定より。
奥村先生が、バックグラウンドを2次関数で、ピーク3つはそれぞれガウス型でやっておられるので、同じもので試してみる。データのチャンネル250から450のデータを切り出したものを作った。ch1が横軸、data3が縦軸。
表示の時に、成分ごとに分けられるように、プロシージャを定義。
// Fitting function Function testfit(pw, x) wave pw Variable x Variable bg, g1, g2, g3 bg = background(x, pw[0], pw[1], pw[2]) g1 = gaussian(x, pw[3], pw[4], pw[5]) // intensity, position, width g2 = gaussian(x, pw[6], pw[7], pw[8]) g3 = gaussian(x, pw[9], pw[10], pw[11]) return bg + g1 + g2 + g3 End // Gaussian Function/D gaussian(x, a, w, s) Variable/D x, a, w, s return a*exp(-(x - w)^2/(2*s^2)) End // background Function/D background(x, a, b, c) Variable x, a, b, c return a*(x-b)^2 + c End
バックグラウンドとガウス3つ合わせて合計12個のパラメータが必要なので、pwという名前で要素数12のwave(Igorの1次元データの呼び名)を作る。
パラメータを変えたら、フィッティングの各成分も再計算されて表示されるように、依存関係を以下のように定義。
totalにフィッティング結果が、bgがバックグラウンド、g1〜g3がガウス関数。これらもデータのグラフに重ねて表示。
Make/N=203/D total,bg,g1,g2,g3 Make/N=12/D pw total := testfit(pw, ch1) bg := background(ch1, pw[0], pw[1], pw[2]) g1 := gaussian(ch1, pw[3], pw[4], pw[5]) g2 := gaussian(ch1, pw[6], pw[7], pw[8]) g3 := gaussian(ch1, pw[9], pw[10], pw[11])
pwを表示させ、適当に初期値を入れて、スペクトルと似た感じにする。そのあと、Igorの自動フィットに突っ込みます。
・FuncFit/NTHR=0 testfit pw data3 /X=ch1 /D=total Fit converged properly total= testfit(pw,ch1[p]) pw={0.00085548,454.34,14.485,17.496,299.87,7.01,18.037,328.67,8.1666,16.425,392.8,8.6145} V_chisq= 5822.14;V_npnts= 203;V_numNaNs= 0;V_numINFs= 0; V_startRow= 0;V_endRow= 202; W_sigma={0.000174,21.7,1.33,2.09,0.966,1.06,2.02,1.01,1.19,1.86,1.07,1.23} Coefficient values ア one standard deviation pw_0 =0.00085548 ア 0.000174 pw_1 =454.34 ア 21.7 pw_2 =14.485 ア 1.33 pw_3 =17.496 ア 2.09 ←ガウス1のピークの高さ pw_4 =299.87 ア 0.966 ←ガウス1の位置 pw_5 =7.01 ア 1.06 ←ガウス1の幅 pw_6 =18.037 ア 2.02 ←ガウス2のピークの高さ pw_7 =328.67 ア 1.01 ←ガウス2の位置 pw_8 =8.1666 ア 1.19 ←ガウス2の幅 pw_9 =16.425 ア 1.86 ←ガウス3のピークの高さ pw_10 =392.8 ア 1.07 ←ガウス3の位置 pw_11 =8.6145 ア 1.23 ←ガウス3の幅
結果で文字化けしてるのは±の記号です。Macのソフトなので、フォントが違うとこういうことに……昔からコレです(汗)。
フィッティング結果はこんな感じ。
赤がデータに対するベストフィット、黒がバックグラウンド。ガウス型と仮定した成分は、緑、オレンジ、紫で、一緒に表示させています。
Igorは、非線形最小自乗法のアルゴリズムとして、Levenberg-Marquardt algorithmを用いていますが、この程度には分離できます。
面積を出して、パラメータの誤差から面積の誤差まで求めないといけないのですが、ちょっと時間が無いので今日はここまで。