如何:CVXPY 矩阵不等式约束
Howto: CVXPY Matrix Inequality Constraints
我正在尝试通过以下方式制定优化问题:
- 我的优化变量 x 是一个 n*n 矩阵。
- x 应该是 PSD。
- 应该在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
您需要使用 PSD 约束。如果您将矩阵与标量进行比较,除非您使用 >>
或 <<
,否则 cvxpy 会执行元素不等式。您在创建它时已经将 x
限制为 PSD,因此您需要更改的是:
constraints = [x << np.eye(2)]
然后我得到你的解决方案:
array([[ 0.85355339, -0.35355339],
[-0.35355339, 0.14644661]])
我正在尝试通过以下方式制定优化问题:
- 我的优化变量 x 是一个 n*n 矩阵。
- x 应该是 PSD。
- 应该在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
您需要使用 PSD 约束。如果您将矩阵与标量进行比较,除非您使用 >>
或 <<
,否则 cvxpy 会执行元素不等式。您在创建它时已经将 x
限制为 PSD,因此您需要更改的是:
constraints = [x << np.eye(2)]
然后我得到你的解决方案:
array([[ 0.85355339, -0.35355339],
[-0.35355339, 0.14644661]])