17

与えられた共鳴データにガウス型とローレンツ型を当てはめるプログラムを Python で書いています。使い始めたのですが、最適化されたパラメータの誤差を共分散行列から取り出すのに苦労し、scipy.optimize.leastsq使い始めました。optimize.curve_fit

ガウスとローレンツの合計に適合する関数を定義しました。

def mix(x,*p):
    ng = numg
    p1 = p[:3*ng]
    p2 = p[3*ng:]
    a = sumarray(gaussian(x,p1),lorentzian(x,p2))
    return a

ここpで、 は適合パラメーターでの初期推定値の配列です。を使用して呼び出されるインスタンスは次のcurve_fitとおりです。

leastsq,covar = opt.curve_fit(mix,energy,intensity,inputtot)

現時点ではnumg(ガウス形状の数) はグローバル変数です。curve_fitでできるように、代わりに追加の引数として組み込む方法はありleastsqますか?

4

1 に答える 1

22

Python の優れた点は、他の関数を返す関数を定義できることです。カリー化を試してみてください。

def make_mix(numg): 
    def mix(x, *p): 
        ng = numg
        p1 = p[:3*ng]
        p2 = p[3*ng:]
        a = sumarray(gaussian(x,p1),lorentzian(x,p2))
        return a
    return mix

その後

leastsq, covar = opt.curve_fit(make_mix(numg),energy,intensity,inputtot)
于 2012-04-20T17:14:18.230 に答える