[lmfit] 3. パラメータに代数的な制約を付与してカーブフィッティング

lmfit

はじめに

lmfitは非線形最小二乗法を用いてカーブフィットするためのライブラリであり、Scipy.optimize.curve_fitの拡張版に位置する。ここでは、フィッティングパラメータに代数的な制約を付与してカーブフィッティングする方法について説明する。

コード

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

解説

モジュールのインポートなど

バージョン

残差を返す関数の定義

2つのガウス関数が重なったmodelを作成して、returnmodel - dataとして残差を返す関数を作成する。

ガウス分布データの生成

異なる分布を示すガウス分布を足し合わせたデータを作成する。

パラメータの設定

pfit = Parameters() として辞書形式のパラメータを作成して、そこに.add していくことでパラメータを追加していく。変数peak_splitvalue=2.5, min=0, max=5, vary=Trueとすることで初期値2.5で0から5まで変動するパラメータを作って、pfit.add(name='cen_2', expr='peak_split+cen_1')とすることでcen_2cen_1からcen_1+5の範囲になるようにすることができる。

カーブフィット

Minimizer(residual, pfit, fcn_args=(x, data))により、残差を返す関数residualが最小となるようにパラメータを最適化する処理をする。mini.leastsq()で最適化が行われ、out.residualで残差を得ることができる。data + out.residualとすることでフィットしたカーブのデータを得ることができる。

フィッティング後のパラメータの値は以下のようになる。

フィッティング結果の表示

代数的制約のためカーブフィットできていない事例

ピーク位置が2と7.5で差が5.5となっているデータの場合、代数的な制約で大きい方のピークが7までしかいけないため、フィッティング不十分な結果が得られる。

参考

Non-Linear Least-Squares Minimization and Curve-Fitting for Python — Non-Linear Least-Squares Minimization and Curve-Fitting for Python
Fit Using Inequality Constraint — Non-Linear Least-Squares Minimization and Curve-Fitting for Python
Performing Fits and Analyzing Outputs — Non-Linear Least-Squares Minimization and Curve-Fitting for Python

コメント