Howto: CVXPY Ограничения неравенства матрицы
Я пытаюсь сформулировать проблему оптимизации следующим образом:
- Моя переменная оптимизации x - это матрица *n.
- х должен быть 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]]
в качестве оптимального х, с максимальным следом .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 ответ
Вам нужно использовать ограничение PSD. Если вы сравниваете матрицу со скаляром, cvxpy выполняет поэлементное неравенство, если вы не используете >>
или же <<
, Вы уже ограничены x
быть PSD, когда вы его создали, поэтому все, что вам нужно изменить, это:
constraints = [x << np.eye(2)]
Тогда я получу ваше решение:
array([[ 0.85355339, -0.35355339],
[-0.35355339, 0.14644661]])