clc,clear;
close all;
N=2;
delta=rand(1);
h=rand(N,1)+1i*rand(N,1);
cvx_begin
variable W(N,N) hermitian semidefinite
variables eta a b
minimize (real(trace(W)))
subject to
A=[eye(N),zeros(N,1);
zeros(1,N), -delta^2];
% B=[-W,-W*h;
% -h'*W,square_pos(norm(a))/2+square_pos(norm(b))/2-h'*W*h];
B=[-W,-W*h;
-h'*W,a*a/2+b*b/2-h'*W*h];
eta*A-B==hermitian_semidefinite(N+1)
cvx_end
When i solve this problem, something wrong, can you help me
The error is because the matrix constrained to be hermitian_semidefinite is not linear (affine) in he CVX variables. Specifically, a*a and b*b.
Change the program to declare variables a_squared b_squared, because the SDP constraint is linear (affine) in those variables.
cvx_begin
variable W(N,N) hermitian semidefinite
variables eta a_squared b_squared
minimize (real(trace(W)))
subject to
A=[eye(N),zeros(N,1);
zeros(1,N), -delta^2];
B=[-W,-W*h;
-h'*W,a_squared/2+b_squared/2-h'*W*h];
eta*A-B==hermitian_semidefinite(N+1)
cvx_end
Edit: Inserted missing /2 after b_squared.
thank you, but the change the variables a to a_squared can not guarantee the equivalence, can you help me?
I don’t understand why my formulation is not adequate for you. My formulation is “equivalent”: to your formulation. But unlike your formulation, it is a linear SDP, compliant with CVX’s rules.
The well known “trick” I used (it is so simple and obvious, it is not much of a trick) is very standard for linear SDP (LMI). It works provided there is no separate need for the unsquared original variables a and b elsewhere in the problem formulation.
If you need the values of a and b, place these statements after cvx_end .
a = sqrt(a_squared);
b = sqrt(b_squared);
Or you could just as well insert - before sqrt.
Note that I ignored the commented out version of B in your program.
