电力系统计算机算法
牛拉法
function NL()
close;%关闭上一文件
clear;%清除工作区变量
clc;%清除命令窗口内容
tic
n=9;
nl=9;
isb=1; %平衡母线节点号(固定为1)
pr=0.00001; % 误差精度
%矩阵B1的每行是由下列参数构成的:
%某支路的首端号P;
%某支路末端号Q,且P=pr
IT2=IT2+1;
end
end
ICT2(a)=IT2;ICT1=ICT1+1;
for k=1:n
dy(k)=sqrt(e(k)^2+f(k)^2);
end
for i=1:n
Dy(ICT1,i)=dy(i);
end
end %用高斯消去法解"w=-J*V"
disp('迭代次数');disp(ICT1);
disp('没有达到精度要求的个数');
disp(ICT2);
for k=1:n
V(k)=sqrt(e(k)^2+f(k)^2);O(k)=atan(f(k)./e(k))*180./pi;
end
E=e+f*j;
disp('各节点的实际电压标么值E为(节点号从小到大排列):');
disp(E);
disp('各节点的电压大小V为(节点号从小到大排列):');
disp(roundn(V,-5))
disp('各节点的电压相角O为(节点号从小到大排列):');
disp(O);
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);
end
disp('各节点的功率S为(节点号从小到大排列):');
disp(S);
disp('各条支路的首端功率Si为(顺序同您输入B1时一样):');
for i=1:nl
if B1(i,6)==0
p=B1(i,1);q=B1(i,2);
else p=B1(i,2);q=B1(i,1);
end
Si(p,q)=E(p)*(conj(E(p))*conj(B1(i,4)./2)+(conj(E(p)*B1(i,5))-conj(E(q)))*conj(1./(B1(i,3)*B1(i,5))));
disp(roundn(Si(p,q),-5));
end
disp('各条支路的末端功率Sj为(顺序同您输入B1时一样):');
for i=1:nl
if B1(i,6)==0
p=B1(i,1);q=B1(i,2);
else p=B1(i,2);q=B1(i,1);
end
Sj(q,p)=E(q)*(conj(E(q))*conj(B1(i,4)./2)+(conj(E(q)./B1(i,5))-conj(E(p)))*conj(1./(B1(i,3)*B1(i,5))));
disp(roundn(Sj(q,p),-5));
end
disp('各条支路的功率损耗DS为(顺序同您输入B1时一样):');
for i=1:nl
if B1(i,6)==0
p=B1(i,1);q=B1(i,2);
else p=B1(i,2);q=B1(i,1);
end
DS(i)=Si(p,q)+Sj(q,p);
disp(roundn(DS(i),-5)*100);
end
for i=1:ICT1
Cs(i)=i;
end
disp('以下是每次迭代后各节点的电压值(如图所示)');
plot(Cs,Dy,'linewidth',2.5),xlabel('迭代次数'),ylabel('电压(标幺值)'),title('电压迭代次数曲线');
legend('节点1','节点2','节点3','节点4','节点5','节点6','节点7','节点8','节点9');
t=toc
PQ法
% 本程序是用PQ分解法进行潮流计算
clear
clc
tic
n=9;
nl=9;
isb=1;
pr=0.00001;
%矩阵B1的每行是由下列参数构成的:
%某支路的首端号P;
%某支路末端号Q,且P=pr
ICT2=ICT2+1;
end
end
end
Np(K)=ICT2;
if ICT2~=0
for i=2:n
DP(i)=B(i,i)*DP(i);
if i~=n
IC1=i+1;
for k=IC1:n
DP(k)=DP(k)-B(k,i)*DP(i);
end
else
for LZ=3:i
L=i+3-LZ;
IC4=L-1;
for MZ=2:IC4
I=IC4+2-MZ;
DP(I)=DP(I)-B(I,L)*DP(L);
end
end
end
end
for i=2:n
O(i)=O(i)-DP(i);
end
kq=1;L=0;
for i=1:n
if B2(i,6)==2
C(i)=0;L=L+1;
for k=1:n
C(i)=C(i)+V(k)*(G(i,k)*sin(O(i)-O(k))-BI(i,k)*cos(O(i)-O(k)));
end
DQ1(i)=Q(i)-V(i)*C(i);
DQ(L)=DQ1(i)./V(i);
DET=abs(DQ1(i));
if DET >=pr
ICT3=ICT3+1;
end
end
end
else kp=0;
if kq~=0;
L=0;
for i=1:n
if B2(i,6)==2
C(i)=0;L=L+1;
for k=1:n
C(i)=C(i)+V(k)*(G(i,k)*sin(O(i)-O(k))-BI(i,k)*cos(O(i)-O(k)));
end
DQ1(i)=Q(i)-V(i)*C(i);
DQ(L)=DQ1(i)./V(i);
DET=abs(DQ1(i));
end
end
end
end
Nq(K)=ICT3;
if ICT3~=0
L=0;
for i=1:na
DQ(i)=A(i,i)*DQ(i);
if i==na
for LZ=2:i
L=i+2-LZ;
IC4=L-1;
for MZ=1:IC4
I=IC4+1-MZ;
DQ(I)=DQ(I)-A(I,L)*DQ(L);
end
end
else
IC1=i+1;
for k=IC1:na
DQ(k)=DQ(k)-A(k,i)*DQ(i);
end
end
end
L=0;
for i=1:n
if B2(i,6)==2
L=L+1;
V(i)=V(i)-DQ(L);
end
end
kp=1;
K=K+1;
else
kq=0;
if kp~=0
K=K+1;
end
end
for i=1:n
Dy(K-1,i)=V(i);
end
end
disp('迭代次数');
disp(K);
disp('每次没有达到精度要求的有功功率个数为');
disp(Np);
disp('每次没有达到精度要求的无功功率个数为');
disp(Nq);
for k=1:n
E(k)=V(k)*cos(O(k))+V(k)*sin(O(k))*j;
O(k)=O(k)*180./pi;
end
disp('各节点的电压标幺值E为(节点号从小到大排):');
disp(E);
disp('各节点的电压U大小(节点号从小到大排)为:');
disp(roundn(V,-5))
disp('各节点的电压相角O(节点号从小到大排)为:');
disp(O);
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);
end
disp('各节点的功率S(节点号从小到大排)为:');
disp(S);
disp('各条支路的首端功率Sj(顺序同您输入B1时一样)为:');
for i=1:nl
if B1(i,6)==0
p=B1(i,1);q=B1(i,2);
else p=B1(i,2);q=B1(i,1);
end
Si(p,q)=E(p)*(conj(E(p))*conj(B1(i,4)./2)+(conj(E(p)*B1(i,5))-conj(E(q)))*conj(1./(B1(i,3)*B1(i,5))));
disp(roundn(Si(p,q),-5));
end
disp('各条支路的末端功率Sj(顺序同您输入B1时一样)为:');
for i=1:nl
if B1(i,6)==0
p=B1(i,1);q=B1(i,2);
else p=B1(i,2);q=B1(i,1);
end
Sj(q,p)=E(q)*(conj(E(q))*conj(B1(i,4)./2)+(conj(E(q)./B1(i,5))-conj(E(p)))*conj(1./(B1(i,3)*B1(i,5))));
disp(roundn(Sj(q,p),-5));
end
disp('各条支路的功率损耗DS(顺序同您输入B1时一样)为:');
for i=1:nl
if B1(i,6)==0
p=B1(i,1);q=B1(i,2);
else p=B1(i,2);q=B1(i,1);
end
DS(i)=Si(p,q)+Sj(q,p);
disp(roundn(DS(i),-5));
end
for i=1:K
Cs(i)=i;
for j=1:n
Dy(K,j)=Dy(K-1,j);
end
end
disp('以下是每次迭代后各节点的电压值(如图所示)');
plot(Cs,Dy,'linewidth',2.5),xlabel('迭代次数'),ylabel('电压(标幺值)'),title('电压迭代次数曲线');
legend('节点1','节点2','节点3','节点4','节点5','节点6','节点7','节点8','节点9');
set(gcf,'color','w');
t=toc
支路追加法
function[Z]=ex3_impedance(n,nl,B)
%n为独立节点数
%nl为支路数
%B为线路参数形成的矩阵
m=0;Z=zeros(n);
for k1=1:nl
p=B(k1,1);q=B(k1,2);
if B(k1,6)==0
k=1./B(k1,5);
else
k=B(k1,5);
end
%追加接地树支和接地连支时不考虑变压器支路的影响
if p==0
if q>m %追加接地树支
Z(q,q)=B(k1,3);
m=m+1;%新增节点,增加一阶
else %追加接地连支
for i=1:m
Z(i,m+1)=-Z(i,q);Z(m+1,i)=-Z(q,i);
end
Z(m+1,m+1)=Z(q,q)+B(k1,3);
%利用高斯消去法消去矩阵暂增行和列
for i=1:m
for j=1:m
Z(i,j)=Z(i,j)-Z(i,m+1)+Z(m+1,j)./Z(m+1,m+1);
end
Z(i,m+1)=0;
end
for i=1:m+1
Z(m+1,i)=0;
end
end
%追加不接地树支和不接地连支时需要考虑变压器支路的影响
else if q>m %追加不接地树支
for i=1:m
Z(i,q)=Z(i,p)*k;Z(q,i)=Z(p,i)*k;
end
Z(q,q)=k^2*Z(p,p)+k^2*B(k1,3);
m=m+1;
else
for i=1:m %追加不接地连支
Z(i,m+1)=k*Z(i,p)-Z(i,q);
Z(m+1,i)=k*Z(p,i)-Z(q,i);
end
Z(m+1,m+1)=k^2*Z(p,p)+Z(q,q)-2*k*Z(p,q)+k^2*B(k1,3);
%利用高斯消去法消去矩阵暂增行和列
for i=1:m
for j=1:m
Z(i,j)=Z(i,j)-Z(i,m+1)*Z(m+1,j)./Z(m+1,m+1);
end
Z(i,m+1)=0;
end
for i=1:m+1
Z(m+1,i)=0;
end
end
end
end
disp('阻抗矩阵Z=');
disp(Z);
end
对称短路计算
function [Z,V,I]=sym_short_circuit_calculation(NF,n,nl,B,V0,D)
% NF为短路点的数目
% n为独立节点数
% nl为支路数
% B为线路参数形成的矩阵
% V0为各节点的初始电压表标幺值形成的列矩阵
% D为短路号以及短路点矩阵组成的矩阵
Z=zeros(n);V=zeros(n);I=zeros(nl);
Z=ex3_impedance(n,nl,B);
for r=1:NF
Idb=V0(D(r,1),1)./(Z(D(r,1),D(r,1))+D(r,2));%求短路点电流的标么值
ts1=('以下是短路点');
ft=num2str(D(r,1)); %将故障节点编号由数据类型转换为字符串类型
ts2=('各时刻的结果');
dn=strcat(ts1,ft,ts2); %将ft,ts1,ts2连接用disp函数输出显示
disp(dn);
for k=1:n
Vb(k)=V0(k,1)-Idb*Z(k,D(r,1));%求各节点的电压标么值
end
% for i1=1:nl
% p=B(i1,1);q=B(i1,2);
% if p~=0&B(i1,8)==0
% if B(i1,6)==0
% k=B(i1,5);
% V(i1)=Vb(p)-Vb(q)./k;
% else
% k=1./B(i1,5);
% V(i1)=k*Vb(p)-Vb(q);
% end
% else
% V(i1)=1-Vb(q);
% end
% Ib(i1)=V(i1)./B(i1,3);%求各支路的电流标么值
% end
disp('0s时短路点的电流为');
disp(Idb);
disp('0s时各节点的电压标么值为');
disp(Vb);
% disp('0s时各支路的电流标么值为');
% disp(Ib)
end
不对称短路计算
function[]=asym_short_circuit_calculation(NF,n1,n2,n0,nl1,nl2,nl0,f,If,zf,zg,B1,B2,B0,A1,Vcs,N)
% N为调用次数
for i1=1:NF
Z1=zeros(n1);Z2=zeros(n2);Z0=zeros(n0);Y1=zeros(n1);Y2=zeros(n2);Y0=zeros(n0);V1=zeros(n1,1);V2=zeros(n2,1);%初始化
V0=zeros(n0,1);I1=zeros(nl1,1);I2=zeros(nl2,1);I0=zeros(nl0,1);
for a=1:N
Lf=input('故障类型标志(单相接地短路为1,两相短路时为2,两相接地短路时为3,单相断线时为4,两相断线时为5,若要终止本程序请输入-1)Lf=');
% if Lf==-1|Lf~=1|Lf~=2|Lf~=3|Lf~=4|Lf~=5
% disp('本程序已被终止,谢谢使用!');
% break
% end
for m1=1:3
m=0;
if m1==1
nl=nl1;B=B1;Z=Z1;n=n1;
elseif m1==2
nl=nl2;B=B2;Z=Z2;n=n2;
elseif m1==3
nl=nl0;B=B0;Z=Z0;n=n0;
end
V=zeros(n);I=zeros(nl);
Z=ex3_impedance(n,nl,B);
if m1==1
Z1=Z;
elseif m1==2
Z2=Z;
elseif m1==3
Z0=Z;
end
end
%以上程序求出正,负,零序对应的阻抗阵
if If==0 %求出横向故障的阻抗阵
Z1(f,f)=Z1(f,f);Z2(f,f)=Z2(f,f);Z0(f,f)=Z0(f,f); %f为故障点编号
else %求出纵向故障的阻抗阵
Z1(f,f)=Z1(f,f)+Z1(1,1)-2*Z1(f,1);Z2(f,f)=Z2(f,f)+Z2(1,1)-2*Z2(f,1);Z0(f,f)=Z0(f,f)+Z0(1,1)-2*Z0(f,1);
end %-----------------故障点自阻抗--------------------------------
if Lf==1 %求出单相接地短路故障时正负零序短路节点的电流标幺值
Z4=Z2(f,f)+Z0(f,f)+3*zf;%附加阻抗
k2=1;
k0=1;
I1(f)=Vcs(f)./(Z1(f,f)+Z4); %故障相(A相)正序短路电流标幺值
I2(f)=k2*I1(f); %故障相(A相)负序短路电流标幺值
I0(f)=k0*I1(f); %故障相(A相)零序短路电流标幺值
a1=I1(f);
a2=I2(f);
a0=I0(f);
elseif Lf==2 %两相短路
Z4=Z2(f,f)+2*zf;k2=-1;k0=0;
I1(f)=Vcs(f)./(Z1(f,f)+Z4);I2(f)=k2*I1(f);
I0(f)=k0*I1(f);a1=I1(f);
a2=I2(f);a0=I0(f);
elseif Lf==3 %两相接地短路
Z4=zf+(Z2(f,f)+zf)*(Z0(f,f)+zf+3*zg)./(Z2(f,f)+Z0(f,f)+2*zf+3*zg);k2=-(Z0(f,f)+zf+3*zg)./(Z2(f,f)+Z0(f,f)+2*zf+3*zg);
k0=-(Z2(f,f)+zf)./(Z2(f,f)+Z0(f,f)+2*zf+3*zg);I1(f)=Vcs(f)./(Z1(f,f)+Z4);I2(f)=k2*I1(f);I0(f)=k0*I1(f);a1=I1(f);
a2=I2(f);a0=I0(f);
elseif Lf==4 %单相断线
Z4=zf+(Z2(f,f)+zf)*(Z0(f,f)+zf)./(Z2(f,f)+Z0(f,f)+2*zf);k2=-(Z0(f,f)+zf)./(Z2(f,f)+Z0(f,f)+2*zf);
k0=-(Z2(f,f)+zf)./(Z2(f,f)+Z0(f,f)+2*zf);I1(f)=Vcs(f)./(Z1(f,f)+Z4);I2(f)=k2*I1(f);I0(f)=k0*I1(f);a1=I1(f);a2=I2(f);a0=I0(f);
elseif Lf==5 %两相断线
Z4=Z2(f,f)+Z0(f,f)+3*zf;k2=1;k0=1;I1(f)=Vcs(f)./(Z1(f,f)+Z4);I2(f)=k2*I1(f);I0(f)=k0*I1(f);a1=I1(f);a2=I2(f);a0=I0(f);
end
disp('故障点处的正序电流标幺值为:');
disp(a1);
disp('故障点处的负序电流标幺值为:');
disp(a2);
disp('故障点处的零序电流标幺值为:');
disp(a0);
for i=1:n1 %求出各节点的电压标幺值
V1(i)=Vcs(i)-I1(f)*Z1(i,f); %正序
end
for i=1:n2
V2(i)=-I2(f)*Z2(i,f); %负序
end
for i=1:n0
V0(i)=-I0(f)*Z0(i,f); %零序
end
disp('各节点的正序电压标幺值(节点号从小到大排):');
disp(V1);
disp('各节点的负序电压标幺值(节点号从小到大排):');
disp(V2);
disp('各节点的零序电压标幺值(节点号从小到大排):');
disp(V0);
for i=1:3 %求各支路的各序电流标幺值
if i==1
B=B1;V=V1;nl=nl1;
elseif i==2
B=B2;V=V2;nl=nl2;
elseif i==3
B=B0;V=V0;nl=nl0;
end
for ab=1:nl
if B(ab,6)==0
k=B(ab,5);
else k=1./B(ab,5);
end
p=B(ab,1);q=B(ab,2);
if p==0
e=0;b=B(ab,3);
I(ab)=(e-V(q)./k)./b; %接地支路电流(均归算至首端)
else
I(ab)=(V(p)-V(q)./k)./B(ab,3); %不接地支路电流
end
end
if i==1
I1=I;
elseif i==2
I2=I;
elseif i==3
I0=I;
end
end
disp('各支路的正序电流标幺值为(顺序同您输入B时一样):');
for i=1:nl
disp(I1(i));
end
disp('各支路的负序电流标幺值为(顺序同您输入B时一样):');
for i=1:nl
disp(I2(i));
end
disp('各支路的零序电流标幺值为(顺序同您输入B时一样):');
for i=1:nl
disp(I0(i));
end
for i=1:3 %分别求故障点A,B,C三相各相的总电流,各个节点A,B,C三相各相的总电压,各支路A,B,C三相各相的总电流
if i==1 %故障点电流
s0=a0;s1=a1;s2=a2;
elseif i==2 %各序支路电压
s0=V0;s1=V1;s2=V2;
else %各序支路电流
s0=I0;s1=I1;s2=I2;
end
for ab=1:3
CA=s0*A1(ab,1)+s1*A1(ab,2)+s2*A1(ab,3); %根据不对称系数,由序分量得到相分量
if ab==1
A=CA; %A相电气量
elseif ab==2
B=CA; %B相电气量
elseif ab==3
C=CA; %C相电气量
end
end
if i==1
Iadl=A;Ibdl=B;Icdl=C;%故障点A,B,C三相各相的总电流
elseif i==2
Vajy=A;Vbjy=B;Vcjy=C;%各个节点A,B,C三相各相的总电压
else
Iazl=A;Ibzl=B;Iczl=C;%各支路A,B,C三相各相的总电流
end
end
disp('故障点处A相电流Iadl为:');
disp(Iadl);
disp('故障点处B相电流Ibdl为:');
disp(Ibdl);
disp('故障点处C相电流Icdl为:');
disp(Icdl);
disp('各节点处A相电压Vajy分别为(节点号从小到大排):');
disp(Vajy);
disp('各节点处B相电压Vbjy分别为(节点号从小到大排):');
disp(Vbjy);
disp('各节点处C相电压Vcjy分别为(节点号从小到大排):');
disp(Vcjy);
disp('各支路A相电流Iazl分别为(顺序同您输入B时一样):');
for i=1:nl
disp(Iazl(i));
end
disp('各支路B相电流Ibzl分别为(顺序同您输入B时一样):');
for i=1:nl
disp(Ibzl(i));
end
disp('各支路C相电流Iczl分别为(顺序同您输入B时一样):');
for i=1:nl
disp(Iczl(i));
end
end
end
静态稳定计算
S0=1.5+0.9296i;
V0=1;
Xd=0.7571;
w0=100*pi;
Tj=83.44;
zn=0;
Eq=sqrt((V0+imag(S0)*Xd./V0)^2+(real(S0)*Xd./V0)^2);
dtj0=atan(real(S0)*Xd./(V0*(V0+imag(S0)*Xd./V0)));
Psl=Eq*V0./Xd;
C=w0;
D=-1./Tj*Eq*cos(dtj0)*V0./Xd;
E=w0*zn./(2*Tj);
Kp=(Psl-real(S0))./real(S0);
root1=-E+sqrt(E^2+C*D);
root2=-E-sqrt(E^2+C*D);
disp('该系统的静态稳定极限:Psl=');
disp(Psl);
disp('该系统的静态储备系数:Kp=');
disp(Kp);
disp('该系统线性微分方程的特征根为:');
disp(root1);disp(root2);
if zn>=0
if (root1==conj(root2))||((real(root1)<0)&&(real(root1)<0));
disp('该系统是静态稳定的。');
else
disp('该系统是不稳定的。');
end
elseif zn<0
disp('该系统是不稳定的。');
end
暂态稳定计算
function []=transient_stability()
clear;
clc;
close;
%本程序是用分段计算法计算电力系统的暂态稳定
% S0=2+1.24i;
S0=1+0.623i;
V0=1;
B=[0.6213 exp(10000) 0.7057];
% B=[0.6213 0.9560 0.7057];%分别为正常时、故障时、故障切除后的系统直轴等值电抗
% Tj=111.25;
Tj=55.62;
N=200;
Ni=20;
dt=0.01;
for i=1:Ni
C(i,1)=1;C(i,2)=B(1);
end
for i=Ni:N
C(i,1)=0;C(i,2)=B(2);
end
E0=sqrt((V0+imag(S0)*B(1)./V0)^2+(real(S0)*B(1)./V0)^2); %初始电动势
dtj0=atan(real(S0)*B(1)./(V0*(V0+imag(S0)*B(1)./V0))); %初始功角
Q(1)=dtj0*180./pi; %化为角度制
K1=360*50*dt^2./Tj;
P2m=E0*V0./B(2); %故障时电磁功率
P3m=E0*V0./B(3); %故障后电磁功率
dtk=pi-asin(real(S0)./P3m); %切除故障后的最大功角
dtjx=acos((real(S0)*(dtk-dtj0)+P3m*cos(dtk)-P2m*cos(dtj0))./(P3m-P2m)); %极限故障切除角
dtjx(1)=dtjx*180./pi; %极限故障切除角
st=( '故障发生时间为');
sj=num2str(dt*Ni);
ss=('s');
jg=strcat(st,sj,ss);
disp(jg);
for K=2:N+1
P(K-1)=E0*V0./C(K-1,2);
if C(K-1,1)==1 %故障发生之前
Peq(K-1)=P(K-1)*sin(Q(K-1)*pi./180);
DP(K-1)=real(S0)-Peq(K-1);
if K==2 %第一时段
DQ(K)=K1*DP(K-1)./2;
else
DQ(K)=DQ(K-1)+K1*DP(K-1)./2;
end
Q(K)=Q(K-1)+DQ(K);
elseif C(K-1,1)==0 %故障发生时
P1(K-1)=P(K-2);
P2(K-1)=P(K-1);
Peq(K-1)=P1(K-1)*sin(Q(K-1));
DP(K-1)=real(S0)-Peq(K-1);
DP2(K-1)=real(S0)-P2(K-1)*sin(Q(K-1));
DQ(K)=DQ(K-1)+K1*(DP(K-1)+DP2(K-1))./2;
Q(K)=Q(K-1)+DQ(K);
end
dtjx(K)=dtjx(K-1);
if abs(Q(K)-dtjx(K))<0.5
st=('极限切除时间为');
sj=num2str(dt*(K-1));
ss=('s');
jg=strcat(st,sj,ss);
disp(jg);
end
end
disp('程序计算结果如下:')
disp('输出不平衡功率:DP=')
disp(DP)
disp('输出功角增量:DQ=')
disp(DQ);
disp('输出功角:Q=')
disp(Q)
disp('输出电磁功率:Peq=')
disp(Peq)
disp('输出发电机转子摇摆曲线如图Figure No.1所示:')
t=0:dt:dt*N;
plot(t,Q,'b');xlabel('时间(秒)');ylabel('功角(度数)');title('发电机摇摆曲线');
hold on;
plot(t,dtjx,'r','linewidth',1.5)
axis([0 2 0 800]);
end