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')
仍然使用三个变量(a
、b_minus_a
和 c_minus_b
)并施加不等式约束,但需要注意的是,差异实际上可能为 0。使用浮点数,这通常就足够了,但根据变量的规模,您可以将 0 更改为 1.e-12
.
我在 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')
仍然使用三个变量(a
、b_minus_a
和 c_minus_b
)并施加不等式约束,但需要注意的是,差异实际上可能为 0。使用浮点数,这通常就足够了,但根据变量的规模,您可以将 0 更改为 1.e-12
.