问题描述
我目前正在尝试估计测量的 Voigt 配置文件。我想为参数 'amplitude' 设置一个上限,其中上限的值由另一个参数 gamma 决定:
Voigt_dBm = Model(V_dBm) #V_dBm is defined as a Voigt profile
params = Voigt_dBm.make_params(gamma=5,alpha=720,...
amplitude=2e-8,offset=1e-9,max_lin=max(y_lin)) #Values for parameters are appropriate for the data
params.add('max_lin',vary=False) #This value comes from the data and should be kept static
params.add('amplitude',max=max_lin**(gamma*2)**2) <--- This is where I want to add the gamma-dependt limit
result = Voigt_dBm.fit(y,params,x=f,nan_policy='propagate')
解决方法
lmfit
不允许对边界使用表达式 - 边界需要在拟合开始之前已知值,并且在拟合期间不能更改。
你可以这样做:
params = Voigt_dBm.make_params(gamma=5,alpha=720,offset=1e-9,...)
params.add('max_lin',value=maxy(y_lin),vary=False)
params.add('amp_offset',value=max(y_lin)**(gamma*2)**2/4.0,min=0)
params.add('amplitude',expr='max_lin**(gamma*2)**2 - amp_offset')
这将限制 amplitude
为 max_lin**(gamma*2)**2
减去一些可变数量。通过对振幅偏移设置一个限制,它必须是正的,
结果 amplitude
不能超过您的 max_lin**(gamma*2)**2
,即使 gamma
在拟合期间发生变化。我猜测初始值是该数量的 1/4,但也许您会更清楚合理的初始值应该是多少。
您可以对受数学表达式约束的参数设置界限,因此如果您想确保 amplitude
为正数,您可以将 min=0
添加到 params.add('amplitude',....)
。