# SDP Programming: This linear matrix inequality appears to be unsymmetric

Hi,

I’m trying to implement the following code and I get the following warning for each of the inequality constraints of the CVX:
This linear matrix inequality appears to be unsymmetric. This is
very likely an error that will produce unexpected results. Please check
the LMI; and, if necessary, re-enter the model

I tried to use 0 <= sym(Delta * Z); for example but Matlab confused it with the symbolic function of its own. I also check the output of each optimization and it is exactly symmetric, so I don’t know why I’m getting such warning.
I would really appreciate if anybody has a solution for this.

``````p=10;
C=rand(p,p);
A=rand(p,p);

Sigma_n = rand(p,p); % generate a random n x n matrix
Sigma_n = 0.5*(Sigma_n+Sigma_n');
Sigma_n = Sigma_n + p*eye(p );

% %
Sigma_w=randn(p,p);
Sigma_w = 0.5*(Sigma_w+Sigma_w');
Sigma_w = Sigma_w + p*eye(p );
% %

D=10;
kmax=10;
mu=1e-3;
rho=1e1;

CSigmaC = C' / (Sigma_n) * C;
Delta = zeros(p);
Z = diag( D/p * ones(p,1) );    %   initialize Z to be psd
Lambda = A * Delta * A' + Sigma_w;
R = zeros(p );

for iter=1:kmax
% % % % % % % % % % % % % % % % % % % % %     Update Delta
cvx_begin quiet sdp
variable Delta(p,p) semidefinite symmetric
minimize( -p * (1/2) * log( det_rootn(Z) * det_rootn(Delta) ) + (1/rho) * norm( Lambda - A * Delta *A' - Sigma_w , 2 ) )
subject to
trace(Delta) <= D;
0 <= Delta * Z;
0 <= eye( p) - Delta * Z;
cvx_end

% % % % % % % % % % % % % % % % % % % % %     Update Z
cvx_begin quiet sdp
variable Z(p,p) semidefinite symmetric
minimize( -p * (1/2) * log( det_rootn(Z) * det_rootn(Delta) ) + (1/mu) * norm( Z - CSigmaC - inv(Lambda) + R , 2 ) )
subject to
0 <= Delta * Z;
0 <= eye(p) - Delta * Z;
cvx_end

% % % % % % % % % % % % % % % % % % % % %     Update Lambda
M = A* Delta * A' - Sigma_w;
N = inv( Z - CSigmaC + R);

%     cvx_begin quiet sdp
%     variable Lambda(p,p) semidefinite symmetric
%     minimize( (1/rho) * norm( Lambda - M , 2 ) + (1/mu) * norm( Lambda - N , 2 ) )
%     cvx_end

Lambda = ( mu * M + rho * N ) / ( rho + mu );

% % % % % % % % % % % % % % % % % % % % %     Update R
R=R + Z - CSigmaC - inv (Lambda);

end``````

Your first program runs without warning or error because Z is the identity matrix. Therefore, `Delta * Z` is symmetric.

The “Update Z” program produces the unsymmetric warning message because `Delta * Z` is the product of two symmetric matrices, which is not necessarily symmetric.You need to rethink your problem formulation.

1 Like