% function [wu,wm,beta1]=Passive_Get_W(para,theta,Channel_BI,Channel_IuU,Channel_ImU,Channel_uUmU)
%{
Function: Get the beamformer W and the splitting factor beta
Author:Lidong Liu
Data:2024/3/4
2024/3/
%}
clear all;
clc;
para.K=2;
para.Nt=8;
para.M=20;
para.SINRu=10^(0.1*-10);
para.SINRm=10^(0.1*-10);
para.Power=1;
theta=exp(1i*rand(para.M,1)*2*pi);
Theta=diag(theta);
Noise_Power=10^(0.1*(-100));
%% Get the effective channel
[Channel_BI,Channel_IuU,Channel_ImU,Channel_uUmU,g]=Channel(para);
Channel_k=zeros(1,para.Nt);
Hk=zeros(para.Nt,para.Nt);
Channel_k=Channel_ImU'*Theta*Channel_BI;
Channel_k=Channel_k/sqrt(Noise_Power);
Hk=Channel_k*Channel_k';
Channel_K=zeros(1,para.Nt);
HK=zeros(para.Nt,para.Nt);
Channel_K=Channel_IuU'*Theta*Channel_BI;
Channel_K=Channel_K/sqrt(Noise_Power);
HK=Channel_K*Channel_K';
beta_0=0.5;
%% Get the initialization of the Wu,Wm
% [Wu_0,Wm_0]=Initialization_W_beta(para,HK,Hk,g,beta_0);
wu_0=sqrt(para.Power*0.5)*(randn(para.Nt,1)+1i*randn(para.Nt,1))/...
norm((randn(para.Nt,1)+1i*randn(para.Nt,1))*(randn(para.Nt,1)+1i*randn(para.Nt,1))',2);
Wu_0=wu_0*wu_0';
wm_0=sqrt(para.Power*0.5)*(randn(para.Nt,1)+1i*randn(para.Nt,1))/...
norm((randn(para.Nt,1)+1i*randn(para.Nt,1))*(randn(para.Nt,1)+1i*randn(para.Nt,1))',2);
Wm_0=wm_0*wm_0';
l0=trace(Hk*Wm_0)/(trace(Hk*Wu_0)+1);
e=sqrt(trace(Hk*Wu_0)/l0);
q0=sqrt(beta_0*g*trace(HK*(Wm_0+Wu_0)));
m0=sqrt((1-beta_0)*trace(HK*Wu_0));
Initial_Value=min(trace(Wu_0+Wm_0));
Record1=[Initial_Value];
Flag1=1;
Counter=0;
Max_Times=9;
while Flag1
Counter=Counter+1;
cvx_begin quiet
cvx_solver SeDuMi%mosek%SeDuMi
cvx_expert true
variable beta1
variable Wu(para.Nt,para.Nt) hermitian %complex
variable Wm(para.Nt,para.Nt) hermitian %complex
variable l
variable q
variable m
variable p
Wu==hermitian_semidefinite(para.Nt);
Wm==hermitian_semidefinite(para.Nt);
2*real(m0*m)-square(m0)>=para.SINRu;
beta1>=0;
beta1-1<=0;
real(para.SINRm*trace(HK*Wu))+para.SINRm*inv_pos(1-beta1)-real(trace(HK*Wm))<=0;
square(e*l)+square(trace(Hk*Wu)*inv_pos(e))<=2*real(trace(Hk*Wm))-2*l;
[beta1*g,q;q,trace(HK*(Wu+Wm))]==hermitian_semidefinite(2);
real(2*real(q0*q)-square(real(q0)))>=para.SINRm-l;
[1-beta1,m;m,trace(HK*Wu)]==hermitian_semidefinite(2);
minimize(real(trace(Wu+Wm)))
cvx_end
Flagg=1;
if strcmp(cvx_status,'Solved') || strcmp(cvx_status,'Inaccurate/Solved')
Updated_l=l;
Updated_q=q;
Updated_m=m;
Updated_p=p;
Updated_e=sqrt(trace(Hk*Wu)/l0);
Updated_Wu=Wu;
Updated_Wm=Wm;
Updated_beta1=beta1;
Updated_Value=cvx_optval;
else
Flagg=0;
break;
end
Record1=[Record1,Updated_Value];
if Counter>Max_Times
Flag1=0;
Final_p=Updated_p;
Final_Wu=Updated_Wu;
Final_Wm=Updated_Wm;
Final_beta1=Updated_beta1;
else
l0=Updated_l;
q0=Updated_q;
m0=Updated_m;
p0=Updated_p;
e=Updated_e;
Wu_0=Updated_Wu;
Wm_0=Updated_Wm;
beta_0=Updated_beta1;
Initial_Value=Updated_Value;
end
end
if Flagg==1
Obj=Record1(1,length(Record1));
beta1=Final_beta1;
else
beta1=zeros(1,para.M);
Obj=0;
end
figure
plot(0:length(Record1)-1,Record1)
Based on the value of `counter, it appears that this error occurred on the 1st iteration.
I don 't know whether this is due to installation problem, bug, non-nice data, or something else. Try another solver, such as SDPT3, and Mosek if available to you. if that doesn’t work, try a new MATLAB session, or reinstalling CVX in a new MATLAB session.
And do not use quiet
until you can get through several iterations without error.
1 Like