Python lmfit 约束条件: a < b < c

3

我正在使用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),但我不确定如何编写代码。


你实际上想要得到什么结果,或者你需要严格使用这个LMFIT吗? - Virbhadrasinh
我不一定需要使用lmfit,但我需要使用最小二乘法来拟合我的数据到一个函数。 - ChemPaul
1个回答

3

根据您提供的文档提示,不等式约束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的值。


啊,是的,那很有道理。等我明天早上回到我的常用电脑,我会尝试一下这个方法。 - ChemPaul
我有一个类似的情况,只需要将一个参数限制为小于另一个参数,即b < 0.2a,但是除此之外,b应该能够自由变化,但是它似乎被锁定在恰好为0.2a的位置上,我设置了params.add(name="b", expr='0.2*a + b_minus_a'),这是因为我的拟合实际上想要更高的b,所以它达到了天花板,还是它实际上被困在那个值上?无论乘数如何,这似乎都是情况,所以我怀疑它已经遇到了你提到的警告。我能强制它探索更多吗? - ch4rl1e97

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接