Howto:CVXPY矩阵不等式约束

时间:2018-11-06 19:49:36

标签: python matlab optimization cvxpy cvx

我正尝试通过以下方式提出优化问题:

  1. 我的优化变量x是n * n矩阵。
  2. x应该是PSD。
  3. 它应该在 0 <= x <= I 范围内。意思是,它将在从全零方阵到n维单位矩阵的范围内。

这是我到目前为止提出的:

import cvxpy as cp
import numpy as np
import cvxopt

x = cp.Variable((2, 2), PSD=True)
a = cvxopt.matrix([[1, 0], [0, 0]])
b = cvxopt.matrix([[.5, .5], [.5, .5]])
identity = cvxopt.matrix([[1, 0], [0, 1]])
zeros = cvxopt.matrix([[0, 0], [0, 0]])

constraints = [x >= zeros, x <= identity]
objective = cp.Maximize(cp.trace(x*a - x * b))
prob = cp.Problem(objective, constraints)
prob.solve()

这给了我[[1, 0], [0, 0]]作为最佳x的结果,最大迹线为.5。但是事实并非如此。因为我已经在matlab的CVX中完成了相同的程序,所以得到的答案矩阵为[[.85, -.35], [-.35, .14]],最佳值为.707。哪个是对的。

我认为我的约束公式不正确或不遵循cvxpy标准。如何在程序中正确执行约束?

(这是我的matlab代码版本:)

a = [1, 0; 0, 0];
b = [.5, .5; .5, .5];

cvx_begin sdp

variable x(2, 2) hermitian;

maximize(trace(x*a  - x*b))
subject to
x >= 0;
x <= eye(2);

cvx_end

TIA

1 个答案:

答案 0 :(得分:1)

您需要使用PSD约束。如果将矩阵与标量进行比较,除非您使用>><<,否则cvxpy会进行元素不等式。创建x时已经将其约束为PSD,所以您需要进行的更改是:

constraints = [x << np.eye(2)]

然后我得到您的解决方案:

array([[ 0.85355339, -0.35355339],
       [-0.35355339,  0.14644661]])