不理解具有非线性约束的 Scipy Optimize

问题描述 投票:0回答:0

我正在尝试使用输入 m、n、a、b 优化函数 f,以获得 a 和 b 的固定值。我想要 m 和 n 的值作为输出。约束条件是 1>n>m>0。我试过实现这个,但我真的很难理解 NonlinearConstraint 函数是如何工作的。

这是我的代码:

import math
from scipy.optimize import minimize
import numpy as np
from scipy.optimize import NonlinearConstraint


# defines the free-energy function with z=1
def f(m,n,a,b):
    return -1/2(m**2 + a**2*n**2) + a**2*n + 1/b*((n+m)/2*math.log(1/2(n+m)) 
                                                  + (n-m)/2*math.log(1/2(n-m)) + (1-n)*math.log(1-n))


# defines function that minimises L for fixed a,b. Returns n and m.
def minimiser(f,a,b,m0,n0):
    def f2(m,n):
        return f(m,n,a,b)
    con = lambda x: x[1]-x[0] 
    cons = NonlinearConstraint(con,0,2)
    return minimize(f2, (m0,n0), bounds=((0,1),(0,1)), constraints=cons).OptimizeResult

但是,使用 minimiser 函数,Python 返回“f2() 缺少 1 个必需的位置参数:'n'”。我知道 con 需要一个输入,而 f2 需要两个。但是,如果我将部分代码更改为以下内容:

# defines function that minimises L for fixed a,b. Returns n and m.
def minimiser(f,a,b,m0,n0):
    def f2(x):
        return f(x[0],x[1],a,b)
    con = lambda x: x[1]-x[0] 
    cons = NonlinearConstraint(con,0,2)
    return minimize(f2, (m0,n0), bounds=((0.0,1.0),(0.0,1.0)), constraints=cons).OptimizeResult

然后它返回“TypeError:'int'对象不可调用”。这个错误发生在 f 的定义中。这些可能是完全不相关的错误,但我很困惑,我不知道自己在做什么了。我看过很多关于非线性优化的帖子,但水平有点太高了,我无法理解正在发生的事情。

scipy-optimize nonlinear-optimization
© www.soinside.com 2019 - 2024. All rights reserved.