使用scipy.optimize.curve_fit传递其他参数?

fzwojiic  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(98)

我正在用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一样?

ctehm74n

ctehm74n1#

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)

wlp8pajw

wlp8pajw2#

你也可以使用functools.partial来进行咖喱,而不是使用内部闭包:

leastsq, covar = opt.curve_fit(
    partial(mix, numg=my_constant),
    # ...
)

字符串

相关问题