如何设置一个参数的最大值以依赖于 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')

这将限制 amplitudemax_lin**(gamma*2)**2 减去一些可变数量。通过对振幅偏移设置一个限制,它必须是正的, 结果 amplitude 不能超过您的 max_lin**(gamma*2)**2,即使 gamma 在拟合期间发生变化。我猜测初始值是该数量的 1/4,但也许您会更清楚合理的初始值应该是多少。

您可以对受数学表达式约束的参数设置界限,因此如果您想确保 amplitude 为正数,您可以将 min=0 添加到 params.add('amplitude',....)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...