暫態穩定性分析大程
作者 : 李志
學號 : 21410076
Tel : 13732254786
目錄
[TOC]
1. 引言
對于地區性的電力系統來說,一般失去暫態穩定過程發展很快,通常分析系統遭受干擾后第一搖擺周期(1~1.5s)的機電暫態過程就可以判斷系統是否能夠維持穩定運行。這種情況下的暫態穩定分析中,由于調速系統的慣性,使得在短時間內原動機的功率不會發生很大變化,因此可以忽略調速系統的作用而假定原動機的功率保持不變;此外由于發電機勵磁繞組的時間常數較大,這樣在短時間內其磁鏈也不會發生顯著變化,而對勵磁調節系統的作用,可以用發電機暫態電勢$E_q{’}$或$E{’}$保持恒定來近似模擬,即認為在第一搖擺周期內,勵磁繞組中自由電流分量的變化由勵磁調節系統的作用所補償,從而使勵磁繞組的磁鏈$Ψ_f$在這段時間內保持不變。相應地,阻尼繞組的影響將略去不計。
簡單模型下的暫態穩定分析程序在電力系統運行與規劃中獲得了廣泛的應用,用它可以驗證電力系統接線方式和運行方式的合理性,計算輸電線路的最大輸送功率,確定系統故障切除的臨界時間,以及研究某些提高電力系統穩定措施的效果,等等。
2. 仿真原理
對發電機、負荷及電力網絡采用不同的數學模型可以構成各種簡化的暫態穩定分析程序,采用何種組合要根據所研究問題的性質而定。本文采用的數學模型和計算方法如下所示。
內容 | 方法 |
---|---|
發電機 | 發電機暫態電勢Eq’保持恒定 |
負荷 | 較小的負荷用恒定阻抗 |
電力網絡 | 導納矩陣 |
微分方程 | 改進歐拉法 |
網絡方程 | 直接法 |
3. 流程

3.1 初值計算
主要求取進行穩態分析前確定微分方程求解所需的初值。包括當前的虛擬電勢$E_{q0}$、原動機功率$P_{m0}$、發電機轉子角度初值$\delta_{0}$、發電機轉子角速度初值$\omega_0$、負荷的等值導納。
3.2 用直接法求解網絡方程
此步驟中主要是求解網絡潮流,發電機以不計阻尼繞組的模型并入電力網絡,同時負荷或者故障也以等值導納形式并入網絡。利用發電機此時的$\delta$值確定參數$b、g、G_{xi}、B_{yi}、G_{yi}、$。其中$G_{xi}、B_{yi}、G_{yi}、$是發嗲你就并入網絡的導納,$b、g$參數用于計算發電機節點的虛擬注入電流。在網絡矩陣生成、發電機虛擬注入電流得出后,利用$YV=I$,直接求出網絡方程,得出節點電壓后算出發電機節點注入電流。
3.3 改進歐拉法求解微分方程
轉子運動方程模型如下:
$$\begin{cases}
\frac{d\delta_i}{dt}=\omega_s(\omega_i-1)\cr
\frac{d\omega_i}{dt}=\frac 1{T_{Ji}}(P_{mi}-P_{ei})
\end{cases}$$
根據求取初值的方法用t時刻各發電機的$\delta_i(t)$求取系統所有節點的電壓$V_x(t)$、$V_y(t)$和發電機節點的注入電流$I_{xi}(t)$、$I_{yi}(t)$。根據轉子運動方程求得$\delta_i$、$\omega_i$在t時刻的導數值,從而求得$t+\Delta{t}$時刻的狀態估計量。根據狀態估計量重新按求取初值的方法計算出所有系統的節點電壓$V_x(t+\Delta{t})$、$V_y(t+\Delta{t})$和發電機注入電流$I_{xi}(t+\Delta{t})$、$I_{yi}(t+\Delta{t})$。用同樣的方法根據轉子運動方程計算求得$t+\Delta{t}$時刻$\delta_{i}$、$\omega_{i}$的導數值。最后,將$t$時刻的導數值和$t+\Delta{t}$時刻的導數值的平均值(即相加除以2)與$\Delta{t}$的乘積和$t$時刻的$\delta_{i}$、$\omega_{i}$相加即得到了$t+\Delta{t}$時刻$\delta_{i}$、$\omega_{i}$值。
4. 程序結果

