📄 power_flow_calculation.m
字号:
%本程序的功能是用牛顿-拉夫逊法进行潮流计算
n=input('请输入节点数:n=');
zl=input('请输入支路数:zl=');
n_Bal_Bus=input('请输入平衡母线节点号:n_Bal_Bus=');
jd=input('请输入误差精度jd=');
disp('B1=[首节点p 末节点q (p<q) 支路阻抗(R+jX) 对地容抗 变比1/k 高压侧标志(首端处于高压侧请输入1,否则输0)]');
B1=input('请输入由支路参数形成的矩阵:B1=');
disp('B2=[节点注入功率 节点电压初值 PV节点电压初值 节点分类号(1-PQ 2-PV 0-平衡)]');
B2=input('请输入各节点参数形成的矩阵:B2=');
Y=zeros(n);e=zeros(1,n);f=zeros(1,n);V=zeros(1,n);Phase=zeros(1,n);
%形成节点导纳矩阵
for i=1:zl
if B1(i,6)~=0 %判断首端是否处于高压侧
p=B1(i,1);q=B1(i,2);
else
p=B1(i,2);q=B1(i,1);
end
Y(p,q)=Y(p,q)-1./(B1(i,3)*B1(i,5)); %按书p71-74页
Y(q,p)=Y(p,q);
Y(q,q)=Y(q,q)+1./(B1(i,3)*B1(i,5)^2)+B1(i,4);
Y(p,p)=Y(p,p)+1./B1(i,3)+B1(i,4);
end %形成节点导纳矩阵
disp('节点导纳矩阵Y为:');
disp(Y);
G=real(Y);B=imag(Y); %Y=G+jB
for i=1:n
e(i)=real(B2(i,2));
f(i)=imag(B2(i,2));%V=e+jf
V(i)=B2(i,3);
end
for i=1:n
S(i)=B2(i,1); %S=P+jQ
end
P=real(S);Q=imag(S);
Ci=0;a=1;N0=2*n;N=N0-1;%开始求雅克比矩阵,Ci为迭代次数
while a~=0
a=0;
for i=1:n
if i~=n_Bal_Bus
C(i)=0;
D(i)=0;
for jl=1:n
C(i)=C(i)+G(i,jl)*e(jl)-B(i,jl)*f(jl);
D(i)=D(i)+G(i,jl)*f(jl)+B(i,jl)*e(jl);
end
P1=C(i)*e(i)+f(i)*D(i);
Q1=f(i)*C(i)-D(i)*e(i); %求Pi,Qi
V2=e(i)^2+f(i)^2;
if B2(i,4)~=2 %若节点是PQ或平衡节点
DP=P(i)-P1;
DQ=Q(i)-Q1;
for jl=1:n
if jl~=n_Bal_Bus&jl~=i %节点不为平衡节点时非对角线元素
X1=-G(i,jl)*e(i)-B(i,jl)*f(i);
X2=B(i,jl)*e(i)-G(i,jl)*f(i);
X3=X2;
X4=-X1;
p=2*i-1;q=2*jl-1;J(p,q)=X1;J(p,N)=DP;m=p+1;
J(m,q)=X3;J(m,N)=DQ;q=q+1;J(p,q)=X2;J(m,q)=X4;
elseif jl==i&jl~=n_Bal_Bus %节点不为平衡节点时对角线元素
X1=-C(i)-G(i,i)*e(i)-B(i,i)*f(i);
X2=-D(i)+B(i,i)*e(i)-G(i,i)*f(i);
X3=D(i)+B(i,i)*e(i)-G(i,i)*f(i);
X4=-C(i)+G(i,i)*e(i)+B(i,i)*f(i);
p=2*i-1;q=2*jl-1;J(p,q)=X1;J(p,N)=DP;m=p+1;
J(m,q)=X3;J(m,N)=DQ;q=q+1;J(p,q)=X2;J(m,q)=X4;
end
end
else %若节点是PV节点
DP=P(i)-P1;
DV=V(i)^2-V2;
for jl=1:n
if jl~=n_Bal_Bus&jl~=i
X1=-G(i,jl)*e(i)-B(i,jl)*f(i);
X2=B(i,jl)*e(i)-G(i,jl)*f(i);
X5=0;
X6=0;
p=2*i-1;q=2*jl-1;J(p,q)=X1;J(p,N)=DP;m=p+1;
J(m,q)=X5;J(m,N)=DV;q=q+1;J(p,q)=X2;J(m,q)=X6;
elseif jl==i&jl~=n_Bal_Bus
X1=-C(i)-G(i,i)*e(i)-B(i,i)*f(i);
X2=-D(i)+B(i,i)*e(i)-G(i,i)*f(i);
X5=-2*e(i);
X6=-2*f(i);
p=2*i-1;q=2*jl-1;J(p,q)=X1;J(p,N)=DP;m=p+1;
J(m,q)=X5;J(m,N)=DV;q=q+1;J(p,q)=X2;J(m,q)=X6;
end
end
end
end
end %形成雅克比矩阵
DJ=-J(:,[1:N0-2]);%修正方程系数矩阵DJ=-J,J矩阵的1-(N0-2)行
DW=J([1:N0-2],N); %修正方程常数项矩阵DW,J矩阵的第N行
if Ci==0
disp('迭代前的J:');
disp(-DJ);
end
F=DJ\DW; %求解修正方程
if Ci==0
disp('第一次修正方程的解F:');
disp(F);
end
%计算节点电压
for k=1:2:N0-3
L=(k+1)./2;
e(L)=e(L)+F(k);
k1=k+1;
f(L)=f(L)+F(k1);
end %计算节点电压
E=e+f*j; %每次修正后节点电压的近似值
for k=1:N0-2
DET=abs(DW(k));
if DET>=jd
a=a+1;
end
end %判断是否达到精度要求
Ci=Ci+1;
end %迭代过程结束
disp('迭代次数');
disp(Ci-1); %显示迭代次数
for k=1:n
V(k)=sqrt(e(k)^2+f(k)^2);
Phase(k)=atan(f(k)./e(k))*180./pi;
end %收敛后节点电压用极坐标表示的结果
E=e+f*j;
disp('各节点的实际电压标么值E为(节点号从小到大排列):');disp(E);
disp('各节点的电压大小V为(节点号从小到大排列):');disp(V);
disp('各节点的电压相角Phase(单位:度)为(节点号从小到大排列):');disp(Phase);
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('平衡节点功率为:');disp(S(n));
disp('各条支路的首端功率Si为(顺序同输入B1时一样):');
for i=1:zl
if B1(i,6)==0
p=B1(i,1);q=B1(i,2);
else q=B1(i,1);p=B1(i,2);
end
Si(p,q)=E(p)*((E(p))*conj(B1(i,4))+(conj(E(p)./B1(i,5))-conj(E(q)))*conj(1./(B1(i,3)*B1(i,5))));
disp(Si(p,q)); %计算支路首端功率Si
end
disp('各条支路的末端功率Sj为(顺序同输入B1时一样):')
for i=1:zl
if B1(i,6)==0
p=B1(i,1);q=B1(i,2);
else q=B1(i,1);p=B1(i,2);
end
Sj(q,p)=E(q)*((E(q))*conj(B1(i,4))+(conj(E(q)*B1(i,5))-conj(E(p)))*conj(1./(B1(i,3)*B1(i,5))));
disp(Sj(q,p));
end %计算支路末端功率Sj
%潮流计算程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -