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)))
我正在尝试编写解决问题的代码 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)))