5. 源碼分析
PSTS選擇界面主要進行了程序的可視化輸出,讓用戶選擇需要進行的計算模式。具體模式分析如下:
考慮相同切除時間,是否計及突極效應,在模式1下計算了在$ct=0.08333s$時候考慮和不考慮突極效應的情況。
考慮同樣情況,不同切除時間,在模式2下計算了不計突極效應$ct=0.163s$和$ct=0.162s$的兩種情況。
考慮同樣情況,不同切除時間,在模式3計算了計及突極效應$ct=0.086s$和$ct=0.085s$的兩種情況。
源碼如下:
disp('選擇模式:\n');
disp('1:相對搖擺角與時間的關系曲線\n');
disp('2:臨界切除時間周圍的相對搖擺角與時間的關系曲線(不計凸極效應)\n');
disp('3:臨界切除時間周圍的相對搖擺角與時間的關系曲線(計及凸極效應)\n');
prompt='請選擇:\n';
a = input(prompt);
if a== 1
disp('相對搖擺角與時間的關系曲線');
doPlot(1);
elseif a==2
disp('臨界切除時間周圍的相對搖擺角與時間的關系曲線(不計凸極效應)');
doPlot(2);
elseif a==3
disp('臨界切除時間周圍的相對搖擺角與時間的關系曲線(計及凸極效應)');
doPlot(3);
else
disp('輸入錯誤,請重新輸入!\n');
end
主函數主要進行了數據分析和繪圖。
源碼如下:
%% doPlot: function description
function [] = doPlot(arg)
if arg==2
% fClear=0.08333;%故障切除時刻
% fClear=0.08600;%計及凸極效應臨界故障切除時刻
fClear=[0.16300 0.16200];%不計凸極效應臨界故障切除時刻
temp = fClear;
spEffect=0;%0為不計凸極效應
elseif arg==3
fClear=[0.086 0.085];%不計凸極效應臨界故障切除時刻
temp = fClear;
spEffect=1;%1為計凸極效應
elseif arg==1
fClear=0.08333;
spEffect=0;
temp = spEffect;
end
dt=0.0005;%步長
t_total=2;%總時間
global freq
freq=60;%系統頻率
%%已知數據
%發電機數據
global Tj Ra Xd X_d Xq X_q T_d0 D P_mech
Tj=[47.28 12.80 6.02]';
Ra=[0 0 0]';
Xd=[0.146 0.8958 1.3125]';
X_d=[0.0608 0.1198 0.1813]';
Xq=[0.0969 0.8645 1.2578]';
X_q=[0.0969 0.1969 0.25]';
T_d0=[8.96 6.00 5.89]';
D=[0 0 0]';
%正常運行情況下的系統潮流
V_amp=[1.04 1.025 1.025 1.0258 0.9956 1.0127 1.0258 1.0159 1.0324]';%節點電壓幅值
V_phase=deg2rad([0 9.28 4.6648 -2.2168 -3.9888 -3.6874 3.7197 0.7275 1.9667])';%節點電壓相角,弧度值
P_gen=[0.7164 1.63 0.85 0 0 0 0 0 0]';%發電機注入有功功率
Q_gen=[0.2705 0.0665 -0.1086 0 0 0 0 0 0]';%發電機注入無功功率
P_load=[0 0 0 0 1.25 0.9 0 1 0]';%節點負荷有功功率
Q_load=[0 0 0 0 0.5 0.3 0 0.35 0]';%節點負荷無功功率
gen_index=find(P_gen);%標示發電機節點
load_index=find(P_load);%標示負荷節點
deltaDiff=zeros(ceil(t_total/dt),2);%相對搖擺角定義
for temp=0:1%0為不計凸極效應,1為計及凸極效應
w=[1 1 1]'; %角速度初值
V=V_amp.*exp(j*V_phase);%節點電壓
S_gen=P_gen(gen_index)+j*Q_gen(gen_index);%發電機注入復功率
S_load=P_load(load_index)+j*Q_load(load_index);%負荷復功率
V_gen=V(gen_index);%發電機電壓
V_load=V(load_index);%負荷電壓
V_amp_gen=V_amp(gen_index);%發電機電壓幅值
V_amp_load=V_amp(load_index);%負荷電壓幅值
%%初值計算
%發電機數據
I_gen=conj(S_gen)./conj(V_gen);%
P_mech=P_gen(gen_index)+(real(I_gen).^2+imag(I_gen).^2).*Ra;
if spEffect==1%計及凸極效應
Xq=[0.0969 0.8645 1.2578]';
elseif spEffect==0%不計凸極效應
Xq=X_d;
end
EQ=V_gen+(Ra+j*Xq).*I_gen;
delta=angle(EQ);%初始功角
Vq=cos(delta).*real(V_gen)+sin(delta).*imag(V_gen);
Iq=cos(delta).*real(I_gen)+sin(delta).*imag(I_gen);
Id=sin(delta).*real(I_gen)-cos(delta).*imag(I_gen);
E_q=Vq+Ra.*Iq+X_d.*Id;%初始暫態電勢
%負荷等值并聯導納
Y_load=conj(S_load)./(V_amp_load.^2);
%%故障系統與故障后系統描述
%線路原始導納矩陣
Yn=zeros(9,9);
Yn(5,4)=-1/(0.010+j*0.085);Yn(4,5)=Yn(5,4);
Yn(6,4)=-1/(0.017+j*0.092);Yn(4,6)=Yn(6,4);
Yn(7,5)=-1/(0.032+j*0.161);Yn(5,7)=Yn(7,5);
Yn(9,6)=-1/(0.039+j*0.170);Yn(6,9)=Yn(9,6);
Yn(8,7)=-1/(0.0085+j*0.072);Yn(7,8)=Yn(8,7);
Yn(9,8)=-1/(0.0119+j*0.1008);Yn(8,9)=Yn(9,8);
Yn(4,1)=-1/(j*0.0576);Yn(1,4)=Yn(4,1);
Yn(7,2)=-1/(j*0.0625);Yn(2,7)=Yn(7,2);
Yn(9,3)=-1/(j*0.0586);Yn(3,9)=Yn(9,3);
Yn(1,1)=-Yn(1,4);
Yn(2,2)=-Yn(2,7);
Yn(3,3)=-Yn(3,9);
Yn(4,4)=-Yn(4,5)-Yn(4,6)-Yn(1,4)+j*0.088+j*0.079;
Yn(5,5)=-Yn(5,4)-Yn(5,7)+j*0.088+j*0.153;
Yn(6,6)=-Yn(6,4)-Yn(6,9)+j*0.079+j*0.179;
Yn(7,7)=-Yn(7,8)-Yn(2,7)-Yn(5,7)+j*0.153+j*0.0745;
Yn(8,8)=-Yn(7,8)-Yn(8,9)+j*0.0745+j*0.1045;
Yn(9,9)=-Yn(6,9)-Yn(8,9)-Yn(3,9)+j*0.179+j*0.1045;
%加入負荷之后的節點導納矩陣
Yn(load_index(1),load_index(1))=Yn(load_index(1),load_index(1))+Y_load(1);
Yn(load_index(2),load_index(2))=Yn(load_index(2),load_index(2))+Y_load(2);
Yn(load_index(3),load_index(3))=Yn(load_index(3),load_index(3))+Y_load(3);
%將故障并入網絡
Yn_fault=Yn;
Yn_fault(7,7)=10^10;
Yn_real_fault=yConvert(Yn_fault);%得到實數形式節點導納矩陣
%將發電機導納并入矩陣
Yn_real_fault_gen=genMerge(Yn_real_fault,delta);
[VxVy,IxIy]=getPF(Yn_real_fault_gen,E_q,delta);
%故障后系統求解
n_total=ceil(t_total/dt);
n_fault=ceil(fClear(fcm+1)/dt);
deltaOutput = zeros(n_total,3);
for li=1:n_fault
[delta1,w1]=doEuler(VxVy,IxIy,Yn_real_fault,delta,w,dt,E_q);
Yn_real_fault_gen=genMerge(Yn_real_fault,delta1);
[VxVy,IxIy]=getPF(Yn_real_fault_gen,E_q,delta1);
deltaOutput(li,:)=rad2deg(delta1');
delta=delta1;
w=w1;
end
%故障切除后系統求解
%生成切除故障后的節點導納矩陣
Yn57=zeros(9,9);
Yn57(5,5)=1/(0.032+j*0.161)+j*0.153;
Yn57(7,7)=1/(0.032+j*0.161)+j*0.153;
Yn57(5,7)=-1/(0.032+j*0.161);
Yn57(7,5)=-1/(0.032+j*0.161);
Yn_faultclear=Yn-Yn57;%9階矩陣
Yn_real_faultclear=yConvert(Yn_faultclear);
%將發電機導納并入矩陣
Yn_real_faultclear_gen=genMerge(Yn_real_faultclear,delta);
[VxVy,IxIy]=getPF(Yn_real_faultclear_gen,E_q,delta);
for li=(n_fault+1):n_total
[delta1,w1]=doEuler(VxVy,IxIy,Yn_real_faultclear,delta,w,dt,E_q);
Yn_real_faultclear_gen=genMerge(Yn_real_faultclear,delta1);
[VxVy,IxIy]=getPF(Yn_real_faultclear_gen,E_q,delta1);
deltaOutput(li,:)=rad2deg(delta1');
delta=delta1;
w=w1;
end
%相對搖擺角計算
deltaDiff(:,fcm+1)=deltaOutput(:,2)-deltaOutput(:,1);
end
t=dt:dt:n_total*dt;
plot(t,deltaDiff(:,1),'--',t,deltaDiff(:,2));
%ylim([0 300]);
set(gca,'XTick',0:0.1:t_total);
grid on;
xlabel('時間t/s');
ylabel('相對搖擺角/°');
if arg==2
title('臨界切除時間周圍的相對搖擺角與時間的關系曲線(不計凸極效應)');
elseif arg==3
title('臨界切除時間周圍的相對搖擺角與時間的關系曲線(計及凸極效應)');
elseif arg==1
title('相對搖擺角與時間的關系曲線');
end
主函數中調用了一些功能函數,主要實現以下功能:
- 直接法求網絡方程
源碼如下:
function [VxVy,IxIy]=getPF(Yn_real,E_q,delta)
[m,n]=size(Yn_real);
I=zeros(m,1);
for li=1:3
[bg ,GB]=getGen(li,delta(li));
I(li*2-1,1)=E_q(li)*bg(1);
I(li*2,1)=E_q(li)*bg(2);
end
VxVy=Yn_real\I;
IxIy=zeros(m,1);
for li=1:3
[bg ,GB]=getGen(li,delta(li));
IxIy(li*2-1,1)=E_q(li)*bg(1)-GB(1,1)*VxVy(li*2-1)-GB(1,2)*VxVy(li*2);
IxIy(li*2,1)=E_q(li)*bg(2)-GB(2,1)*VxVy(li*2-1)-GB(2,2)*VxVy(li*2);
end
end
- 發電機并入導納矩陣參數和虛擬注入電流參數計算
源碼如下:
function [ bg , GB ] = getGen( number , delta )
global Ra X_d Xq %發電機參數
GB=zeros(2,2);
GB(1,1)=(Ra(number)-(X_d(number)-Xq(number))*sin(delta)*cos(delta))/(Ra(number)^2+X_d(number)*Xq(number));
GB(1,2)=(X_d(number)*cos(delta)^2+Xq(number)*sin(delta)^2)/(Ra(number)^2+X_d(number)*Xq(number));
GB(2,1)=(-X_d(number)*sin(delta)^2-Xq(number)*cos(delta)^2)/(Ra(number)^2+X_d(number)*Xq(number));
GB(2,2)=(Ra(number)+(X_d(number)-Xq(number))*sin(delta)*cos(delta))/(Ra(number)^2+X_d(number)*Xq(number));
bg=zeros(1,2);
bg(1)=(Ra(number)*cos(delta)+Xq(number)*sin(delta))/(Ra(number)^2+X_d(number)*Xq(number));
bg(2)=(Ra(number)*sin(delta)-Xq(number)*cos(delta))/(Ra(number)^2+X_d(number)*Xq(number));
end
- 導納矩陣轉化程序
源碼如下:
%% function to convert the Yn(9*9) to Yn(18*18)
function [Yn18] = yConvert(Yn)
Yn18=zeros(18,18);
for li=1:1:9
for lj=1:9
ii=li*2-1;jj=lj*2-1;
Yn18(ii,jj)=real(Yn(li,lj));
Yn18(ii,jj+1)=-imag(Yn(li,lj));
Yn18(ii+1,jj)=imag(Yn(li,lj));
Yn18(ii+1,jj+1)=real(Yn(li,lj));
end
end
end
- 發電機等效參數并入導納矩陣
源碼如下:
function [ Yn_real_new ] = genMerge( Yn_real , delta )
Yn_real_new=Yn_real;
for li=1:3
[bg,GB]=getGen(li,delta(li));
ii=li*2-1;jj=li*2-1;
Yn_real_new(ii,jj)=Yn_real_new(ii,jj)+GB(1,1);
Yn_real_new(ii,jj+1)=Yn_real_new(ii,jj+1)+GB(1,2);
Yn_real_new(ii+1,jj)=Yn_real_new(ii+1,jj)+GB(2,1);
Yn_real_new(ii+1,jj+1)=Yn_real_new(ii+1,jj+1)+GB(2,2);
end
end
- 改進歐拉法計算程序
源碼如下:
function [deltat1 wt1]=doEuler(VxVy,IxIy,Yn_real,deltat0,wt0,dt,E_q)
global Tj P_mech Ra freq
VgeneratorX=zeros(3,1);
VgeneratorX(1,1)=VxVy(1,1);
VgeneratorX(2,1)=VxVy(3,1);
VgeneratorX(3,1)=VxVy(5,1);
VgeneratorY=zeros(3,1);
VgeneratorY(1,1)=VxVy(2,1);
VgeneratorY(2,1)=VxVy(4,1);
VgeneratorY(3,1)=VxVy(6,1);
IgeneratorX=zeros(3,1);
IgeneratorX(1,1)=IxIy(1,1);
IgeneratorX(2,1)=IxIy(3,1);
IgeneratorX(3,1)=IxIy(5,1);
IgeneratorY=zeros(3,1);
IgeneratorY(1,1)=IxIy(2,1);
IgeneratorY(2,1)=IxIy(4,1);
IgeneratorY(3,1)=IxIy(6,1);
Peit0=VgeneratorX.*IgeneratorX+VgeneratorY.*IgeneratorY+(IgeneratorX.^2+IgeneratorY.^2).*Ra;
DerivativeDeltat0=2*pi*freq*(wt0-1);
DerivativeWt0=(P_mech-Peit0)./Tj;
deltat1_0=deltat0+DerivativeDeltat0.*dt;
wt1_0=wt0+DerivativeWt0.*dt;
Yn_generator = genMerge(Yn_real,deltat1_0);
[VxVyt1_0,IxIyt1_0]=getPF(Yn_generator,E_q,deltat1_0);
VgeneratorXt1_0=zeros(3,1);
VgeneratorXt1_0(1,1)=VxVyt1_0(1,1);
VgeneratorXt1_0(2,1)=VxVyt1_0(3,1);
VgeneratorXt1_0(3,1)=VxVyt1_0(5,1);
VgeneratorYt1_0=zeros(3,1);
VgeneratorYt1_0(1,1)=VxVyt1_0(2,1);
VgeneratorYt1_0(2,1)=VxVyt1_0(4,1);
VgeneratorYt1_0(3,1)=VxVyt1_0(6,1);
IgeneratorXt1_0=zeros(3,1);
IgeneratorXt1_0(1,1)=IxIyt1_0(1,1);
IgeneratorXt1_0(2,1)=IxIyt1_0(3,1);
IgeneratorXt1_0(3,1)=IxIyt1_0(5,1);
IgeneratorYt1_0=zeros(3,1);
IgeneratorYt1_0(1,1)=IxIyt1_0(2,1);
IgeneratorYt1_0(2,1)=IxIyt1_0(4,1);
IgeneratorYt1_0(3,1)=IxIyt1_0(6,1);
Peit1_0=VgeneratorXt1_0.*IgeneratorXt1_0+VgeneratorYt1_0.*IgeneratorYt1_0+(IgeneratorXt1_0.^2+IgeneratorYt1_0.^2).*Ra;
DerivativeDeltat1_0=2*pi*freq*(wt1_0-1);
DerivativeWt1_0=(P_mech-Peit1_0)./Tj;
deltat1=deltat0+(DerivativeDeltat0+DerivativeDeltat1_0).*(dt/2);
wt1=wt0+(DerivativeWt0+DerivativeWt1_0).*(dt/2);
end