如何将参数的最大值设置为依赖于 lmfit 中另一个参数的值?

How do I set a max value for a parameter to be dependent on the value of another parameter in lmfit?

我目前正在尝试估计测量的 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', ....)