【问题标题】:scipy.optimize with matrix constraintscipy.optimize 与矩阵约束
【发布时间】:2012-09-22 02:00:43
【问题描述】:

我如何告诉fmin_cobyla 矩阵约束Ax-b >= 0?它不会把它当作向量约束:

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

谢谢。

【问题讨论】:

    标签: python scipy mathematical-optimization


    【解决方案1】:

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

    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 指出早先的错误。

    【讨论】:

      【解决方案2】:

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

      因此,如果您想一次性完成所有操作,也许只需修改fmin_cobyla 的纯 python 代码,您会发现它在您的函数周围定义了一个包装函数,所以很容易......而且无论如何,python 代码真的很短,只是 scipy.optimize._cobyal.minimize 周围的小包装。

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

      【讨论】:

        猜你喜欢
        • 2014-08-15
        • 1970-01-01
        • 2017-05-23
        • 1970-01-01
        • 1970-01-01
        • 2015-03-07
        • 1970-01-01
        • 2020-08-01
        • 2023-03-12
        相关资源
        最近更新 更多