2023年4月5日水曜日

Gnuplotでカーブフィッティング

fit.md

Gnuplotでカーブフィッティング

実験で得られた数値スペクトルデータがあるとする。
これには、2つのガウシアン型のピークを持つ成分が含まれている。
ガウシアン型は $ y = A_1 \times \exp{[A_2 (x-A_3)^2]} $ 型。
この実験結果から成分を抽出する方法を解説します。

Gnuplotでのフィッティングコマンドは

# 関数定義 f(x) = a*x + b # 任意の関数・変数 a = 1.0 # 初期値 b = -5.0 # # フィッティング fit [xmin:xmax] f(x) "解析データ" u 1:2 via a, b

Step. 1 とりあえずプロットする

fort.100 というのが実験データ( 1列目 : x, 3列目: y )とする。

plot "fort.100" u 1:3

見ると、バックグラウンドと $x = 8, 13$あたりにピークがありそう。
振幅はどちらも2-4くらいに見える(およその目安把握が重要)。

Step. 2 バックグラウンドを計算して、結果から差し引く

# y = ax + b 型のバックグラウンド処理 B(x) = B1*x + B2 B1 = 0.3 B2 = 1.0 fit [17:19] B(x) "fort.100" u 1:3 via B1, B2 plot \ "fort.100" u 1:3 w l lc "blue" t "Original",\ B(x) w l lc "black" dt (5,3) t "Back ground",\ "fort.100" u 1:(($3)-(B1*($1)+B2)) w l lc "red" lw 2 t "subtract back ground"

バックグラウンドは直線に乗ってそうな $x = 17-19$ でフィッティング。
実行結果は以下の通り。
問題なくバックグラウンド処理はできていそう。

Step. 3 ガウシアンフィッティング

# 2つのガウシアン波形を含む h(x) でフィッティング h(x) = f1*exp( f2*(x-f3)**2 ) + g1*exp( g2*(x-g3)**2 ) f1 = 1.0 # 振幅 : 目視レベルで入力 f2 = -1.0 # 横幅 : ガウシアンなので負の値入力 f3 = 8.0 # 位置 : 目視レベルで入力 g1 = 1.0 g2 = -1.0 g3 = 13.0 fit [4:15] h(x) "fort.100" u 1:(($3)-(B1*($1)+B2)) via f1, f2, f3, g1, g2, g3 plot \ "fort.100" u 1:(($3)-(B1*($1)+B2)) w l lc "black" lw 8,\ h(x) w l lw 2 lc "yellow" dt (10,2) t "fitted curve",\

結果は次の通り

B1 = 0.0999337 B2 = 2.00122 f1 = 2.99945 f2 = -0.250139 f3 = 8.00014 g1 = 0.749658 g2 = -0.500211 g3 = 13

実際は $y = 3 e^{-0.25(x-8)^2} + 0.75 e^{-0.5(x-13)^2} + 0.1x + 2$ を計算していたので、精度よくフィッティングができたといえる。

注意点

初期値は適切な値を入れること

0 件のコメント:

コメントを投稿