scipy.optimize with matrix constraint

时间:2012-09-21 16:06:07

标签: python scipy mathematical-optimization

如何告诉fmin_cobyla矩阵约束Ax-b >= 0?它不会将其作为向量约束:

cons = lambda x: dot(A,x)-b

感谢。

2 个答案:

答案 0 :(得分:4)

由于约束必须返回标量值,您可以动态定义标量约束,如下所示:

constraints = []
for i in range(len(A)):
    def f(x, i = i):
        return np.dot(A[i],x)-b[i]
    constraints.append(f)

例如,如果我们轻轻修改example from the docs

def objective(x):
    return x[0]*x[1]

A = np.array([(1,2),(3,4)])
b = np.array([1,1])
constraints = []
for i in range(len(A)):
    def f(x, i = i):
        return np.dot(A[i],x)-b[i]
    constraints.append(f)

def constr1(x):
    return 1 - (x[0]**2 + x[1]**2)

def constr2(x):
    return x[1]

x = optimize.fmin_cobyla(objective, [0.0, 0.1], constraints+[constr1, constr2],
                         rhoend = 1e-7)
print(x)

产量

[-0.6  0.8]

PS。感谢@seberg指出了之前的错误。

答案 1 :(得分:1)

实际上文档说Constraint functions;,它只需要一个函数列表,每个函数只返回一个值。

因此,如果您想要一次性完成所有操作,也许只需修改fmin_cobyla的普通python代码,您会发现它定义了围绕您的函数的包装函数,因此很容易......而python代码实际上非常短,只是围绕scipy.optimize._cobyal.minimize的小包装。

另一方面,如果您正在优化的函数与约束条件一样是线性(或二次),则可能有更好的解算器。