CVXPY:dcperor:问题不符合DCP规则

2024-09-29 21:34:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在LMI约束下编写一个解决B(2,1)的问题代码

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

Vc是一个标量变量

越来越

&燃气轮机;“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

Tags: importasnprandomvariablecpshaperf
1条回答
网友
1楼 · 发布于 2024-09-29 21:34:08

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

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

每次运行时,print('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)))

相关问题 更多 >

    热门问题