【问题标题】:How do I set a max value for a parameter to be dependent on the value of another parameter in lmfit?如何将参数的最大值设置为取决于 lmfit 中另一个参数的值?
【发布时间】:2021-02-15 15:55:19
【问题描述】:

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

【问题讨论】:

  • 您好 Niklas,欢迎您!您是否会添加结果结果 :D 以及它如何不符合您的期望?

标签: lmfit


【解决方案1】:

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', ....)

【讨论】:

  • 非常感谢您的评论它有点工作,我会使用这个解决方案
  • 有时“它有点工作”是最好的希望;)。
猜你喜欢
  • 2017-02-03
  • 1970-01-01
  • 2023-03-11
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
相关资源
最近更新 更多