物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Python lmfit ビルトイン(定義済み)関数を使いこなす

lmfit にはビルトイン (組み込み) 関数が多数用意されている。関数名を見ればだいたい何か分かるが、グラフで見れたほうが便利なので、主要な1次元の内蔵関数をグラフ化してみた

lmfit.github.io

グラフ化のための関数は最後に書いてあります

正規分布 / ガウス分布 / ガウシアン lmfit.models.GaussianModel()

plot_model(lmfit.models.GaussianModel(), 'sigma', [0.5,1.0,2.0])

正規分布 / ガウス分布 / ガウシアン `lmfit.models.GaussianModel()`

コーシー分布/ ローレンツ分布/ ブライト・ウィグナー分布 lmfit.models.LorentzianModel()

plot_model(lmfit.models.LorentzianModel(), 'sigma', [0.5,1.0,2.0])

コーシー分布/ ローレンツ分布/ ブライト・ウィグナー分布 `lmfit.models.LorentzianModel()`

対数正規分布 lmfit.models.LognormalModel() x>0で定義できる。

plot_model(lmfit.models.LognormalModel(), 'sigma', [0.2,0.5,1.0])

対数正規分布 `lmfit.models.LognormalModel()`

歪曲を含む左右非対称な正規分布 lmfit.models.SkewedGaussianModel() 。非対称性を評価する「歪み/歪度」の項である gamma を含んだ正規分布。gammaが正だと右側(正側)にテールを引く、負だと左側(負側)。

plot_model(lmfit.models.SkewedGaussianModel(), 'gamma', [-2.0,0,2.0])

歪曲を含む左右非対称な正規分布 `lmfit.models.SkewedGaussianModel()`

定数 / コンスタント lmfit.models.ConstantModel()

plot_model(lmfit.models.ConstantModel(), 'c', [2.0,0,-2.0])

定数 / コンスタント `lmfit.models.ConstantModel()`

線形分布 / 1次関数 / リニア関数 lmfit.models.LinearModel() slope * x + intercept

plot_model(lmfit.models.LinearModel(), 'slope', [-2.0,0,2.0])

線形分布 / 1次関数 / リニア関数 `lmfit.models.LinearModel()`

放物線 / 二次関数 lmfit.models.QuadraticModel()

plot_model(lmfit.models.QuadraticModel(), 'a', [2.0,0,-2.0])

放物線 / 二次関数 `lmfit.models.QuadraticModel()`

正弦波 / 正弦曲線 / シヌソイド lmfit.models.SineModel()

plot_model(lmfit.models.SineModel(), 'frequency', ["2*np.pi/5","2*np.pi/10","2*np.pi/20",])

正弦波 / 正弦曲線 / シヌソイド `lmfit.models.SineModel()`

ステップ関数 lmfit.models.StepModel() formはいくつかある。この例では erf

plot_model(lmfit.models.StepModel(form='erf'), 'sigma', [0,1.0,5.0])

ステップ関数 `lmfit.models.StepModel()`

指数関数 / エクスポネンシャル lmfit.models.ExponentialModel()

plot_model(lmfit.models.ExponentialModel(), 'decay', ["1.0/np.log(2)","2.0/np.log(2)","5.0/np.log(2)"], xrange=[0,10])

指数関数 / エクスポネンシャル `lmfit.models.ExponentialModel()`

べき乗 / 累乗関数 lmfit.models.PowerLawModel()

plot_model(lmfit.models.PowerLawModel(), 'exponent', [-1,0.2,1,2], xrange=[0,2], yrange=[0,4])

べき乗 / 累乗関数 `lmfit.models.PowerLawModel()`

import lmfit
import matplotlib.pyplot as plt
import numpy as np

def plot_model(model, parameter, values, xrange = [-10,10], yrange = None):
    xx = np.linspace(*xrange,1000)
    for val in values:
        params = model.make_params()
        params[parameter].value= eval(val) if type(val) is str else val
        yy = model.eval(params, x=xx)
        if type(yy) is not np.ndarray:
            yy = [yy] * len(xx)
        plt.plot(xx, yy, label=f'{parameter}={val}')
    plt.ylim(yrange)
    plt.legend()
    plt.title(str(model))
    plt.grid(alpha=0.3)
    plt.savefig("lmfit_model_"+str(model).split('(')[1].split(')')[0]+".png",dpi=300)
    plt.show()

よく使うモデルは以下のようにしておくと便利

# from lmfit.models import GaussianModel, LorentzianModel, LognormalModel, SkewedGaussianModel
# from lmfit.models import ConstantModel, LinearModel, QuadraticModel
# from lmfit.models import SineModel, StepModel
# from lmfit.models import ExponentialModel, PowerLawModel