📄 spcomp_nr_nrs.m
字号:
%ttt2=lambda_sp;
%ttt3=aa(:,index(I));
%ttt2=lambda_sp;
%v(sub_strt:fn)=v_load;
%lambda_sp=ttt1;
%===============================================================================
% Locate singular point of algebraic equations (Newton-Raphson-Seydel Algorithm)
%================================================================================
deltalambda_sp=-lambda_sp/(NRS_Steps); %step-size while controlling the smallest eigenvalue of Dyg
for k=1:NRS_Steps+(0.51)*NRS_Steps
ConvergenceFlag=0;
for j=1:round(MaxIterations/ReportCycle),
t0=clock;
for i=1:ReportCycle,
x_sub0=x(sub_strt:fn);
alpha_sp0=alpha_sp;
v0=v(sub_strt:fn);
[f,J]=eval([CurrentSystem,'(data,x,[0;param],v)']);
J=full(J);
%the following is based on new parameterization,08/18/00
JJ_sp=[ J(sub_strt+1:fn+1,sub_strt:fn) zeros(2*no_pq,2*no_pq) (J(sub_strt+1:fn+1,1:mm))*(x_inter)
J(sub_strt+1:fn+1,fn+sub_strt:2*fn) J(sub_strt+1:fn+1,sub_strt:fn)-lambda_sp*eye(2*no_pq) J(sub_strt+1:fn+1,fn+1:fn+mm)*(x_inter)
zeros(1,2*no_pq) (v(sub_strt:fn))'/norm(v(sub_strt:fn)) 0
];
ff_sp=[f(sub_strt+1:fn+1)
(J(sub_strt+1:fn+1,sub_strt:fn)-lambda_sp*eye(2*no_pq))*v(sub_strt:fn)
norm(v(sub_strt:fn))-1
];
delta_sp=-sparse(JJ_sp)\ff_sp;
x(sub_strt:fn)=x_sub0+delta_sp(1:2*no_pq);
x(no_gen:(no_gen-1)+no_pv+2*no_pq)=x(sub_strt:fn);
v(sub_strt:fn)=v0+delta_sp(2*no_pq+1:4*no_pq);
alpha_sp=alpha_sp0+delta_sp(4*no_pq+1);
x(1:mm)=[(1-alpha_sp)*x_up(1:mm)+alpha_sp*x_low(1:mm)];%11/17/00
%angle_temp=x(1:mm);
%for i=1:length(angle_temp)
%angle_temp(i)=unwrap(angle_temp(i),2*pi);
%end
%x(1:mm)=angle_temp;
%x_temp=[(1-alpha_sp)*(x_up.*a)+alpha_sp*(x_low.*a)]; %08/18/00
%x=x.*a1+x_temp; % 08/18/00
end
% Define the errors in states, eigenvector and paramater
%===========================================================================================
AbsError=max([abs(x(sub_strt:fn)-x_sub0);abs(v(sub_strt:fn)-v0);abs(alpha_sp-alpha_sp0)]);
if (x_sub0==0)&(v0==0)
RelError='NA';
else
RelError=AbsError/max([abs(x_sub0);abs(v0);abs(alpha_sp0)]);
end
% set LF control control errors
set(AbsErrorDisp,'String',num2str(AbsError));
if isstr(RelError)
set(RelErrorDisp,'String',RelError);
else
set(RelErrorDisp,'String',num2str(RelError));
end
set(NumIterations,'String',num2str(j*ReportCycle));
set(IterationTime,'String',num2str(etime(clock,t0)/ReportCycle));
if (AbsError<=LFAbsTol) ...
& ((~isstr(RelError)) ...
& (RelError<=LFRelTol) ...
| isstr(RelError))
ConvergenceFlag=1;
break;
end
end
if ConvergenceFlag==0
'NRS Failed to Converge'
break;
end
if k==NRS_Steps+1
Dyg=J(sub_strt+1:fn+1,sub_strt:fn); % The matrix Dyg at the singular point
[n_sp,m_sp]=size(AA_sp); % index
XX_sing=x; % singular point
vpoc_sp=v(sub_strt:fn); % right eigenvector corresponding to zero eigenvalue of Dyg(x,y)
mismatch=f(1:no_gen); % real power mismatch at the singular point
lamda_smallest=lambda_sp; % zero eigenvalue of Dyg
wpoc_sp=-null(J(sub_strt+1:fn+1,sub_strt:fn)'); % left eigenvector corresponding to zero eigenvalue of Dyg(x,y)
if ~exist('Total_mis'),Total_mis=[];end
Total_mis=[Total_mis mismatch]; % real power mismatches at different singular points
if ~exist('Total_sing'),Total_sing=[];end
Total_sing=[Total_sing XX_sing]; % singular points
end
XX_sp=[XX_sp x];
AA_sp=[AA_sp alpha_sp];
PP_sp=[PP_sp param];
LAMBDA_SP=[LAMBDA_SP lambda_sp];
lambda_sp=lambda_sp+deltalambda_sp;
%eig_Dyg=[eig_Dyg eigs(J(sub_strt+1:fn+1,sub_strt:fn),1,'SM',options)];
%ee=eig(J(sub_strt+1:fn+1,sub_strt:fn));
%all_eig_Dyg=[all_eig_Dyg ee];
%sign_Dyg=[sign_Dyg sign(det(J(sub_strt+1:fn+1,sub_strt:fn)))];
%[ind1]=find((imag(ee)==0)&(real(ee)<0));
%[ind2]=find((imag(ee)==0)&(real(ee)>0));
%reg_index1=[reg_index1 length(ind1)];
%reg_index2=[reg_index2 length(ind2)];
%angle_temp=x(1:mm);
%for i=1:length(angle_temp)
%angle_temp(i)=unwrap(angle_temp(i),2*pi);
%end
%x(1:mm)=angle_temp;
end
%Back to NR algorithm
[n_rows_sp,n_cols_sp]=size(AA_sp);
delta_alpha_sp=-(AA_sp(n_cols_sp))/(NR_steps);
for k=1:2*NR_steps+1
ConvergenceFlag=0;
for j=1:round(MaxIterations/ReportCycle),
t0=clock;
for i=1:ReportCycle,
x_sub0=x(sub_strt:fn);
[f,J]=eval([CurrentSystem,'(data,x,[0;param],v)']);
J=full(J);
delta=-J(sub_strt+1:fn+1,sub_strt:fn)\f(sub_strt+1:fn+1);
x(sub_strt:fn)=x_sub0+delta;
x(no_gen:(no_gen-1)+no_pv+2*no_pq)=x(sub_strt:fn); %update load bus variables
end
%Error checking
AbsError=max(abs(x(sub_strt:fn)-x_sub0));
if x_sub0==0
RelError='NA';
else
RelError=AbsError/max(abs(x_sub0));
end
%set LF control control errors
set(AbsErrorDisp,'String',num2str(AbsError));
if isstr(RelError)
set(RelErrorDisp,'String',RelError);
else
set(RelErrorDisp,'String',num2str(RelError));
end
set(NumIterations,'String',num2str(j*ReportCycle));
set(IterationTime,'String',num2str(etime(clock,t0)/ReportCycle))
% Compare errors with the tolerances
%=========================================================================
if (AbsError<=LFAbsTol*0.001) ...
& ((~ischar(RelError)) ...
& (RelError<=LFRelTol*0.01) ...
| ischar(RelError))
ConvergenceFlag=1;
break;
end
end
if ConvergenceFlag==0
'NR fails to converge'
k
break;
end
XX_sp=[XX_sp x]; %update XX_sp
AA_sp=[AA_sp alpha_sp]; %update AA_sp
PP_sp=[PP_sp param]; %update PP_sp
alpha_sp=alpha_sp+delta_alpha_sp;
x(1:mm)=[(1-alpha_sp)*x_up(1:mm)+alpha_sp*x_low(1:mm)];
if alpha_sp >1.01
return;
end
end
t2=cputime-t1; %total simulation time
for i=1:k_temp
paramx(i)=param(i);
end
for i=1:no_pq
ii=k_temp+i;
jj=k_temp+1+2*(i-1);
paramx(jj)=param(ii);
paramx(jj+1)=param(ii+no_pq);
end
param=paramx;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -