I have design a simple optimization code of the precoding matrix in the downlink MIMO scenario.
% Parameters
M = 4; % BS antennas
K = 5; % Users
sigma = db2pow(-80); % Noise power
SINR_th = 1; % SINR threshold
% Random Gaussian channel
H_cas = (randn(K, M) + 1i*randn(K, M)) / sqrt(2);
% Optimizing the precoding
cvx_begin
cvx_solver mosek
variable W(M, M, K) complex hermitian semidefinite
minimize( trace(sum(W, 3)) )
subject to
for iter_k = 1:K
h_k = H_cas(iter_k, :).' * conj(H_cas(iter_k, :));
interference = real(trace(h_k * (sum(W, 3) - W(:, :, iter_k))));
real(trace(h_k * W(:, :, iter_k))) >= SINR_th * (interference + sigma);
end
cvx_end
% Verifying
gamma = zeros(1, K);
for iter_k = 1: K
h_k = H_cas(iter_k, :).' * conj(H_cas(iter_k, :));
E_k = real(trace(h_k * W(:, :, iter_k)));
E_m = real(trace(h_k * (sum(W, 3) - W(:, :, iter_k))));
gamma(iter_k) = E_k/(E_m + sigma);
end
disp(gamma);
My problem is: The optimization problem W cannot make the SINR \ge 1 hold.
The following is the running log of this code:
Calling Mosek 9.1.9: 85 variables, 5 equality constraints
------------------------------------------------------------
MOSEK Version 9.1.9 (Build date: 2019-11-21 11:34:40)
Copyright (c) MOSEK ApS, Denmark. WWW: mosek.com
Platform: Windows/64-X86
Problem
Name :
Objective sense : min
Type : CONIC (conic optimization problem)
Constraints : 5
Cones : 0
Scalar variables : 5
Matrix variables : 5
Integer variables : 0
Optimizer started.
Presolve started.
Linear dependency checker started.
Linear dependency checker terminated.
Eliminator started.
Freed constraints in eliminator : 0
Eliminator terminated.
Eliminator - tries : 1 time : 0.00
Lin. dep. - tries : 1 time : 0.00
Lin. dep. - number : 0
Presolve terminated. Time: 0.00
Problem
Name :
Objective sense : min
Type : CONIC (conic optimization problem)
Constraints : 5
Cones : 0
Scalar variables : 5
Matrix variables : 5
Integer variables : 0
Optimizer - threads : 12
Optimizer - solved problem : the primal
Optimizer - Constraints : 5
Optimizer - Cones : 0
Optimizer - Scalar variables : 5 conic : 0
Optimizer - Semi-definite variables: 5 scalarized : 180
Factor - setup time : 0.00 dense det. time : 0.00
Factor - ML order time : 0.00 GP order time : 0.00
Factor - nonzeros before factor : 15 after factor : 15
Factor - dense dim. : 0 flops : 4.19e+04
ITE PFEAS DFEAS GFEAS PRSTATUS POBJ DOBJ MU TIME
0 1.3e+01 0.0e+00 4.1e+01 0.00e+00 4.000000000e+01 0.000000000e+00 1.0e+00 0.02
1 1.9e+00 2.2e-16 2.8e+00 8.97e-01 6.441256528e+00 2.573274372e-09 1.5e-01 0.03
2 1.6e-01 2.4e-15 6.6e-02 8.91e-01 5.577200774e-01 7.878263112e-09 1.2e-02 0.03
3 8.2e-05 3.3e-15 5.9e-07 9.98e-01 2.890545069e-04 8.480372864e-09 6.3e-06 0.03
4 3.4e-08 2.4e-15 5.3e-12 1.00e+00 1.294791667e-07 8.483527075e-09 2.6e-09 0.05
5 8.5e-09 2.6e-15 8.7e-13 7.98e-01 5.221510783e-08 1.634224410e-08 6.6e-10 0.05
6 3.1e-09 2.1e-15 3.5e-13 1.79e-01 7.050103158e-08 4.688096425e-08 2.4e-10 0.05
7 6.4e-10 2.8e-15 4.1e-14 4.94e-01 7.101180539e-08 6.496732572e-08 5.0e-11 0.05
Optimizer terminated. Time: 0.06
Interior-point solution summary
Problem status : PRIMAL_AND_DUAL_FEASIBLE
Solution status : OPTIMAL
Primal. obj: 7.1011805391e-08 nrm: 1e-08 Viol. con: 4e-09 var: 0e+00 barvar: 0e+00
Dual. obj: 6.4967325724e-08 nrm: 6e+00 Viol. con: 0e+00 var: 4e-16 barvar: 9e-15
Optimizer summary
Optimizer - time: 0.06
Interior-point - iterations : 7 time: 0.05
Basis identification - time: 0.00
Primal - iterations : 0 time: 0.00
Dual - iterations : 0 time: 0.00
Clean primal - iterations : 0 time: 0.00
Clean dual - iterations : 0 time: 0.00
Simplex - time: 0.00
Primal simplex - iterations : 0 time: 0.00
Dual simplex - iterations : 0 time: 0.00
Mixed integer - relaxations: 0 time: 0.00
------------------------------------------------------------
Status: Solved
Optimal value (cvx_optval): +7.10118e-08
0.9488 0.8835 0.8828 0.8804 0.9027
The last line is my verification of users’ SINRs, which are all less than 1.
I try to use the sdpt3 solver, and this problem disappears. So, why does this weird problem occur?