I am working on maximizing the minimum user rate. During the process, I encountered a situation where all the inequality constraints are satisfied, but CVX outputs “Failed”. Could you help me take a look? The optimization variables wck and wpk are too small in magnitude, so I used scaling.
the result:The first few iterations were solved, but all subsequent ones failed.
Successive approximation method to be employed.
For improved efficiency, SDPT3 is solving the dual problem.
SDPT3 will be called several times to refine the solution.
Original size: 93 variables, 35 equality constraints
4 exponentials add 32 variables, 20 equality constraints
-----------------------------------------------------------------
Cones | Errors |
Mov/Act | Centering Exp cone Poly cone | Status
--------+---------------------------------+---------
4/ 4 | 5.380e+00 5.554e+00 0.000e+00 | Failed
2/ 2 | 3.671e+00 1.743e+00 0.000e+00 | Failed
4/ 4 | 1.522e+00 2.211e-01 0.000e+00 | Failed
2/ 2 | 2.624e-01 3.604e-03 0.000e+00 | Failed
0/ 0 | 0.000e+00 0.000e+00 0.000e+00 | Failed
0/ 0 | 0.000e+00 0.000e+00 0.000e+00 | Failed
-----------------------------------------------------------------
Status: Failed
Optimal value (cvx_optval): NaN
========== 不等式检查 ==========
----- 用户 1 -----
2^omega(1,1) = 1.405069e+05, rho(1,1) = 1.409150e+05, 违反 = 0.000000e+00, 满足? 是
2^omega(1,2) = 3.231066e+00, rho(1,2) = 3.241189e+00, 违反 = 0.000000e+00, 满足? 是
wck(1) = 3.134295e-13, 需要 >= 3.131795e-13, 违反 = 0.000000e+00, 满足? 是
wpk(1) = 2.053137e-13, 需要 >= 2.051741e-13, 违反 = 0.000000e+00, 满足? 是
(rho(1,1)-1)/sf2^2 = 1.409140e+03, <= 1.410054e+03, 违反 = 0.000000e+00, 满足? 是
(rho(1,2)-1)/sf2^2 = 2.241189e-02, <= 2.242450e-02, 违反 = 0.000000e+00, 满足? 是
----- 用户 2 -----
2^omega(2,1) = 1.405069e+05, rho(2,1) = 1.409150e+05, 违反 = 0.000000e+00, 满足? 是
2^omega(2,2) = 3.231066e+00, rho(2,2) = 3.241190e+00, 违反 = 0.000000e+00, 满足? 是
wck(2) = 3.134295e-13, 需要 >= 3.131795e-13, 违反 = 0.000000e+00, 满足? 是
wpk(2) = 2.053137e-13, 需要 >= 2.051741e-13, 违反 = 0.000000e+00, 满足? 是
(rho(2,1)-1)/sf2^2 = 1.409140e+03, <= 1.410054e+03, 违反 = 0.000000e+00, 满足? 是
(rho(2,2)-1)/sf2^2 = 2.241190e-02, <= 2.242450e-02, 违反 = 0.000000e+00, 满足? 是
总体判断:所有不等式满足 (违反 ≤ 1.000000e-06)
===============================
MAX-MIN-RSK:
10.2416
My CVX code:
noise = 10^(-13);
load('tur1_50.mat')
k_lam=0.1514;
lamda=530*10^-9;
rho=0.9*1.6*10^-19/(6.626*10^-34*3*10^8/lamda);
const = (exp(1) / 2 * pi);
% const = 1;
sf = 10^8;
sf2 = 10;
K=2;
N=2;
Pt = 1;
pc_pre = rand(N,1);
p_pre = rand(N,K);
% 计算总功率
total = sum(pc_pre.^2) + sum(p_pre(:).^2);
pc_pre = ones(N,1) * 0.1;
p_pre = ones(N,K) * 0.1;
pathl_r = zeros(N, K);
var_d = zeros(1, K);
tolerance = 1e-4;
tPrevious = -inf;
for k =1 : K
dist_d = 13;
var_d(k) = tur1_30(dist_d,2);
pathl_r(:,k) = 0.01*0.9*0.9/2/pi/(1-cos(10/180*pi))/cos(10/180*pi)*exp(-k_lam*dist_d)/dist_d.^2;
end
c_pre = [1;1];
maxIter = 20;
for iter = 1:maxIter
cvx_begin
cvx_solver sdpt3
variable p(N,K) nonnegative;
variable pc(N,1) nonnegative;
variable c(K) nonnegative;
variable omega(K,2) nonnegative;
variable rho(K,2) nonnegative;
variable wck(k) nonnegative;
variable wpk(k) nonnegative;
variable t;
expression akc(K);
expression bkc(K);
expression akp(K);
expression bkp(K);
maximize(t)
subject to
rth = 0;
for k = 1 : K
hk = pathl_r(:, k);
akc_pre(k) = sum_square_abs(hk' * p_pre);
bkc_pre(k) = square_abs(hk' * pc_pre);
bkp_pre(k) = square_abs(hk' * p_pre(:, k));
p_no_k = p_pre(:, [1:k-1, k+1:K]);
akp_pre(k) = sum_square_abs(hk' * p_no_k);
if iter == 1
wck_pre(k) = exp(4 * var_d(k)) * akc_pre(k) + noise;
wpk_pre(k) = exp(4 * var_d(k)) * akp_pre(k) + noise;
end
wck_pre(k) = max(wck_pre(k), exp(4 * var_d(k)) * akc_pre(k) + noise);
wpk_pre(k) = max(wpk_pre(k), exp(4 * var_d(k)) * akp_pre(k) + noise);
end
for k = 1 : K
hk = pathl_r(:, k);
akc(k) = sum_square_abs(hk' * p);
bkc(k) = square_abs(hk' * pc);
bkp(k) = square_abs(hk' * p(:, k));
p_no_k = p(:, [1:k-1, k+1:K]); % 删除第 k 列
akp(k) = sum_square_abs(hk' * p_no_k);
end
for k = 1 : K
hk = pathl_r(:, k);
exp4_vard = exp(4 * var_d(k));
arfa = c_pre(k)/sum(c_pre);
t <= c(k) + omega(k,2);
c(k) >= rth;
omega(k,2) >= rth;
sum(c) <= omega(k,1);
2^omega(k,1) <= rho(k,1);
2^omega(k,2) <= rho(k,2);
wck(k) * sf >= sf * (exp(4 * var_d(k)) * akc(k) + noise);
wpk(k) * sf >= sf * (exp(4 * var_d(k)) * akp(k) + noise);
(rho(k,1) - 1) / (sf2.^2) <= const * exp4_vard * (2 * real( pc_pre' * hk * hk' * pc) / (wck_pre(k) * sf2.^2) - ...
wck(k) * square_abs(hk' * pc_pre / (wck_pre(k) * sf2)));
(rho(k,2) - 1) / (sf2.^2) <= const * exp4_vard * (2 * real(p_pre(:, k)' * hk * hk' * p(:, k)) / (wpk_pre(k) * sf2.^2) - ...
wpk(k) * square_abs(hk' * p_pre(:, k) / (wpk_pre(k) * sf2)));
end
sum(pc.^2) + sum(sum(p.^2)) <= Pt;
cvx_end
% 在每次迭代的打印部分添加以下代码
fprintf('\n========== 不等式检查 ==========\n');
violation_flag = false;
tol = 1e-6; % 容差
for k = 1:K
hk = pathl_r(:, k);
exp4_vard = exp(4 * var_d(k));
fprintf('\n----- 用户 %d -----\n', k);
% 检查 2^omega <= rho
lhs1 = 2^omega(k,1);
rhs1 = rho(k,1);
viol1 = max(0, lhs1 - rhs1);
if viol1 <= tol
status1 = '是';
else
status1 = '否';
end
fprintf('2^omega(%d,1) = %e, rho(%d,1) = %e, 违反 = %e, 满足? %s\n', ...
k, lhs1, k, rhs1, viol1, status1);
lhs2 = 2^omega(k,2);
rhs2 = rho(k,2);
viol2 = max(0, lhs2 - rhs2);
if viol2 <= tol
status2 = '是';
else
status2 = '否';
end
fprintf('2^omega(%d,2) = %e, rho(%d,2) = %e, 违反 = %e, 满足? %s\n', ...
k, lhs2, k, rhs2, viol2, status2);
% 检查 wck >= 约束
lhs_wck = wck(k);
rhs_wck = exp(4 * var_d(k)) * akc(k) + noise;
viol_wck = max(0, rhs_wck - lhs_wck);
if viol_wck <= tol
status_wck = '是';
else
status_wck = '否';
end
fprintf('wck(%d) = %e, 需要 >= %e, 违反 = %e, 满足? %s\n', ...
k, lhs_wck, rhs_wck, viol_wck, status_wck);
% 检查 wpk >= 约束
lhs_wpk = wpk(k);
rhs_wpk = exp(4 * var_d(k)) * akp(k) + noise;
viol_wpk = max(0, rhs_wpk - lhs_wpk);
if viol_wpk <= tol
status_wpk = '是';
else
status_wpk = '否';
end
fprintf('wpk(%d) = %e, 需要 >= %e, 违反 = %e, 满足? %s\n', ...
k, lhs_wpk, rhs_wpk, viol_wpk, status_wpk);
% 检查 rho 的不等式
term1 = const * exp4_vard * (2 * real( pc_pre' * hk * hk' * pc) / (wck_pre(k) * sf2.^2) - ...
wck(k) * square_abs(hk' * pc_pre / (wck_pre(k) * sf2)));
lhs_rho1 = (rho(k,1) - 1) / (sf2.^2);
rhs_rho1 = term1;
viol_rho1 = max(0, lhs_rho1 - rhs_rho1);
if viol_rho1 <= tol
status_rho1 = '是';
else
status_rho1 = '否';
end
fprintf('(rho(%d,1)-1)/sf2^2 = %e, <= %e, 违反 = %e, 满足? %s\n', ...
k, lhs_rho1, rhs_rho1, viol_rho1, status_rho1);
term2 = const * exp4_vard * (2 * real(p_pre(:, k)' * hk * hk' * p(:, k)) / (wpk_pre(k) * sf2.^2) - ...
wpk(k) * square_abs(hk' * p_pre(:, k) / (wpk_pre(k) * sf2)));
lhs_rho2 = (rho(k,2) - 1) / (sf2.^2);
rhs_rho2 = term2;
viol_rho2 = max(0, lhs_rho2 - rhs_rho2);
if viol_rho2 <= tol
status_rho2 = '是';
else
status_rho2 = '否';
end
fprintf('(rho(%d,2)-1)/sf2^2 = %e, <= %e, 违反 = %e, 满足? %s\n', ...
k, lhs_rho2, rhs_rho2, viol_rho2, status_rho2);
if viol1 > tol || viol2 > tol || viol_wck > tol || viol_wpk > tol || viol_rho1 > tol || viol_rho2 > tol
violation_flag = true;
end
end
% 总体判断
if ~violation_flag
fprintf('\n总体判断:所有不等式满足 (违反 ≤ %e)\n', tol);
else
fprintf('\n总体判断:存在不等式违反 (违反 > %e)\n', tol);
end
fprintf('===============================\n\n');
t_history(iter) = t;
if(abs(t - tPrevious) <= tolerance)
break;
end
c_pre = c;
tPrevious = t;
p_pre = p;
pc_pre = pc;
wck_pre = wck;
wpk_pre = wpk;
end
disp('MAX-MIN-RSK:');