CVXPY: DCPError: Problem does not follow DCP rules

CVXPY: DCPError: Problem does not follow DCP rules

我正在尝试编写解决问题的代码 B(2,1) 在 LMI 约束下。

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

Vc是标量变量

它不断

> "DCPError: Problem does not follow DCP rules."

    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

在@MichalAdamaszek 的帮助下,下一个代码可以正常工作。
问题是 CVXPY 无法处理约束内的 .real 和 .imag 函数。
因此,所需的操作是将复杂变量 B 分解为两个实变量,然后在 .solve 之后使用 B=BR.value+1j*BI.value
将它们组合起来 问题中的另一个错误是将约束设为 LMI>=0。对于 SDP,应使用 LMI>>0。 最后一件事是使用 CVXOPT 求解器而不是标准 SCS,因为它不能处理超过 2x2 的矩阵。 该代码证明在数学上是正确的,因为它总是最小化残差函数

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

print('The residule',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)))