Hello! I’m trying to solve the conic optimization problem with Mosek. My code and the output is below. The matrix variable W
is a set of complex matrixes. No matter how I change the parameters and units, the result is too small, and W
is a real matrix. The problem seems to be with Q(:,:,k) = kron(W(:,:,k)',V);
because when I remove the kron operation, the result is normal. (V
is a constant matrix.) Do you have any suggestions for me? Thank you so much!
max_iteration = 10;
lamda = ones(param.K,param.K);
tau = zeros(param.K,1);
rho = log(1/param.pout);
for ite = 1:max_iteration
cvx_solver mosek_2
cvx_begin
variable W(param.Nt,param.Nt,param.K) complex
variable delta(param.K,1) nonnegative
variable omega(param.K,param.K) nonnegative
variable t(param.K,1) nonnegative
variable miu(param.K,1)
variable upsilon(param.K,1) nonnegative
expression Q(param.Nt*(param.N+1),param.Nt*(param.N+1),param.K)
expression R(param.Nt*(param.N+1),1)
expression c(param.K,1)
maximize (sum(delta))
subject to
% semidefinite
for k = 1:param.K
W(:,:,k) == hermitian_semidefinite(param.Nt);
end
% power
real(trace(sum(W,3))) <= param.Pmax;
% secrecy rate
for k = 1:param.K
1+omega(k,k)-tau(k)*(1+t(k)) >= delta(k);
end
% SOP
for k = 1:param.K
Q(:,:,k) = kron(W(:,:,k)',V);
R(:,k) = Q(:,:,k)*vec(param.Ge_hat);
c(k) = t(k)*param.Pnoise-real(vec(param.Ge_hat)'*R(:,k));
real(trace(Q(:,:,k)))+sqrt(2*rho)*miu(k)+rho*upsilon(k)-c(k) <= 0;
real(norm([vec(Q(:,:,k));sqrt(2)*R(:,k)])) <= miu(k);
upsilon(k)*eye(param.Nt*(param.N+1))-Q(:,:,k) == semidefinite(param.Nt*(param.N+1));
end
% NOMA SR
for k = 1:param.K
for j = k:param.K
x = omega(j,k);
y = real(trace(sum(W(:,:,k+1:end),3)*param.Gc(:,:,j)'*V*param.Gc(:,:,j)))+param.Pnoise;
pow_p(lamda(j,k)*x,2)+pow_p(y/lamda(j,k),2) <= 2*real(trace(W(:,:,k)*param.Gc(:,:,j)'*V*param.Gc(:,:,j)));
omega(j,k) >= omega(k,k);
end
end
% NOMA power
for k = 1:param.K
for i = 1:param.K
for j = i+1:param.K
real(trace(W(:,:,i)*param.Gc(:,:,k)'*V*param.Gc(:,:,k))) >= real(trace(W(:,:,j)*param.Gc(:,:,k)'*V*param.Gc(:,:,k)));
end
end
end
cvx_end
% update param
if contains(cvx_status,'Solved')
for k = 1:param.K
tau(k) = (1+omega(k,k))/(1+t(k));
for j = k:param.K
x = omega(j,k);
y = real(trace(sum(W(:,:,k+1:end),3)*param.Gc(:,:,j)'*V*param.Gc(:,:,j)))+param.Pnoise;
if x == 0
lamda(j,k) = lamda(j,k);
else
lamda(j,k) = sqrt(y/x);
end
end
end
end
end
This is the result of
W