0

我如何讲述fmin_cobyla矩阵约束Ax-b >= 0?它不会将其作为矢量约束:

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

谢谢。

4

2 回答 2

4

由于约束必须返回一个标量值,您可以像这样动态定义标量约束:

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

例如,如果我们稍微修改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 指出了一个较早的错误。

于 2012-09-21T16:29:48.763 回答
1

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

所以如果你想把这一切合二为一,也许只是修改 的纯 python 代码fmin_cobyla,你会发现它在你的函数周围定义了一个包装函数,所以很容易......而且 python 代码真的很短无论如何,只是小包装scipy.optimize._cobyal.minimize

附带说明一下,如果您正在优化的函数像您的约束一样是线性的(或二次的),那么可能有更好的求解器。

于 2012-09-21T17:12:30.477 回答