Does this text about cvx is right for cvx dcprules ? cvx didn’t report an error,but the result is not correct?
I am trying to solve a cvx problem like this
max 0.5+<H,X>/const
s.t. <A_i,X>=B_i
0.5+ <H,X>/const <= 0.5
and X is a semidefinite hermitian matrix,H and each A_i is const matrix.The model is just a simple model.
<H,X> reprents that Hadamard multiply between matrix H and matrix X,then,sum over all then elements of the outcom matrix.
Then the code is listed like this:
clear;clc
ksi=0.20; % 损耗系数的值
e_ali=0.015 ; %校准错误率
L=80 ; %设置距离 ,单位为km
ita_det=0.145; %设置探测器的探测效率
p_dc=6.02e-6 ; %设置暗计数率
alpha=0.1; %设置双方发送的相干态的平均光子数
ita=ita_det*10^(-ksi*L/10.0);%计算整体透过率
alpha_in=alpha*ita ;
P_pass=( p_dc+(1-p_dc )*(1-exp(-2*alpha_in ) ) ) *(1-p_dc) + (1-p_dc)*exp(-2*alpha_in)*p_dc ;%计算探测器的响应率
E_bit=(e_ali*(1-p_dc)^2*(1-exp(-2*alpha_in))+(1-p_dc)*exp(-2*alpha_in)*p_dc)/P_pass; %计算比特误码率
%接下来建立多个稀疏矩阵,挑选出Gram矩阵中的特定的一些元素
m=[1 17 2 18]; %横坐标
n=[4 20 3 19]; %纵坐标
v=[1 -1 -1 1]; %非零值
H_1=sparse(m,n,v,48,48);%H_1矩阵为创建相位误码率使用
%建立第一个等式约束
m=[1 2 3 4 17 18 19 20 ];
n=[1 2 3 4 17 18 19 20 ];
v=[ 1 1 1 1 1 1 1 1];
H_2=sparse(m,n,v,48,48);%H_2为创建第一个约束中的x基中的响应率使用
suoyin_2=sub2ind([48,48],m,n);
m=[5 6 7 8 21 22 23 24];
n=[5 6 7 8 21 22 23 24];
v=[ 1 1 1 1 1 1 1 1];
H_3=sparse(m,n,v,48,48);%H_3为创建第一个约束中的y基中的响应率使用
suoyin_3=sub2ind([48,48],m,n);
%建立第二个等式约束
m=[ 2 3 18 19];
n=[ 2 3 18 19];
v=[1 1 1 1];
H_4=sparse(m,n,v,48,48);%H_4为创建第二个约束中的x基中误码率使用
suoyin_4=sub2ind([48,48],m,n);
m=[6 7 22 23];
n=[6 7 22 23];
v=[1 1 1 1];
H_5=sparse(m,n,v,48,48);%H_5为创建第二个约束中的y基中误码率使用
suoyin_5=sub2ind([48,48],m,n);
%下面建立第三个等式约束
lambda_0=zeros(256,1);%这个矢量存储等式约束左边的值
index_0=zeros(256,1);%储存等式约束右边的与Gram矩阵的相关项的横坐标
index_1=zeros(256,1);%储存等式约束右边的与Gram矩阵的相关项的纵坐标
fuzhu=[1 -1 1i -1i];%引入一个辅助向量为了计算相干态的內积
ind=0;
for w=1:4
for x=1:4
for y=1:4
for z=1:4
ind=ind+1;
xubu=exp(conj(fuzhu(w))*fuzhu(x)*alpha+conj(fuzhu(y))*fuzhu(z)*alpha-2*alpha);
lambda_0(ind)=xubu;
if w < 3
if y<3
index_0(ind)=1+2*( ~mod(w,2))+~mod(y,2);
else
index_0(ind)=1+8+2*( ~mod(w,2))+~mod(y,2);
end
else
if y<3
index_0(ind)=1+12+2*( ~mod(w,2))+~mod(y,2);
else
index_0(ind)=1+4+2*( ~mod(w,2))+~mod(y,2);
end
end
if x<3
if z < 3
index_1(ind)=1+2*( ~mod(x,2))+~mod(z,2);
else
index_1(ind)=1+8+2*( ~mod(x,2))+~mod(z,2);
end
else
if z<3
index_1(ind)=1+12+2*( ~mod(x,2))+~mod(z,2);
else
index_1(ind)=1+4+2*( ~mod(x,2))+~mod(z,2);
end
end
end
end
end
end
index_all_1=sub2ind([48,48],index_0,index_1);
index_all_2=sub2ind([48,48],index_0+16,index_1+16);
index_all_3=sub2ind([48,48],index_0+32,index_1+32);
cvx_begin sdp
variable G(48,48) hermitian semidefinite ;
E_ph= 0.5+ ( 0.5*sum(sum(H_1.*G))+0.5* conj( sum(sum(H_1.*G))))/4/P_pass;
maximize( E_ph)
subject to
P_pass == 0.25*sum(sum(G.*H_2)) ;
P_pass == 0.25*sum(sum(G.*H_3)) ;
E_bit * P_pass == 0.25*sum(sum(G.*H_4)) ;
E_bit * P_pass == 0.25*sum(sum(G.*H_5)) ;
lambda_0 == G(index_all_1)+G(index_all_2)+G(index_all_3);
E_ph<=0.5
cvx_end
R_min=P_pass*(1-E_ph*log2(E_ph)-E_bit*log2(E_bit))
in my code ,I set e_ph<=0.5,but whenever i change the value of parameters,cvx always give me a outcome e_ph=0.5,it seems like that the constraints that i set doesn’t work.and mostly, i get the value of cvx_ipbnd is inf.and cvx_status if solved.cvx didn’t report an error,but the result is not right
Thank you very much!