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的好处在于你可以定义返回其他函数的函数,试试currying:

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 回答