代码之家  ›  专栏  ›  技术社区  ›  ChemPaul

Python lmfit约束:a<b<c

  •  3
  • ChemPaul  · 技术社区  · 7 年前

    我正在使用 lmfit 在Python中拟合一些数据,包括拟合变量a、b和c;<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),但我不确定如何编写此代码。

    1 回复  |  直到 7 年前
        1
  •  3
  •   M Newville    7 年前

    根据链接到的文档的提示,不等式约束为 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

    推荐文章