R = log(1+a/x), where x is a variable.How to correctly represent this in CVX?

clc;
clear all;
close all;

K = 5; % WDS
H = 100; % m
B = 1*10^6; %Hz
sigma_2 = 10^(-14); % -110dB

C = 800; %cycles/bit,
beta_0 = 10^(-6);
F_max = 2 * 10^(9);
R_min = 1 * 10^(6);
r_e = 10;

a = randi([0, 1], 1, 5);%卸载决策变量
q_k1 = [100; 200];
q_k2 = [100; 600];
q_k3 = [300; 300];
q_k4 = [300; 500];
q_k5 = [200; 400];
q_k = [q_k1, q_k2, q_k3, q_k4, q_k5];

q0 = [400;400];

q_e = [800; 800];
q_b = [200; 200];
qi_u = q0;

P = 0.2 ;
Pu = 1;
for k = 1 : K
L(k) = 2 * 10^(5);
end

for k = 1 : K
d_ku(k) = (sum((q_k(:,k) - qi_u).^2)) + H^2;
h_ku(k) = beta_0/d_ku(k);

d_ke(k) = (norm(q_k(:,k) - q_e) - r_e)^2 + H^2;
h_ke_max(k) = beta_0/d_ke(k) ;

end

d_ub = sum((qi_u - q_b).^2) + H^2;
h_ub = beta_0/d_ub;

d_ue_max = (norm(qi_u - q_e) - r_e)^2 ;
Q = Pu * beta_0 / sigma_2;

iteration = 0;
result = ;
while 1

cvx_begin 

    variables T(1, K) q_u(2, 1) f(1, K) gama1 gama2 gama3 lamda 
    expressions Ri_ku(1, K) Ri_ub  

    
    Ri_ub = B * log(1 + Pu * h_ub / sigma_2) / log(2) - ...
       B * ((Pu * h_ub / sigma_2) * (sum((q_u - q_b).^2) - sum((qi_u - q_b).^2)))/...
       (d_ub) / ((1+Pu * h_ub / sigma_2) * log(2));

% R_ue_max = (B / Q) * (rel_entr(lamda,lamda + Q) + rel_entr(lamda + Q,lamda));
R_ue_max = B * log(1 + Q * inv_pos(lamda)) / log(2);

    for k = 1 : K
        Ri_ku(k) = B * log(1 + P * h_ku(k) / sigma_2) / log(2) - ...
            B * ((P * h_ku(k) / sigma_2) * (sum((q_k(:,k) - q_u).^2) -...
            sum((q_k(:,k) - qi_u).^2)))/ (d_ku(k)) / ((1+P * h_ku(k) / sigma_2) * log(2));
        
        R_ke_max(k) = B * log(1 + P * h_ke_max(k) / sigma_2) / log(2);
    end               
    

    minimize sum(T(1 : K)) 

    subject to
    for k = 1 : K
         a(k) * (L(k) * inv_pos(gama1) + L(k) * C * inv_pos(f(k))) + (1 - a(k)) * ...
            (L(k) * inv_pos(gama1) + L(k) * C * inv_pos(f(k)) + L(k) * inv_pos(gama2)) <= T(k); % C1
        
        R_min - Ri_ku(k) + R_ke_max(k) <= 0;  %C2
        
        (1 - a(k)) * R_min - (1 - a(k)) * Ri_ub + B * (1 - a(k)) * gama3 <= 0;  %C3
        
    end
    
    Ri_ku(1,:) >= gama1;  %C4
    
    Ri_ub >= gama2;  %C5
    

    R_ue_max <= gama3; %C6
    gama3 >= 0;
    
    lamda <= d_ue_max + 2 * (norm(qi_u - q_e) - r_e) * (qi_u - q_e)' * ...
        (q_u - qi_u) /(norm(qi_u - q_e)); %C7


    F_max >= sum(f(1:K));  %C8
    
    q_u(1,1) <= 800; %C9
    q_u(1,1) >= 0;
    
    q_u(2,1) <= 800; %C10
    q_u(2,1) >= 0;
   
cvx_end

result = [result,sum(T(1 : K))];
iteration = iteration +1;

qi_u = q_u;


if (length(result) >= 5) && (abs((result(end) - result(end-1))/result(end-1)) < 1e-4)
    break;
end


figure(1)
plot(result, '-*')

% xlabel(‘iteration’)
% ylabel(‘T’)

end

错误使用 cvx/log (line 64)
Disciplined convex programming error:
Illegal operation: log( {convex} ).

出错 SolveQF (line 70)
R_ue_max = B * log(1 + Q * inv_pos(lamda)) / log(2);

log(1+a/x) can be reformulated as 1/a*(rel_entr(x,x+a) + rel_entr(x+a,x))

BTW, it looks like you have some bad numerical scaling, which could cause numerical difficulties.

1 Like