我试图遵循lmfit
文档中给出的示例,并生成了以下内容:
...
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(和最大值之间自由变化。在一个类似的问题中,出于浮点精度(?(的原因,建议在中间参数中设置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的下限,但我不确定这是否真的有利于优化行为:(