如何根据另一个参数绑定 lmfit 参数,例如 param1 < 0.5*param2
How can I bound an lmfit parameter based on another parameter such that param1 < 0.5*param2
我试图按照 lmfit
的 documentation 中给出的示例并生成了这个:
...
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_max
、m_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 的下限,但我不确定这是否真的有利于优化行为:)
我试图按照 lmfit
的 documentation 中给出的示例并生成了这个:
...
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_max
、m_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 的下限,但我不确定这是否真的有利于优化行为:)