С помощью @MichalAdamaszek работает следующий код. Проблема заключалась в том, что CVXPY не может обрабатывать функции .real и .imag внутри ограничений. Таким образом, необходимо было разбить сложную переменную B
на две действительные переменные, а затем объединить их после .solve
, используя B=BR.value+1j*BI.value
Другая ошибка в этом вопросе заключалась в том, чтобы поставить ограничение как LMI>=0
. Для SDP LMI>>0
следует использовать. Последнее, что нужно было использовать CVXOPT
решатель вместо стандартного SCS
, поскольку он не может обрабатывать более 2х2 матриц. Код оказывается математически правильным, поскольку он всегда минимизирует остаточную функцию
R (2,1) = R0 (2,1) + H (2,2) * B (2,1)
print ('Остаток', abs (R0 + np.matmul (H, B))) каждый раз приближается к 0.
Правильный код:
import numpy as np
import cvxpy as cp
H = np.random.rand(2,2)
R0 = np.random.rand(2,1)
BR=cp.Variable((2,1))
BI=cp.Variable((2,1))
RRf=cp.diag((np.real(R0)+np.real(H)@BR-np.imag(H)@BI))
IRf=cp.diag((np.imag(R0)+np.imag(H)@BR+np.real(H)@BI))
Vc2=cp.Variable()
z=np.zeros((RRf.shape[0],RRf.shape[1]))
I=np.eye(RRf.shape[0])
objective3=cp.Minimize(Vc2)
LMI =cp.bmat( [
[Vc2*I, RRf, z, -IRf],
[RRf, I, IRf, z],
[z, IRf, Vc2*I, RRf],
[-IRf, z, RRf, I]
])
const1 = LMI >>0
prob=cp.Problem(objective3,[const1])
prob.solve(solver=cp.CVXOPT, kktsolver=cp.ROBUST_KKTSOLVER)
B=BR.value+1j*BI.value
print(abs(B),Vc2.value)
print('The residule',abs(R0+np.matmul(H,B)))