使用 lmfit 创建更精细的复合模型

Creating more elaborate composite models with lmfit

我想用 lmfit 从简单的模型创建更精细/复杂的模型。

我有两个功能,例如一个高斯(规范。到峰值统一)和一个洛伦兹(规范。到峰值统一)并且想要适合例如它们的线性组合。仍然增加团结。所以我可以写一个像

这样的新函数
def voigt(*all the parameters*, alpha)
   return alpha*gaussian(...) + (1-alpha)*lorentzian(...)

但这不是很适应。 所以我现在改为:

mod = ConstantModel(prefix = 'a1_') + Model(gauss) + ConstantModel(prefix='a2_') * Model(lorentz)
pars = Parameters()
pars.add('a1_c', value = 1, min = 0, max = 1)
pars.add('a2_c', expr = '1-a1_c')

还是觉得有点笨拙。有没有更优雅的方式?

我认为这主要取决于您正在寻找什么样的复杂性和适应性。如果我理解这个问题(也许是您的真实目标的示例或简化),您想要限制两个峰值函数的最大高度总和为固定值(比如 1)。为什么不定义随心所欲缩放的基函数,也许

 import numpy as np
 def gauss(x, amp, cen, wid):
      return amp * np.exp(-(x-cen)**2/wid)  # deliberately Gaussian-like

 def loren(x, amp, cen, wid): 
      return amp * wid / ( (x-cen)**2 + wid) # deliberately Lorentzian-like

然后将它们相加并约束两个 amp 参数总和为 1:

from lmfit import Model
mod = Model(gauss, prefix='g_') + Model(loren, prefix='l_')

pars = mod.make_params(g_cen=1, g_wid=1, l_cen=1, l_wid=1)
pars.add('g_amp', value=0.5, min=0, max=1)
pars.add('l_amp', expr='1 - g_amp', min=0, max=1)