%% 用matlab实现牛顿-拉夫逊法潮流计算 % xx=[VA;VM]
function [bus,branch,gen,w,YB,NN,LL,Ploss]=NF(bus,branch,gen)
%%
[BUS_I, BUS_TYPE, PD, QD, GS, BS, VM, VA, BASE_KV, ZONE, VMAX, VMIN] = idx_bus;
[F_BUS, T_BUS, BR_R, BR_X, BR_B,BR_K, RATE,STATUS, NUM, NMAX,COST,BFail,MTTR,BZONE,P_F,Q_F,P_T,Q_T] = idx_brch;
[BUS, PG, QG, QMAX, QMIN, GEN_STATUS, PMAX, PMIN, GFail,GZONE] = idx_gen;
%% 定义变量
min=0.0001; % 收敛精度要求
max_diatW=1.0; % 最大误差
Niterate=0; % 迭代次数
w=0; % 潮流收敛判据
Ploss=0; % 网损
NB=size(bus,1); % 节点数
NL=size(branch,1);
Bal=find(bus(:,BUS_TYPE)==3); % 寻找平衡节点
Bpv=find(bus(:,BUS_TYPE)==2); % 寻找PV节点
Bpq=find(bus(:,BUS_TYPE)==1); % 寻找PQ节点
%% 潮流计算
[YB,Yf,Yt]=form_y22(bus,branch,NB,NL); % 形成节点导纳矩阵
UM=bus(:,VM); % 电压幅值
UA=bus(:,VA); % 电压角度*(pi/180),PP,QQ
while max_diatW>min && w==0
[PP,QQ]=diatva(gen,UA,UM,YB,bus,NB);
diatW=[PP([Bpq;Bpv],:);QQ(Bpq,:)];
[Joc,NN,LL]=jmatrix(YB,UM,UA,NB,Bpv,Bpq); % 形成雅各比矩阵
max_diatW=max(abs(diatW));
CC=det(Joc);
if abs(CC)<1e-10
w=1; disp('潮流病态!');break;
else
diatU=Joc\diatW;
end%%% 修正 %%%
tt=size([Bpq;Bpv],1);
UA([Bpq;Bpv])=UA([Bpq;Bpv])+diatU(1:tt);
diatU(1:tt)=[];
UM(Bpq)=UM(Bpq)+diatU.*UM(Bpq);
Niterate=Niterate+1;
if Niterate>10
w=1; disp('潮流不收敛!');break;
else
%% 电压
bus(:,VM)=UM; % 电压幅值
bus(:,VA)=UA; % 电压角度
end
end
%% 平衡节点出力 PV节点无功出力 线路潮流
if w==0
p=0;q=0;
for k=1:NB
a=bus(Bal,VA)-bus(k,VA);
p=p+bus(Bal,VM)*bus(k,VM)*(real(YB(Bal,k))*cos(a)+imag(YB(Bal,k))*sin(a));
q=q+bus(Bal,VM)*bus(k,VM)*(real(YB(Bal,k))*sin(a)-imag(YB(Bal,k))*cos(a));
end
gen(Bal,PG)=bus(Bal,PD)+p;
gen(Bal,QG)=bus(Bal,QD)+q;
Npv=size(Bpv,1);
for k1=1:Npv
Qpv=0;
for k2=1:NB
a=bus(Bpv(k1,1),VA)-bus(k2,VA);
Qpv=Qpv+bus(Bpv(k1,1),VM)*bus(k2,VM)*(real(YB(Bpv(k1,1),k2))*sin(a)-imag(YB(Bpv(k1,1),k2))*cos(a));
end
t=find(gen(:,BUS)==Bpv(k1));
gen(t,QG)=bus(Bpv(k1,1),QD)+Qpv;
end
%%%%%%%%%%%%%%%%
%for k=1:NL
% nf=branch(k,F_BUS); nt=branch(k,T_BUS);
% Gij=real(YB(nf,nt)); Bij=imag(YB(nf,nt));
% t3=cos(bus(nf,VA)-bus(nt,VA));
% t4=sin(bus(nf,VA)-bus(nt,VA));
% if branch(k,BR_K) == 1
% nR=branch(k,BR_B)/2;
% branch(k,P_F)=bus(nf,VM)*bus(nt,VM)*(Gij*t3+Bij*t4)-bus(nf,VM)*bus(nf,VM)*Gij;
% branch(k,Q_F)=bus(nf,VM)*bus(nf,VM)*(Bij-nR)-bus(nf,VM)*bus(nt,VM)*(Bij*t3-Gij*t4);
% branch(k,P_T)=bus(nf,VM)*bus(nt,VM)*(Gij*t3-Bij*t4)-bus(nt,VM)*bus(nt,VM)*Gij;
% branch(k,Q_T)=bus(nt,VM)*bus(nt,VM)*(Bij-nR)-bus(nf,VM)*bus(nt,VM)*(Bij*t3+Gij*t4);
% else
% nR=branch(k,BR_K);
% branch(k,P_F)=bus(nf,VM)*bus(nt,VM)*(Gij*t3+Bij*t4)-bus(nf,VM)*bus(nf,VM)*Gij/nR;
% branch(k,Q_F)=bus(nf,VM)*bus(nf,VM)*Bij/nR-bus(nf,VM)*bus(nt,VM)*(Bij*t3-Gij*t4);
% branch(k,P_T)=bus(nf,VM)*bus(nt,VM)*(Gij*t3-Bij*t4)-bus(nt,VM)*bus(nt,VM)*Gij*nR;
% branch(k,Q_T)=bus(nt,VM)*bus(nt,VM)*Bij*nR-bus(nf,VM)*bus(nt,VM)*(Bij*t3+Gij*t4);
% end
%end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
V=bus(:,VM).*exp(1j*bus(:,VA));
Sf=V(branch(:,F_BUS)).*conj(Yf*V);
St=V(branch(:,T_BUS)).*conj(Yt*V);
branch(:,P_F)=real(Sf);branch(:,Q_F)=imag(Sf);
branch(:,P_T)=real(St);branch(:,Q_T)=imag(St);
%% %%%%% 网损 %%%%%%%%
Ploss=sum(gen(:,PG))-sum(bus(:,PD));
%Ploss2=sum(abs(branch(:,P_F)+branch(:,P_T)));
end
return;