如何根据另一个参数绑定 lmfit 参数,例如 param1 < 0.5*param2

How can I bound an lmfit parameter based on another parameter such that param1 < 0.5*param2

我试图按照 lmfitdocumentation 中给出的示例并生成了这个:

...
params.add(name="m", value=m_init, min=m_min, max=m_max)
params.add(name="mni_minus_m", value=1, vary=True, min=1e-12)
params.add(name="m_ni", expr='0.5*m + mni_minus_m')  # max value of m_ni is 0.5*m
...

这驻留在一个函数中,该函数接受 m_maxm_min 等参数

如您所知,我希望 m_ni 的最大值设置为 m 值的一半,但除此之外可以在零(最好是最小值)之间自由变化0.1) 以及最大值。由于 float precision(?)

的原因,在类似的问题中建议在中间参数中设置 min=

不幸的是,这似乎实际上只是将 m_ni 的值粘附到 m 的 50%。这似乎是我尝试适应的所有情况。

这完全有可能发生,因为这正是最小二乘法决定它想要做的,这实际上是正确的语法,但我不确定并想与比我更有能力的人进行验证。

我也想知道在这种情况下如何为 m_ni 设置初始值,因为我不太清楚。

我没用过这个库,但听起来你想要

params.add(name="m", value=m_init, min=m_min, max=m_max)
params.add(name="mni_factor", min=0, max=0.5)
params.add(name="m_ni", expr='m * mni_factor')

或者最后一个可能是

params.add(name="m_ni", expr='m * mni_factor if m * mni_factor > 0.1 else 0.1')

获得 0.1 的下限,但我不确定这是否真的有利于优化行为:)