如何将参数的最大值设置为依赖于 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', ....)
。
我目前正在尝试估计测量的 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', ....)
。