# Illegal operation: {convex} + {complex affine} error

hi , when i write this expression in cvx for difference convex algorithm, i take this error. but when i run this term seperatly i take real answer but in cvx itteration not.
all matrixes are semidefinite matrix
QVhat = initial point for DC
QV is variable
Hsr are channle gain

a6 = -trace(Hsr’inv(nr + HsrQVhat*Hsr’)HsrQV);

Disciplined convex programming error:
Illegal operation: {convex} + {complex affine}

1 Like

1 Like
``````Ps = 30;
Pr = 20;
Ns = 3;
Nr = 3;
Nd = 3;
N = [Ns,Nr,Nd];
NN = max(N);
% % % % % % % % % % % channel noise
nr = eye(NN);
nd = eye(NN);
% % % % % % % % % % % scaling matrices
CS = [eye(Ns) zeros(Ns,Nr)];
CR = [zeros(Nr,Ns) eye(Nr)];
% % % % % % % % % % %
itermax = 50 ; %%%%% maximum number of itterations.
% % % % % % % % % % % % channel gains

Hsr = (1/sqrt(2)).*(randn(Nr,Ns) + 1i*randn(Nr,Ns));% Channel coefficients for Soure-Relay Link

Hsd =  (1/sqrt(2)).*(randn(Nd,Ns) + 1i*randn(Nd,Ns));% Channel coefficients for Soure-Destination Link

Hrd =  (1/sqrt(2)).*(randn(Nd,Nr) + 1i*randn(Nd,Nr));% Channel coefficients for Relay-Destination Link

Hsrd =  (1/sqrt(2)).*(randn(Nd,Ns+Nr) + 1i*randn(Nd,Ns+Nr));% Channel coefficients for {Soure,Relay}-Destination Link

QQhat = zeros (Ns,Ns);

QVhat = zeros (Ns,Ns);
% QQhat=1/2*(QQhat+QQhat')
Qnothat = zeros (Nr+Ns,Nr+Nd);
Throu=zeros(itermax,1);

for k = 1:itermax

cvx_begin SDP

variable QQ(Ns,Ns)  hermitian semidefinite
variable QV(Ns,Ns)  hermitian semidefinite
variable Qnot(Ns+Nr,Nr+Nd)  hermitian semidefinite

a1 = log_det(nr + Hsr*(QQ+QV)*Hsr');
a2 = log_det(nd + Hsd*QV*Hsd');
a3 = log_det((nr+nd) + Hsd*QV*Hsd' + Hsrd*Qnot*Hsrd');
a4 = log_det(nr + Hsr*QVhat*Hsr');
a5 = (trace(Hsr'*inv(nr + Hsr*QVhat*Hsr')*Hsr*(QVhat-QV)));
%            a6 = -trace(Hsr'*inv(nr + Hsr*QVhat*Hsr')*Hsr*QV);

Throuput = a1 ;
Throuput = Throuput + a2;
Throuput = Throuput + a3;
Throuput = Throuput + a4;
Throuput = Throuput + a5;
%   Throuput = Throuput + a6;

maximize Throuput

subject to
trace(QV+CS*Qnot*CS') <= Ps;
trace(CR*Qnot*CR') <= Pr;
Qnot-CS'*QQ*CS == semidefinite(Ns+Nr,Nr+Nd);
QQ == semidefinite(Ns,Ns);
QV == semidefinite(Ns,Ns);
cvx_end

QQhat = QQ;
QVhat = QV;
Qnothat = Qnot;
Throu(k) = cvx_optval;
end``````
1 Like

I get this errror:
Error using + (line 83)
Disciplined convex programming error:
Illegal operation: {concave} + {complex affine}

Error in (line 54)
Throuput = Throuput + a5;

`a6` is coming out complex on the 2nd time through the loop. If this is supposed to always be treal (if no roundoff error), hen just use real

`a6 = real(-trace(Hsr'*inv(nr + Hsr*QVhat*Hsr')*Hsr*QV));`

1 Like

yes i know but i dont want to use real , the expression is real but cvx does not recognize that.
if i dont ant to use real what should i do?

1 Like

If you know the expression would be real if computed without roundoff error, then use real as I showed (that will get rid of the imaginary part which CVX objects to, even if it is of tiny magnitude). if that is not the case, and you don’t want the real part, then you have a bad problem formulation.

1 Like

Can I understand your words is this way:CVX can not solve the problem in {convex} + {complex affine} form,and the only way to fix it is to reformulate the problem ？

1 Like

it is not possible to determine the convexity (curvature) of that. If part of an expression is not affine, the entire expression must evaluate to real in order for CVX to have any possibility of dealing with it.

Your first step is to prove that your optimization problem is convex.

1 Like