如何在lmfit中用不同数量的gaussianmodel形成一个复合模型类?

2024-06-24 13:47:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一个函数,通过添加不同数量的GaussianModel类来生成CompositeModel类

我试着把Gausslist求和,它将gauss1替换为gauss6。我也试过用Gausslist来代替mod,但那不起作用

原来我有:

gauss1 = models.GaussianModel(prefix='g1_')
pars = gauss1.make_params(center=_259V[0][0], amplitude=_259V[1][0])

gauss2 = models.GaussianModel(prefix='g2_')
pars.update(gauss2.make_params(center=_259V[0][1], amplitude=_259V[1][1]))


gauss3 = models.GaussianModel(prefix='g3_')
pars.update(gauss3.make_params(center=_259V[0][2], amplitude=_259V[1][2]))

gauss4 = models.GaussianModel(prefix='g4_')
pars.update(gauss4.make_params(center=_259V[0][3], amplitude=_259V[1][3]))

gauss5 = models.GaussianModel(prefix='g5_')
pars.update(gauss5.make_params(center=_259V[0][4], amplitude=_259V[1][4]))

gauss6 = models.GaussianModel(prefix='g6_')
pars.update(gauss6.make_params(center=_259V[0][5], amplitude=_259V[1][5]))


mod = gauss1 + gauss2 + gauss3 + gauss4 + gauss5 + gauss6

这将给我一个由六个高斯函数组成的模型,但是我想把它推广到当我有更小或更多的函数时。到目前为止,我已经完成了下面的工作,它允许我生成GaussianModels列表(Gausslist),其长度取决于peak\u数据。所以峰值的数量对应于我想要多少高斯数:

Gausslist = []
Gausslist.append(models.GaussianModel(prefix='g0_'))
pars = Gausslist[0].make_params(center=_259V[0][0],amplitude=peak_data[1][0])

for i in range(1, len(peak_data[1])):
    Gausslist.append(models.GaussianModel(prefix='g{}_'.format(i)))
    pars.update(Gausslist[i].make_params(center=_259V[0][i], amplitude=peak_data[1][i])) 
#

但我不知道如何应对:

mod = gauss1 + gauss2 + gauss3 + gauss4 + gauss5 + gauss6

我试着把Gausslist求和,它将gauss1替换为gauss6。我也试过用Gausslist来代替mod,但那不起作用

我基本上想添加这些高斯模型来形成一个复合模型,但我不知道如何添加类,或者如果可能的话


Tags: modprefixmakemodelsupdateparamscenterpars
2条回答

尝试以下操作:

Gausslist = []
model, params = None, None
for i, peak in enumerate(peak_data[1]):
    comp = models.GaussianModel(prefix='g{}_'.format(i))
    pars = comp.make_params(center=center_val, amplitude=peak[0]) #Hm, maybe?
    if model is None:
        model = comp
        params = pars
    else:
        model += comp
        params.update(pars)

现在您应该了解如何使用model,无论peak_data[1]序列中有多少峰值

FWIW,我可能会建议存储峰值数据的xy值,以便您可以执行以下操作:

pars = comp.make_params(center=peak[0], amplitude=peak[1], sigma=1)

因为这可能会给出更好的起始值

您可以使用内置的python reduce函数:

model = reduce(lambda m1,m2: m1+m2, GaussList)

相关问题 更多 >