A SDR problem for beamforming in SWIPT..HELP!

I am doing a simulation of the paper ''Multiuser MISO Beamforming for Simultaneous Wireless Information and Power Transfer". However, I can’t get the similar result of that figure in the paper anyway. I really don’t know where is the problem of my code. I will really appreciate if someone can help me!
The problem is as below
To maximize the Energy Harvesting power under the SINR and transmition power constraint.
The SDR probleam is as piture below


Wi and WE are the beamforming matrixs of the specific user
h and g are the channel vectors (the coefficients of G are not important)

Main function is as below
K_ID = 4; % ID接收器个数
K_EH = 2; % EH接收器个数
SINR_dB = -5:2:25;
M = 4; % AP的天线数
N = 100; % 迭代次数 (可以理解为时间变量 每一个时刻的信道h g不同 服从瑞利分布)
P_noise = 10.^(-50/10)/1000; % 噪声功率
P_limit = 1; % 总发射功率
effi_EH = 0.5; % EH效率
alpha_EH = 1 / K_EH; % EH权重
attenuation_h_ID = 10.^(-70/10); % ID信道衰落
attenuation_g_EH = 10.^(-30/10); % EH信道衰落
% h = sqrt(attenuation_h_ID/2).(randn(K_ID,M)+1irandn(K_ID,M));
% g = sqrt(attenuation_g_EH/2).(randn(K_EH,M)+1irandn(K_EH,M));
h = randn(K_ID,M,N)+1irandn(K_ID,M,N);
g = randn(K_EH,M,N)+1i
randn(K_EH,M,N);
res_SDR1 = zeros(N,4,length(SINR_dB));
res_SDR1_average = zeros(length(SINR_dB),4);

for i = 1:length(SINR_dB)
for n = 1:N
fprintf(’%d / %d:\n’,n,N);
res_SDR1(n,:,i) = SDR1_Type1_cannotCancelling(M,SINR_dB(i),K_ID,K_EH,h(:,:,n),attenuation_h_ID,g(:,:,n),attenuation_g_EH,P_noise,P_limit,effi_EH,alpha_EH);
end
end

for j = 1:length(SINR_dB)
temp1 = res_SDR1(:,:,j);
res_SDR1_average(j,: ) = mean(temp1(temp1(:,1)~=inf & temp1(:,1)~=-inf & ~isnan(temp1(:,1)),:));
end

SDR solve function is as below (only show the case of K_ID = 4)
function [optvalue] = SDR1_Type1_cannotCancelling(M,SINR_dB,K_ID,K_EH,h,attenuation_h_ID,g,attenuation_g_EH,P_noise,P_limit,effi_EH,alpha_EH)
G = zeros(M,M);
for j = 1:K_EH
G = G+effi_EHalpha_EHg(j,:)’*g(j,:);
end
SINR = 10.^(SINR_dB/10);
fprintf("----------Solving SDR1: SINR=%ddB, K_ID=%d, K_EH=%d----------: ",SINR_dB,K_ID,K_EH);
if K_ID == 4
cvx_begin sdp quiet
variable W1(M,M) hermitian semidefinite
variable W2(M,M) hermitian semidefinite
variable W3(M,M) hermitian semidefinite
variable W4(M,M) hermitian semidefinite
variable WE(M,M) hermitian semidefinite

maximize(real(trace(G*W1)+trace(G*W2)+trace(G*W3)+trace(G*W4)+trace(G*WE)))
    subject to
        real(trace(h(1,:)'*h(1,:)*W1))/SINR-real(trace(h(1,:)'*h(1,:)*W2))-real(trace(h(1,:)'*h(1,:)*W3))...
                                           -real(trace(h(1,:)'*h(1,:)*W4))-real(trace(h(1,:)'*h(1,:)*WE))-P_noise/attenuation_h_ID/2 >= 0
        real(trace(h(2,:)'*h(2,:)*W2))/SINR-real(trace(h(2,:)'*h(2,:)*W1))-real(trace(h(2,:)'*h(2,:)*W3))...
                                           -real(trace(h(2,:)'*h(2,:)*W4))-real(trace(h(2,:)'*h(2,:)*WE))-P_noise/attenuation_h_ID/2 >= 0
        real(trace(h(3,:)'*h(3,:)*W3))/SINR-real(trace(h(3,:)'*h(3,:)*W1))-real(trace(h(3,:)'*h(3,:)*W2))...
                                           -real(trace(h(3,:)'*h(3,:)*W4))-real(trace(h(3,:)'*h(3,:)*WE))-P_noise/attenuation_h_ID/2 >= 0
        real(trace(h(4,:)'*h(4,:)*W4))/SINR-real(trace(h(4,:)'*h(4,:)*W1))-real(trace(h(4,:)'*h(4,:)*W2))...
                                           -real(trace(h(4,:)'*h(4,:)*W3))-real(trace(h(4,:)'*h(4,:)*WE))-P_noise/attenuation_h_ID/2 >= 0
        real(trace(W1)+trace(W2)+trace(W3)+trace(W4)+trace(WE)) <= P_limit
        W1 ==  hermitian_semidefinite(M)
        W2 ==  hermitian_semidefinite(M)
        W3 ==  hermitian_semidefinite(M)
        W4 ==  hermitian_semidefinite(M)
        WE ==  hermitian_semidefinite(M)
    cvx_end
    fprintf('%s  %f\n',cvx_status,cvx_optval*attenuation_g_EH/2);
    optvalue = [cvx_optval*attenuation_g_EH/2,K_ID,K_EH,SINR_dB];

end
end

My problem
I promise I have seem many other similar topic of this forum. To let the scale of the variables to be 1-order, I doesn’t set the attenuation coefficients of channel vector at first, while Divide P_noise by attenuation_h_ID/2 and multiply the cvx_optval by attenuation_g_EH/2 as you can see. However, although CVX can solve the problem, namely the cvx_status is solved, the results are completely different from the results in the paper. Can someone help me to see what is wrong in my code or are there some necessary informations I miss?

can anyone help me? It confuse me several days~ T.T

this is my result vs. paper’s result

Is that reasonable ???

You can’t expect the forum readers to understand the notation or conventions used in the problem, nor to have subject matter knowledge for the problem being solved.

Discrepancies could arise due to incorrect formulation in CVX, or differences in problem input data. Given your use of random number inputs, have you verified that the input probability distributions match those used in the paper? if they do, is the result averaged over some number of random problem instantiations, and do the differences with the paper’s results exceed the random variation (uncertainty) expected due to averaging the given number of Monte Carlo replications?

First of all, thank you for your answer, but I have noticed everything you said and have done these things, it still doesn’t work :pensive: