【问题标题】:scipy minimize with constraintsscipy 最小化约束
【发布时间】:2013-12-03 06:02:29
【问题描述】:

我知道这个问题应该在 scipy.optimize 的手册中处理,但是我理解的不够好。也许你可以帮忙

我有一个函数(这只是一个例子,不是真正的函数,但我需要在这个层面上理解它):

编辑(更好的例子):

假设我有一个矩阵

arr = array([[0.8, 0.2],[-0.1, 0.14]])

带有目标函数

def matr_t(t):
    return array([[t[0], 0],[t[2]+complex(0,1)*t[3], t[1]]]

def target(t):
    arr2 = matr_t(t)
    ret = 0
    for i, v1 in enumerate(arr):
          for j, v2 in enumerate(v1):
               ret += abs(arr[i][j]-arr2[i][j])**2
    return ret

现在我想在 t[i] 是实数的假设下最小化这个目标函数,比如t[0]+t[1]=1

【问题讨论】:

    标签: python optimization scipy


    【解决方案1】:

    这个约束

    t[0] + t[1] = 1
    

    将是一个相等 (type='eq') 约束,您可以在其中创建一个必须等​​于 0 的函数:

    def con(t):
        return t[0] + t[1] - 1
    

    然后你为你的约束创建一个dict(如果不止一个,则为字典列表):

    cons = {'type':'eq', 'fun': con}
    

    我从未尝试过,但我相信要保持t 真实,您可以使用:

    con_real(t):
        return np.sum(np.iscomplex(t))
    

    并让您的cons 包含这两个约束:

    cons = [{'type':'eq', 'fun': con},
            {'type':'eq', 'fun': con_real}]
    

    然后你将cons 输入minimize 作为:

    scipy.optimize.minimize(func, x0, constraints=cons)
    

    【讨论】:

    • @user1943296 不完全确定如何实现,如果你的输入很复杂,输出可能也是。第一个约束可能意味着t.imag.sum() 为零,因为我们只是将它与真正的 1 进行比较,但我的编辑显示了更明确的约束。
    • 如果我想要 con >0 , =0 或 type 只有两种类型 ineqeq跨度>
    • @wyx 来自文档:“等式约束意味着约束函数结果为零,而不等式意味着它是非负的。请注意,COBYLA 仅支持不等式约束”。你可以随时重写你的 eq/ineq 约束来表达它。
    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2017-08-01
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多