Howto: CVXPY Ограничения неравенства матрицы - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь сформулировать проблему оптимизации следующим образом:

  1. Моя переменная оптимизации x представляет собой матрицу n * n.
  2. х должен быть PSD.
  3. Должно быть в диапазоне 0 <= x <= <strong>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. Но это не должно быть так. Потому что я сделал ту же самую программу в CVX в Matlab, и я получил матрицу ответов как [[.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

ТИА

1 Ответ

0 голосов
/ 07 ноября 2018

Вам необходимо использовать ограничение PSD . Если вы сравниваете матрицу со скаляром, cvxpy выполняет поэлементное неравенство, если вы не используете >> или <<. Вы уже ограничили x, чтобы быть PSD, когда создавали его, поэтому все, что вам нужно изменить, это:

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

Тогда я получу ваше решение:

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