scipy最小化了约束

时间:2013-11-19 15:37:29

标签: python optimization scipy

我知道这个问题应该在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

1 个答案:

答案 0 :(得分:27)

此约束

t[0] + t[1] = 1

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

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

然后你制作约束的dict(如果不止一个,则为dicts列表):

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)