%本程序的功能是用牛顿——拉夫逊法进行潮流计算
% B1矩阵:1、支路首端号;2、末端号;3、支路阻抗;4、线路对地电纳(或变压器导纳);
% 5、支路的变比;6、支路首端处于K侧为1,1侧为0;
% 7、线路/变压器标识(0/1)变压器参数当支路首端处于K侧标识为1时归算至末端侧,0归算至首端侧
% B2矩阵:1、该节点发电机功率;2、该节点负荷功率;
% 3、PQ节点电压初始值,或平衡节点及PV节点电压的给定值
% 4、节点所接无功补偿并联电容(感)的电纳
% 5、节点分类标号:1为平衡节点(应为1号节点);2为PQ节点;3为PV节点;
clear;
isb=1; %input('请输入平衡母线节点号:isb=');
pr=1e-5; %input('请输入误差精度:pr=');
%---------------------------------------------------
n=10;%input('请输入节点数:n=');
nl=10;%input('请输入支路数:nl=');
B1=[1 2 3.4+12.8i 1.4e-4i 1 0 0;
1 4 5.1+19.2i 2.1e-4i 1 0 0;
2 3 4.25+16i 1.75e-4i 1 0 0;
4 5 4.25+16i 7e-4i 1 0 0;
1 3 5.1+19.2i 2.1e-4i 1 0 0;
6 4 5.95+22.4i 9.8e-4i 1 0 0;
2 7 1.78+53.89i 0 38.5/231 0 1;
3 8 1.49+48.02i 0 11/231 0 1;
4 9 1.49+48.02i 0 11/231 0 1;
5 10 2.46+70.17i 0 38.5/231 0 1] %input('请输入由支路参数形成的矩阵:B1=');
B2=[0 0 225.5 0 1;
0 0 220 0 2;
0 0 220 0 2;
0 0 220 0 2;
0 0 220 0 2;
120 0 231 0 3;
0 61.11+37.87i 35 0 2;
0 47.53+29.46i 10 0 2;
0 54.32+33.66i 10 0 2;
0 40.74+25.25i 35 0 2] %input('请输入各节点参数形成的矩阵:B2=');
%-------------------------------------------------------------
%n=4;%input('请输入节点数:n=');
%nl=4;%input('请输入支路数:nl=');
%B1=[1 2 4+16i 0 1 0 0;
%1 3 4+16i 0 1 0 0;
%2 3 2+8i 0 1 0 0;
%2 4 1.49+48.02i 0 11/110 0 1] %input('请输入由支路参数形成的矩阵:B1=');
%B2=[0 0 115 0 1;
%0 0 110 0 2;
%0 20+4i 110 0 2;
%0 10+6i 10 0 2] %input('请输入各节点参数形成的矩阵:B2=');
%-------------------------------------------------------------
Y=zeros(n);e=zeros(1,n);f=zeros(1,n);V=zeros(1,n);sida=zeros(1,n);S1=zeros(nl);
% % %-----------求导纳矩阵------------------------
for i=1:nl %从1到n1(总支路数)
if B1(i,7)==1 %-----------如果是变压器支路--------
if B1(i,6)==0 %左节点(首端)处于1侧
p=B1(i,1);q=B1(i,2);
else %左节点(首端)处于K侧
p=B1(i,2);q=B1(i,1);
end
Y(p,q)=Y(p,q)-1./(B1(i,3)*B1(i,5)); %非对角元
Y(q,p)=Y(p,q); %非对角元
Y(q,q)=Y(q,q)+1./(B1(i,3)*B1(i,5)^2); %对角元K侧
Y(p,p)=Y(p,p)+1./B1(i,3)+B1(i,4); %对角元1侧+励磁导纳
else %------------否则为线路支路--------------------
p=B1(i,1);q=B1(i,2);
Y(p,q)=Y(p,q)-1./B1(i,3); %非对角元
Y(q,p)=Y(p,q); %非对角元
Y(q,q)=Y(q,q)+1./B1(i,3)+B1(i,4)./2.0; %对角元j侧+线路电纳的一半
Y(p,p)=Y(p,p)+1./B1(i,3)+B1(i,4)./2.0; %对角元i侧+线路电纳的一半end
end
disp('导纳矩阵Y=');disp(Y);
%-----------给定各节点初始电压及给定各节点注入功率--------------------------
G=real(Y);B=imag(Y); %分解出导纳阵的实部和虚部
for i=1:n %给定各节点初始电压的实部和虚部
e(i)=real(B2(i,3));
f(i)=imag(B2(i,3));
V(i)=abs(B2(i,3)); %PV、平衡节点及PQ节点电压模值
end
for i=1:n %给定各节点注入功率
S(i)=B2(i,1)-B2(i,2); %i节点注入功率SG-SL
B(i,i)=B(i,i)+B2(i,4); %i节点无功补偿量(电纳值)
end
%==================用牛顿-拉夫逊法迭代求解非线性代数方程(功率方程)=======================
P=real(S);Q=imag(S); %分解出各节点注入的有功和无功功率
ICT1=0;IT2=1;N0=2*n;N1=N0+1;a=0; %迭代次数ICT1、a;不满足收敛要求的节点数IT2 while IT2~=0 % N0=2*n 雅可比矩阵的阶数;N1=N0+1扩展列IT2=0;a=a+1;
JZ=['Jacobi矩阵第(',num2str(a),')次消去运算'];JZ1=['Jacobi矩阵第(',num2str(a),')次回代运算'];JZ0=['功率方程第(',num2str(a),')次差值:'];
%----------------求取各个节点的功率及功率偏差及PV节点的电压偏差-------------------- for i=1:n %n个节点2n行(每节点两个方程P和Q或U) p=2*i-1;m=p+1;C(i)=0;D(i)=0;
for j1=1:n %第i行共n列(n个节点间互导纳及节点电压相乘即电流) C(i)=C(i)+G(i,j1)*e(j1)-B(i,j1)*f(j1);%Σ(Gij*ej-Bij*fj)
D(i)=D(i)+G(i,j1)*f(j1)+B(i,j1)*e(j1);%Σ(Gi j*fj+Bij*ej)
end
%求i节点有功和无功功率P',Q'的计算值
P1=C(i)*e(i)+f(i)*D(i);%节点功率P计算eiΣ(Gij*ej-Bij*fj)+fiΣ(Gij*fj+Bij*ej)
Q1=C(i)*f(i)-e(i)*D(i);%节点功率Q计算fiΣ(Gij*ej-Bij*fj)-eiΣ(Gij*fj+Bij*ej)
V2=e(i)^2+f(i)^2; %电压模平方
%===求取功率差及PV节点电压模平方差=========
if i~=isb %非平衡节点(PQ或PV节点)
if B2(i,5)~=3 %非PV节点(只能是PQ节点)
J(m,N1)=P(i)-P1; %PQ节点有功功率差J(m,N1)扩展列△P
J(p,N1)=Q(i)-Q1; %PQ节点无功功率差J(p,N1)扩展列△Q
else %PV节点==================
J(m,N1)=P(i)-P1; %PV节点有功功率差J(m,N1)扩展列△P
J(p,N1)=V(i)^2-V2; %PV节点电压模平方差J(p,N1)扩展列△U
end
end %(if i~=isb) 非平衡节点(PQ或PV节点)
end %(for i=1:n) n个节点2n行(每节点两个方程P和Q或U)
for m=1:N0
JJN1(m)=J(m,N1);
end
disp(JZ0);disp(JJN1);
%-------------判断功率偏差量及PV节点的电压偏差量是否满足要求-----------------
for k=3:N0 %除去平衡节点1、2号以外的所有节点
DET=abs(J(k,N1));
if DET>=pr %PQ节点的功率偏差量及PV节点的电压偏差量是否满足要求IT2=IT2+1; %不满足要求的节点数加1
end
end
ICT2(a)=IT2; %不满足要求的节点数;a为迭代次数
ICT1=ICT1+1; %迭代次数
if ICT2(a)==0; %当前不满足要求的节点数为零
break %退出迭代运算
end
%--------------------以上为求取各个节点的功率及功率偏差及PV节点的电压偏差-------------
%================= 求取Jacobi矩阵形成修正方程===================
for i=2:n %n个节点2n行(每节点两个方程P和Q或U)
if i~=isb %非平衡节点(PQ或PV节点)
if B2(i,5)~=3 %下面是针对PQ节点来求取Jacobi矩阵的元素===========
C(i)=0;D(i)=0;
for j1=1:n %第i行共n列(n个节点间互导纳及节点电压相乘即电流) C(i)=C(i)+G(i,j1)*e(j1)-B(i,j1)*f(j1);%Σ(Gij*ej-Bij*fj)
D(i)=D(i)+G(i,j1)*f(j1)+B(i,j1)*e(j1);%Σ(Gij*fj+Bij*ej)
end
for j1=2:n %第i行共n列(2n个Jacobi矩阵元素dP/de及dP/df或dQ/de及dQ/df)
if j1~=isb&j1~=i %非平衡节点&非对角元
X1=-G(i,j1)*e(i)-B(i,j1)*f(i); % X1=dP/de=-dQ/df=-X4
X2=B(i,j1)*e(i)-G(i,j1)*f(i); % X2=dP/df=dQ/de=X3
X3=X2; % X2=dp/df X3=dQ/de
X4=-X1; % X1=dP/de X4=dQ/df
p=2*i-1;q=2*j1-1;
J(p,q)=X3;m=p+1; % X3=dQ/de J(p,N)=DQ节点无功功率差J(p,N)=DQ;
J(m,q)=X1;q=q+1; % X1=dP/de J(m,N)=DP节点有功功率差J(m,N)=DP;
J(p,q)=X4;J(m,q)=X2; % X4=dQ/df X2=dp/df
elseif j1==i&j1~=isb %非平衡节点&对角元
X1=-C(i)-G(i,i)*e(i)-B(i,i)*f(i);% dP/de
X2=-D(i)+B(i,i)*e(i)-G(i,i)*f(i);% dP/df
X3=D(i)+B(i,i)*e(i)-G(i,i)*f(i); % dQ/de
X4=-C(i)+G(i,i)*e(i)+B(i,i)*f(i);% dQ/df
p=2*i-1;q=2*j1-1;J(p,q)=X3;%扩展列△Q J(p,N)=DQ;
m=p+1;
J(m,q)=X1;q=q+1;J(p,q)=X4;%扩展列△P J(m,N)=DP;
J(m,q)=X2;
end
end
else %if B2(i,5)~=3 否则(即为PV节点)
%=============== 下面是针对PV节点来求取Jacobi矩阵的元素===========
for j1=1:n
if j1~=isb&j1~=i %非平衡节点&非对角元
X1=-G(i,j1)*e(i)-B(i,j1)*f(i); % dP/de
X2=B(i,j1)*e(i)-G(i,j1)*f(i); % dP/df
X5=0;X6=0;
p=2*i-1;q=2*j1-1;J(p,q)=X5; % PV节点电压误差J(p,N)=DV;
m=p+1;
J(m,q)=X1;q=q+1;J(p,q)=X6; % PV节点有功误差J(m,N)=DP;
J(m,q)=X2;
elseif j1==i&j1~=isb %非平衡节点&对角元
X1=-C(i)-G(i,i)*e(i)-B(i,i)*f(i);% dP/de
X2=-D(i)+B(i,i)*e(i)-G(i,i)*f(i);% dP/df
X5=-2*e(i);
X6=-2*f(i);
p=2*i-1;q=2*j1-1;J(p,q)=X5; % PV节点电压误差J(p,N)=DV;
m=p+1;
J(m,q)=X1;q=q+1;J(p,q)=X6; % PV节点有功误差J(m,N)=DP;
J(m,q)=X2;
end
end
end %(if B2(i,5)~=3 else)
end %(if i~=isb)
end %(for i=1:n)n个节点2n行(每节点两个方程P和Q或U)
JZ0=['形成的第(',num2str(a),')次Jacobi矩阵:'];
%disp(JZ0);disp(J);
%=============================== 以上为形成完整的Jacobi矩阵================================
%====下面用高斯消去法对由Jacobi矩阵形成的修正方程进行求解(按列消去、回代) ==========
for k=3:N0 % N0=2*n (从第三行开始,第一、二行是平衡节点)
for k1=k+1:N1 % 从k+1列的Jacobi元素到扩展列的△P、△Q 或△U
J(k,k1)=J(k,k1)./J(k,k);% 用K行K列对角元素去除K行K列后的非对角元素进行规格化
end
J(k,k)=1; % 对角元规格化K行K列对角元素赋1
%================== 按列消去运算==================================
for k2=k+1:N0 % 从k+1行到2*n最后一行
for k3=k+1:N1 %从k2+1列到扩展列消去k+1行后各行下三角元素
J(k2,k3)=J(k2,k3)-J(k2,k)*J(k,k3);%消去运算
end %用当前行K3列元素减去当前行K列元素乘以第k行K3列元素
J(k2,k)=0; %当前行第k列元素已消为0
end
end
%JZ=['Jacobi矩阵第(',num2str(a),')次消去运算'];JZ1=['Jacobi矩阵第(',num2str(a),')次回代运算'];
%disp(JZ);disp(J);
%==================== 按列回代运算=======================================
for k=N0:-1:3
for k1=k-1:-1:3
J(k1,N1)=J(k1,N1)-J(k1,k)*J(k,N1);
J(k1,k)=0;
end
end
for m=1:N0
JJN1(m)=J(m,N1);
end
disp(JZ1);disp(JJN1);%disp(J);
%----------------------------------修改节点电压-------------------------------
for k=3:2:N0-1
L=(k+1)./2;
e(L)=e(L)-J(k,N1); %修改节点电压实部
k1=k+1;
f(L)=f(L)-J(k1,N1); %修改节点电压虚部
U(L)=sqrt(e(L)^2+f(L)^2);
end
disp('各个节点电压模');disp(U);
%============================== 结束一次迭代==============================
end
%********************** 下面为迭代计算结束后的有关输出过程***************** disp('迭代次数:');
disp(ICT1-1);
disp('没有达到精度要求的个数:');
disp(ICT2);
for k=1:n
V(k)=sqrt(e(k)^2+f(k)^2); %计算各节点电压的模值
sida(k)=atan(f(k)./e(k))*180./pi; %计算各节点电压的角度
E(k)=e(k)+f(k)*j; %将各节点电压用复数表示
end
%=============== 计算各输出量===========================
disp('各节点的电压复数值E为(节点号从小到大排列):');
disp(E); %显示各节点的实际电压值E用复数表示
disp('-----------------------------------------------------');
disp('各节点的电压模值大小V为(节点号从小到大排列):');
disp(V); %显示各节点的电压大小V的模值
disp('-----------------------------------------------------');
disp('各节点的电压相角sida为(节点号从小到大排列):');
disp(sida); %显示各节点的电压相角
for p=1:n
C(p)=0;
for q=1:n
C(p)=C(p)+conj(Y(p,q))*conj(E(q)); %计算各节点注入电流的共轭值end
S(p)=E(p)*C(p); %计算各节点的功率S = 电压X 注入电流的共轭值end
disp('各节点的功率S为(节点号从小到大排列):');
disp(S); %显示各节点的注入功率
disp('-----------------------------------------------------');
disp('各条支路的首端功率Si为(顺序同您输入B1时一致):');
for i=1:nl
p=B1(i,1);q=B1(i,2);
if B1(i,7)==0
Si(p,q)=E(p)*conj(E(p)*B1(i,4)./2+(E(p)-E(q))./B1(i,3));
Siz(i)=Si(p,q);
else
if B1(i,6)==0
Si(p,q)=E(p)*(conj(E(p)*B1(i,4)...
+(E(p)*B1(i,5)-E(q))*(1./(B1(i,3)*B1(i,5)))));
Siz(i)=Si(p,q);
else
Si(p,q)=E(p)*conj((E(p)-E(q)*B1(i,5))*(1./(B1(i,3)*B1(i,5)^2)));
Siz(i)=Si(p,q);
end
end
ZF=['S(',num2str(p),',',num2str(q),')=',num2str(Si(p,q))];
disp(ZF);
disp('-----------------------------------------------------');
end
disp('各条支路的末端功率Sj为(顺序同您输入B1时一致):');
for i=1:nl
p=B1(i,1);q=B1(i,2);
if B1(i,7)==0
Sj(q,p)=E(q)*conj(E(q)*B1(i,4)./2+(E(q)-E(p))./B1(i,3));
Sjy(i)=Sj(q,p);
else
if B1(i,6)==0
Sj(q,p)=E(q)*conj((E(q)-E(p)*B1(i,5))*(1./(B1(i,3)*B1(i,5)^2)));
Sjy(i)=Sj(q,p);
else
Sj(q,p)=E(q)*(conj(E(q)*B1(i,4)...
+(E(q)*B1(i,5)-E(p))*(1./(B1(i,3)*B1(i,5)))));
Sjy(i)=Sj(q,p);
end
end
ZF=['S(',num2str(q),',',num2str(p),')=',num2str(Sj(q,p))];
disp(ZF);
disp('-----------------------------------------------------');
end
disp('各条支路的功率损耗DS为(顺序同您输入B1时一致):');
for i=1:nl
p=B1(i,1);q=B1(i,2);
DS(i)=Si(p,q)+Sj(q,p);
ZF=['DS(',num2str(p),',',num2str(q),')=',num2str(DS(i))];
disp(ZF);
disp('-----------------------------------------------------');
end
zws=0;JDDY=[];JDP=[];JDQ=[];JDDYJD=[];
for i=1:n %总网损为所有节点注入功率的代数和
zws=zws+S(i);
JDDYJD=strcat(JDDYJD,num2str(i),'(',num2str(sida(i)),'),');
JDDY=strcat(JDDY,num2str(i),'(',num2str(V(i)),'),');
JDP=strcat(JDP,num2str(i),'(',num2str(real(S(i))),'),');
JDQ=strcat(JDQ,num2str(i),'(',num2str(imag(S(i))),'),');
end
JDDYJD=strcat('节点电压角度:',JDDYJD);
JDDY=strcat('节点电压模值:',JDDY);
JDP=strcat('节点有功:',JDP);
JDQ=strcat('节点无功:',JDQ);
ZF=['总网损S=',num2str(zws)];
ZFS=['有功总损耗= ',num2str(real(zws)),' 无功总损耗= ',num2str(imag(zws))]; disp(ZF);
figure(1);
subplot(4,1,1);
bar(V);
title(JDDY);
ylabel('节点电压模值');
grid on;
subplot(4,1,2);
plot(sida);
title(JDDYJD);
ylabel('节点电压角度');
grid on;
subplot(4,1,3);
P=real(S);Q=imag(S);
bar(P);
title(JDP);
ylabel('节点注入有功');
grid on;
subplot(4,1,4);
bar(Q);
title(JDQ);
xlabel(ZFS);ylabel('节点注入无功');
grid on;%***********************************
figure(2);
subplot(3,2,1);
JDH=[];JDH1=[];
for i=1:nl
JDH=strcat(JDH,num2str(i),'(',num2str(B1(i,1)),',',num2str(B1(i,2)),'), ');
JDH1=strcat(JDH1,num2str(i),'(',num2str(B1(i,2)),',',num2str(B1(i,1)),'), '); end
P1=real(Siz);Q1=imag(Siz);
bar(P1);
title(JDH);
ylabel('支路首端注入有功');%xlabel('支路号');
grid on;
subplot(3,2,2);
bar(Q1);
title(JDH);
ylabel('支路首端注入无功');
grid on;
subplot(3,2,3);
P2=real(Sjy);Q2=imag(Sjy);
bar(P2);
title(JDH1);
ylabel('支路末端注入有功');
grid on;
subplot(3,2,4);
bar(Q2);
title(JDH1);
ylabel('支路末端注入无功');
grid on;
subplot(3,2,5);
P3=real(DS);Q3=imag(DS);
bar(P3);
xlabel(JDH);ylabel('支路有功损耗');
grid on;
subplot(3,2,6);
bar(Q3);
xlabel(JDH);ylabel('支路无功损耗');
grid on;