CVXPY: DCPError: Проблема не соответствует правилам DCP - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь закодировать, что проблема решается B(2,1) при ограничениях LMI.

R (2,1) = R0 (2,1) + H (2,2) * B (2,1 )

V c - скалярная переменная

Он продолжает получать

> "DCPError: Проблема не соответствует правилам DCP."

    import numpy as np
    import cvxpy as cp

    H = np.random.rand(2,2)
    R0 = np.random.rand(2,1)

    B=cp.Variable((2,1), complex=True)  
    Rf=cp.diag(R0+H*B)




    RRf=cp.real(Rf)
    IRf=cp.imag(Rf)


    Vc=cp.Variable()
    Vc2= (Vc**2)


    z=np.zeros((Rf.shape[0],Rf.shape[1]))
    I=np.eye(Rf.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
    const2 = Vc   >=0        

    prob=cp.Problem(objective3,[const1,const2])
    print(prob.is_dcp())   




  [1]: https://i.stack.imgur.com/IQpxh.png

1 Ответ

1 голос
/ 29 апреля 2020

С помощью @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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...