はじめに
lmfitは非線形最小二乗法を用いてカーブフィットするためのライブラリであり、Scipy.optimize.curve_fitの拡張版に位置する。ここでは、データをフォークト分布関数モデルによりカーブフィッティングする方法について説明する。
コード
解説
モジュールのインポート
バージョン
データの生成
Scipyのspecial.voigt_profileでフォークト分布のラインプロファイルを作成する。rng = default_rng()とし、rng.random(100)でノイズを加える。xとyの関係を図で示すと以下のようになる。
モデルの定義
lmfit.models
の VoigtModel
をモデル関数として用いる。Voigt関数は以下の式で表される。パラメータはamplitude, center, sigma, と gammaとなる。
\[f(x; A, \mu, \sigma, \gamma) = \frac{A \textrm{Re}[w(z)]}{\sigma\sqrt{2 \pi}}\]
\[\begin{eqnarray*}
z &=& \frac{x-\mu +i\gamma}{\sigma\sqrt{2}} \\
w(z) &=& e^{-z^2}{\operatorname{erfc}}(-iz)
\end{eqnarray*}\]
初期パタメータの推定
model.guess(y, x=x)
により、上図のデータをフォークト関数モデルで近似するためのフィッティングパラメータについて、初期値を推定する。パラメータ(params)は以下のようになる。
カーブフィット
model.fit(y, params, x=x)
により、カーブフィッティングを実行する。
フィッティング結果の表示
print(result.fit_report())
により、フィッティングの結果を見ることができる。
result.plot_fit()
によりデータとフィッティングカーブが表示される。
result.plot()
とすることで残差とともにフィッティング結果が表示される。
sigmaとgammaの値が異なる場合
デフォルトではsigmaとgammaの値は同じになるようになっている。
gammaの値を自由に変えてフィッティングしたい場合は、params['gamma'].set(vary=True)
とする必要がある。
コードをダウンロード(.pyファイル)
コードをダウンロード(.ipynbファイル)
コメント