About CVX Illegal operation: log( {convex} )

Uncategorized
Apr 8, 2022
D

Part of convex function is as follows, and it’s convex
1649385082(1)
I try to use CVX to solve this problem, but the solver always failed.
and this is my code:
function [q1,q2,optval_traj] = Trajectory(a1,a2,p1,p2,q1_pre,q2_pre,w)

global K N T noise H_min H_max v_max v_min d_min h_k h_m;

V1 = v_minT/N;
V2 = v_max
T/N;

d1=zeros(K,N);
d2=zeros(K,N);
for k=1:K
d1(k,:)=sum_square_abs(q1_pre-w(:,:,k));
d2(k,:)=sum_square_abs(q2_pre-w(:,:,k));
end

temp=ones(K,1)p1(h_kh_m)^2./d1.^2+ones(K,1)p2(h_kh_m)^2./d2.^2;
I1=2ones(K,1)p1(h_kh_m)^2./(log(2)d1.^3.(temp+noise));
I2=2ones(K,1)p2(h_kh_m)^2./(log(2)d2.^3.(temp+noise));

cvx_begin
cvx_solver Mosek
variable R_traj
variable q1(3,N) nonnegative
variable q2(3,N) nonnegative
variable S1(K,N)
variable S2(K,N)
expression g1(K,N)
expression g2(K,N)
expression R1_lb(K,N)
expression R2_lb(K,N)
expression sum(K,N)
expression t1(K,N)
expression t2(K,N)

    sum=ones(K,1)*p1*(h_k*h_m)^2./d1.^2+ones(K,1)*p2*(h_k*h_m)^2./d2.^2;

    R1_lb=-I1.*S1-I2.*S2+log(sum+noise)/log(2);
    R2_lb=-I1.*S1-I2.*S2+log(sum+noise)/log(2);
    
    for k=1:K
        for n=1:N
            t1(k,n)=(q1_pre(:,n)-w(:,n,k))'*(q1(:,n)-q1_pre(:,n));
            t2(k,n)=(q2_pre(:,n)-w(:,n,k))'*(q2(:,n)-q2_pre(:,n));
        end
    end

maximize (R_traj)
subject to

    sum(a1.*(R1_lb-log(ones(K,1)*p2*(h_k*h_m)^2.*inv_pos(S2)+noise)/log(2))+...
        a2.*(R2_lb-log(ones(K,1)*p1*(h_k*h_m)^2.*inv_pos(S1)+noise)/log(2)),2) >= N*R_traj;
    S1 <= d1+2*t1;
    S2 <= d2+2*t2;
    for n=1:N-1
        sum_square_abs(q1(:,n+1)-q1(:,n)) <= V2^2;
        sum_square_abs(q2(:,n+1)-q2(:,n)) <= V2^2;
    end
    for n=1:N-1
        sum_square_abs(q1_pre(:,n+1)-q1_pre(:,n))+2*sum((q1_pre(:,n+1)-q1_pre(:,n)).*(q1(:,n+1)-q1(:,n))) >= V1^2;
        sum_square_abs(q2_pre(:,n+1)-q2_pre(:,n))+2*sum((q2_pre(:,n+1)-q2_pre(:,n)).*(q2(:,n+1)-q2(:,n))) >= V1^2;
    end
    -sum_square_abs(q1_pre-q2_pre)+2*sum((q1_pre-q2_pre).*(q1-q2)) >= d_min^2;
    q1(:,1) == q1(:,N);
    q2(:,1) == q2(:,N);
    for n=1:N
        H_min <= q1(3,n) <= H_max;
        H_min <= q2(3,n) <= H_max;
    end

cvx_end

optval_traj = cvx_optval;
end
I have tried many many methods, but still cannot solve it, so how to express the problem properly in CVX?
I really appreciate your generous help.

J

\begin{array}{l} \log \left( {1 + \frac{C}{{{x^a}}}} \right) \le D{\rm{ \ can\ be\ expressed\ as}}\\ \left\{ \begin{array}{l} \log \left( {1 + {e^z}} \right) \le D{\rm{ }}\quad \to\quad {\rm{ log\_sum\_exp([0\ z])}} \le {\rm{D}}\\ \log C - a\log x \le z \quad \to\quad {\rm{ log(C) - a*log(x)}} \le z \end{array} \right. \end{array}

D
Replying to #2

Jack, I appreciate your reply. But I don’t know how to use this formulation in my case. Could you please explain it more clearly? Thank you very very much!

J
Replying to #3

You were asking how to express log(ones(K,1)*p2*(h_k*h_m)^2.*inv_pos(S2)+noise)/log(2) in your code. Here’s how:Define 2 new variable z and D , then replace log(ones(K,1)*p2*(h_k*h_m)^2.*inv_pos(S2)+noise)/log(2) with D, and add the inequalities I showed you above, which you will find they’re equivalent mathematically. About the use of log_sum_exp, see


About modeling (the process above) ,see
D
Replying to #4

Hi, Jack. Thank you so much for your advice. I followed your advice and modified my code. I define D as a matrix and z as a scalar. This part of code is as following
maximize (R_traj)
subject to
log_sum_exp(z1) <= D1;
log(ones(K,1)p2(h_kh_m)^2)./log(2)-2log(S1)./log(2) <= z1;
log_sum_exp(z2) <= D2;
log(ones(K,1)p1(h_kh_m)^2)./log(2)-2log(S2)./log(2) <= z2;
sum(a1.(R1_lb-D1)+a2.(R2_lb-D2),2) >= N*R_traj;
But when I try to run my code, I meet another error
无法将类型为 cvx 的值用作索引。

出错 Trajectory (第 67 行)
sum(a1.(R1_lb-D1)+a2.(R2_lb-D2),2) >= N*R_traj;
I don’t know how to handle this error. Could you please tell me more about it? Thank you vvvvery much!

J
Replying to #5

There must be some bug in your code. Its hard to guess because the information you provide is too little, and you did not format your code in a Mardown format. And, please translate the errors into English so the experts can read them.

D
Replying to #6

Thank you so much Jack. I will follow your advice as soon as possible. Thanks again.

J
Replying to #7

sorry i edit my previous comment, there was a mistake in the inequality of log_sum_exp,pls read them again.

D
Replying to #8

Thank you very much Jack. I edit my code according to your reply. There was another error

Illegal operation: {complex constant} - {concave}

the code is as follows
log(ones(K,1)*p2*(h_k*h_m)^2)./log(2)-2*log(S1)./log(2) <= z1;
What can I do to solver this problem?
I’m looking forward to your reply.
Thanks a lot.

J
Replying to #9

The error says {complex constant} - {concave}, therefore obviously the log(ones(K,1)*p2*(h_k*h_m)^2)./log(2) is the {complex constant}. So I guess ones(K,1)*p2*(h_k*h_m)^2 is <=0, which makes the log of it become a complex constant.

D
Replying to #10

I really really appreciate your help Jack. I will follow your advice. Thanks again.