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