我试图在LMI约束下编写一个解决B(2,1)
的问题代码
R(2,1)=R0(2,1)+H(2,2)*B(2,1)
Vc是一个标量变量
越来越
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=BR.value+1j*BI.value
在
.solve
之后组合它们 问题中的另一个错误是将约束设置为LMI>=0
。对于SDP,应使用{CVXOPT
解算器代替标准的SCS
,因为它不能处理超过2x2个矩阵。 该代码在数学上是正确的,因为它总是最小化残差函数每次运行时,print('residule',abs(R0+np.matmul(H,B)))接近0。
正确的代码:
相关问题 更多 >
编程相关推荐