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

Python 使用lmfit创建更精细的复合模型,python,model-fitting,lmfit,Python,Model Fitting,Lmfit,我想用lmfit从简单的模型创建更精细/复杂的模型 我有两个函数,比如高斯函数(范数到峰值单位)和洛伦兹函数(范数到峰值单位),我想拟合它们的线性组合。仍然在增加团结。所以我可以写一个新函数,比如 def voigt(*all the parameters*, alpha) return alpha*gaussian(...) + (1-alpha)*lorentzian(...) 但这不是很适应。 因此,我现在改为: mod = ConstantModel(prefix = 'a1_'

我想用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)