Python lmfit 约束:a < b < c

Python lmfit constraints: a < b < c

我在 Python 中使用 lmfit 来拟合一些数据,其中包括拟合变量 a、b 和 c。我需要确保 a < b < c。我发现 http://cars9.uchicago.edu/software/python/lmfit_MinimizerResult/constraints.html 讨论了需要定义为不等式和设置虚拟变量的约束。例如,如果我想要 a + b <= 10,我可以这样做:

pars.add('a',     value = 5, vary=True)
pars.add('delta', value = 5, max=10, vary=True)
pars.add('b',     expr='delta-a')

这将确保 a + b <= 10。

我想我需要 c - b > 0 和 b - a > 0(或者 a - b < 0 和 b - c < 0),但我不确定如何编码。

根据您 link 文档的提示,x > y 的不等式约束应转换为 x = y + something,其中 something 的下限为 0。

所以,应用该方法两次,我认为这应该可以满足您的要求:

from lmfit import Parameters
params = Parameters()
params.add('a', value=5, vary=True)
params.add('b_minus_a', value=1,  vary=True, min=0)
params.add('c_minus_b', value=1,  vary=True, min=0)
params.add('b', expr='a + b_minus_a')
params.add('c', expr='b + c_minus_b')

仍然使用三个变量(ab_minus_ac_minus_b)并施加不等式约束,但需要注意的是,差异实际上可能为 0。使用浮点数,这通常就足够了,但根据变量的规模,您可以将 0 更改为 1.e-12.