?? flow.m
字號:
%本程序的功能是用牛頓——拉夫遜法進行潮流計算
% B1矩陣:1、支路首端號;2、末端號;3、支路阻抗;4、支路對地電納
% 5、支路的變比;6、支路首端處于K側為1,1側為0
% B2矩陣:1、該節點發電機功率;2、該節點負荷功率;3、節點電壓初始值
% 4、PV節點電壓V的給定值;5、節點所接的無功補償設備的容量
% 6、節點分類標號;7、電壓基準值
clear;
n=5;%input('請輸入節點數:n=');
nl=5;%input('請輸入支路數:nl=');
isb=1;%input('請輸入平衡母線節點號:isb=');
pr=0.00001;%input('請輸入誤差精度:pr=');
B1=[1 2 0.03i 0 1.05 0;
2 3 0.08+0.3i 0.5i 1 0;
2 4 0.1+0.35i 0 1 0;
3 4 0.04+0.25i 0.5i 1 0;
3 5 0.015i 0 1.05 1];%input('請輸入由支路參數形成的矩陣: B1=');
B2=[0 0 1.05 1.05 0 1 10;
0 3.7+1.3i 1 0 0 2 220;
0 2+1i 1 0 0 2 220;
0 1.6+0.8i 1 0 0 2 220;
5 0 1.05 1.05 0 3 10];%input('請輸入各節點參數形成的矩陣: B2=');
Y=zeros(n);e=zeros(1,n);f=zeros(1,n);V=zeros(1,n);
sida=zeros(1,n);S1=zeros(nl);
%-------修改部分------------
ym=0;
SB=100;UB=220;
%ym=input('您輸入的參數是標么值?(若不是則輸入一個不為零的數值)');
if ym~=0
%SB=input('請輸入功率基準值:SB=');
%UB=input('請輸入電壓基準值:UB=');
YB=SB./UB./UB;
BB1=B1;
BB2=B2;
for i=1:nl
B1(i,3)=B1(i,3)*YB;
B1(i,4)=B1(i,4)./YB;
end
disp('B1矩陣B1=');
disp(B1)
for i=1:n
B2(i,1)=B2(i,1)./SB;
B2(i,2)=B2(i,2)./SB;
%B2(i,3)=B2(i,3)./UB;
%B2(i,4)=B2(i,4)./UB;
B2(i,5)=B2(i,5)./SB;
end
disp('B2矩陣B2=');
disp(B2)
end
% % %---------------------------------------------------
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
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)+B1(i,4)./2; %對角元K側
Y(p,p)=Y(p,p)+1./B1(i,3)+B1(i,4)./2; %對角元1側
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)=B2(i,4); %PV節點電壓給定模值
end
for i=1:n %給定各節點注入功率
S(i)=B2(i,1)-B2(i,2); %i節點注入功率SG-SL
B(i,i)=B(i,i)+B2(i,5); %i節點無功補償量
end
%===================================================================
P=real(S);Q=imag(S);
ICT1=0;IT2=1;N0=2*n;N=N0+1;a=0;
while IT2~=0
IT2=0;a=a+1;
for i=1:n
if i~=isb %非平衡節點
C(i)=0;D(i)=0;
for j1=1: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
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)
%求P',Q'
V2=e(i)^2+f(i)^2; %電壓模平方
%========= 以下針對非PV節點來求取功率差及Jacobi矩陣元素 =========
if B2(i,6)~=3 %非PV節點
DP=P(i)-P1; %節點有功功率差
DQ=Q(i)-Q1; %節點無功功率差
%=============== 以上為除平衡節點外其它節點的功率計算 =================
%================= 求取Jacobi矩陣 ===================
for j1=1:n
if j1~=isb&j1~=i %非平衡節點&非對角元
X1=-G(i,j1)*e(i)-B(i,j1)*f(i); % dP/de=-dQ/df
X2=B(i,j1)*e(i)-G(i,j1)*f(i); % dP/df=dQ/de
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;J(p,N)=DQ;m=p+1;
J(m,q)=X1;J(m,N)=DP;q=q+1;
J(p,q)=X4;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
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;J(p,N)=DQ;%擴展列△Q
m=p+1;
J(m,q)=X1;q=q+1;J(p,q)=X4;J(m,N)=DP;%擴展列△P
J(m,q)=X2;
end
end
else
%=============== 下面是針對PV節點來求取Jacobi矩陣的元素 ===========
DP=P(i)-P1; % PV節點有功誤差
DV=V(i)^2-V2; % PV節點電壓誤差
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;J(p,N)=DV;
m=p+1;
J(m,q)=X1;J(m,N)=DP;q=q+1;J(p,q)=X6;
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;J(p,N)=DV;
m=p+1;
J(m,q)=X1;J(m,N)=DP;q=q+1;J(p,q)=X6;
J(m,q)=X2;
end
end
end
end
end
% disp('雅可比矩陣');
% disp(J);
%========= 以上為求雅可比矩陣的各個元素 =====================
for k=3:N0 % N0=2*n (從第三行開始,第一、二行是平衡節點)
k1=k+1;N1=N; % N=N0+1 即 N=2*n+1擴展列△P、△Q
for k2=k1:N1 % 擴展列△P、△Q
J(k,k2)=J(k,k2)./J(k,k); % 非對角元規格化
end
J(k,k)=1; % 對角元規格化
if k~=3 % 不是第三行
%============================================================
k4=k-1;
for k3=3:k4 % 用k3行從第三行開始到當前行前的k4行消去
for k2=k1:N1 % k3行后各行下三角元素
J(k3,k2)=J(k3,k2)-J(k3,k)*J(k,k2);%消去運算
end
J(k3,k)=0;
end
if k==N0
break;
end
%==========================================
for k3=k1:N0
for k2=k1:N1
J(k3,k2)=J(k3,k2)-J(k3,k)*J(k,k2);%消去運算
end
J(k3,k)=0;
end
else
for k3=k1:N0
for k2=k1:N1
J(k3,k2)=J(k3,k2)-J(k3,k)*J(k,k2);%消去運算
end
J(k3,k)=0;
end
end
end
%====上面是用線性變換方式將Jacobi矩陣化成單位矩陣=====
for k=3:2:N0-1
L=(k+1)./2;
e(L)=e(L)-J(k,N); %修改節點電壓實部
k1=k+1;
f(L)=f(L)-J(k1,N); %修改節點電壓虛部
end
%------修改節點電壓-----------
for k=3:N0
DET=abs(J(k,N));
if DET>=pr %電壓偏差量是否滿足要求
IT2=IT2+1; %不滿足要求的節點數加1
end
end
ICT2(a)=IT2;
ICT1=ICT1+1;
cs=['迭代次數=',num2str(ICT1)];
disp(cs);
zj=e+f*j;
% disp(zj);
disp(abs(zj));
end
%用高斯消去法解"w=-J*V"
disp('迭代次數:');
disp(ICT1);
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);
for j1=1:n
EE(j1)=E(j1)*B2(j1,7);
end
disp('各節點的實際電壓有名值E為(節點號從小到大排列):');
disp(EE);
disp('-----------------------------------------------------');
disp('各節點的電壓大小標幺值V為(節點號從小到大排列):');
disp(V);
for j1=1:n
VV(j1)=V(j1)*B2(j1,7);
end
disp('各節點的電壓有名值:');
disp(VV);
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);
end
disp('各節點的功率S為(節點號從小到大排列):');
disp(S);
%disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
%SS=S*SB;
%disp(SS);
disp('-----------------------------------------------------');
disp('各條支路的首端功率Si為(順序同您輸入B1時一致):');
for i=1:nl
p=B1(i,1);q=B1(i,2);
if B1(i,6)==0
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))));
Siz(i)=Si(p,q);
else
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))));
Siz(i)=Si(p,q);
end
%disp(Si(p,q));
SSi(p,q)=Si(p,q)*SB;
ZF=['S(',num2str(p),',',num2str(q),')=',num2str(SSi(p,q)),' (MVA) 標么值:',num2str(Si(p,q))];
disp(ZF);
%disp(SSi(p,q));
disp('-----------------------------------------------------');
end
disp('各條支路的末端功率Sj為(順序同您輸入B1時一致):');
for i=1:nl
p=B1(i,1);q=B1(i,2);
if B1(i,6)==0
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))));
Sjy(i)=Sj(q,p);
else
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))));
Sjy(i)=Sj(q,p);
end
%disp(Sj(q,p));
SSj(q,p)=Sj(q,p)*SB;
ZF=['S(',num2str(q),',',num2str(p),')=',num2str(SSj(q,p)),' (MVA) 標么值:',num2str(Sj(q,p))];
disp(ZF);
%disp(SSj(q,p));
disp('-----------------------------------------------------');
end
disp('各條支路的功率損耗DS為(順序同您輸入B1時一致):');
ZSH=0;
for i=1:nl
p=B1(i,1);q=B1(i,2);
DS(i)=Si(p,q)+Sj(q,p);
ZSH=ZSH+DS(i);
%disp(DS(i));
DDS(i)=DS(i)*SB;
ZF=['DS(',num2str(p),',',num2str(q),')=',num2str(DDS(i)),' (MVA) 標么值:',num2str(DS(i))];
disp(ZF);
%disp(DDS(i));
disp('-----------------------------------------------------');
end
disp(['總損耗為:ZSH=',num2str(ZSH*SB),' (MVA)']);
figure(1);
subplot(2,2,1);
plot(V);
xlabel('節點號');ylabel('電壓標幺值');
grid on;
subplot(2,2,2);
plot(sida);
xlabel('節點號');ylabel('電壓角度');
grid on;
subplot(2,2,3);
bar(S);
xlabel('節點注入有功');ylabel('節點注入無功');
grid on;
subplot(2,2,4);
bar(Siz);
xlabel('支路首端有功');ylabel('支路首端無功');
grid on;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -