?? pf30.cpp
字號:
}
//節點潮流輸出:序號,節點號,節點類型,V,Angle,PG,QG,PL,QL,節點有功失配
//量,節點無功失配量。
int Node_Name_Old[NODEMAX]; //節點舊名(號)
int Node_No_OldtoNew[NODEMAX]; //排序后舊節點序號對應的新節點序號
int I_Temp,np; //臨時變量
int Node_Name_Voltage_MaxMin[4]; //電壓幅值最小、最大和電壓
//相位最小、最大節點號。
double Voltage_Value_MaxMin[4]; //最小、最大電壓幅值和最小、
//最大電壓相位。
for(i=0;i<Num_Node;i++)
{
Node_Name_Old[i]=Node_Name_NewtoOld[i];
Node_No_OldtoNew[i]=i;
}
for(i=0;i<Num_Node-1;i++) //按照節點舊名由小到大排序
{
np=i;
for(j=i+1;j<Num_Node;j++)
if(Node_Name_Old[j]<Node_Name_Old[np])np=j;
I_Temp=Node_Name_Old[i];
Node_Name_Old[i]=Node_Name_Old[np];
Node_Name_Old[np]=I_Temp;
I_Temp=Node_No_OldtoNew[i];
Node_No_OldtoNew[i]=Node_No_OldtoNew[np];
Node_No_OldtoNew[np]=I_Temp;
}
//打開結果輸出磁盤文件
ofstream onfile("pfresult.dat",ios::out,filebuf::openprot);
if(onfile.fail()) //判斷打開是否有錯
{
cerr<<"Error opening the diskette data-file:"\
<<"pfresult.dat"<<endl; exit(10);
}
/*cout << setiosflags( ios::fixed ); //屏幕輸出部分
cout<<endl<<setw(48)<<"Node Flow Output"<<endl;
cout<<setw(48)<<"================"<<endl;
cout<<setw(4)<<"No"<<setw(4)<<"Bus"<<setw(4)<<"Type"\
<<setw(7)<<"Voltage"<<setw(8)<<"Angle"\
<<setw(8)<<"PG"<<setw(8)<<"QG"\
<<setw(8)<<"PL"<<setw(8)<<"QL"\
<<setw(10)<<"Bus_P_Dis"<<setw(10)<<"Bus_Q_Dis"<<endl;*/
onfile<< setiosflags( ios::fixed ); //磁盤輸出部分
onfile<<endl<<setw(50)<<"Node Flow Output"<<endl;
onfile<<setw(50)<<"================"<<endl;
onfile<<setw(5)<<"No"<<setw(5)<<"Bus"<<setw(5)<<"Type"\
<<setw(8)<<"Voltage"<<setw(8)<<"Angle"\
<<setw(8)<<"PG"<<setw(8)<<"QG"\
<<setw(8)<<"PL"<<setw(8)<<"QL"\
<<setw(10)<<"Bus_P_Dis"<<setw(10)<<"Bus_Q_Dis"<<endl;
j=Node_No_OldtoNew[0];
Node_Name_Voltage_MaxMin[0]=Node_Name_NewtoOld[j];
Node_Name_Voltage_MaxMin[1]=Node_Name_NewtoOld[j];
Node_Name_Voltage_MaxMin[2]=Node_Name_NewtoOld[j];
Node_Name_Voltage_MaxMin[3]=Node_Name_NewtoOld[j];
V=Voltage[j][1];
Angle=Voltage[j][0]*Rad_to_Deg;
Voltage_Value_MaxMin[0]=V;
Voltage_Value_MaxMin[1]=V;
Voltage_Value_MaxMin[2]=Angle;
Voltage_Value_MaxMin[3]=Angle;
for(i=0;i<Num_Node;i++)
{
j=Node_No_OldtoNew[i]; //當前舊節點序號所對應的新節點順序號
k=Node_Name_NewtoOld[j];//新節點號所對應的舊節點名(號)
V=Voltage[j][1];
Angle=Voltage[j][0]*Rad_to_Deg;
//屏幕輸出部分
/*cout<<setw(4)<<i<<setw(4)<<k<<setw(4)<<Node_Flag[j]\
<<setw(7)<<setprecision(4)<<V\
<<setw(8)<<setprecision(2)<<Angle\
<<setw(8)<<setprecision(4)<<S_Node[j][0]\
<<setw(8)<<setprecision(4)<<S_Node[j][1]\
<<setw(8)<<setprecision(4)<<S_Node[j][2]\
<<setw(8)<<setprecision(4)<<S_Node[j][3]\
<<setw(10)<<setprecision(6)<<DS_Node[j][0]\
<<setw(10)<<setprecision(6)<<DS_Node[j][1]<<endl;*/
//磁盤輸出部分
onfile<<setw(5)<<i<<setw(5)<<k<<setw(5)<<Node_Flag[j]\
<<setw(8)<<setprecision(4)<<V\
<<setw(8)<<setprecision(2)<<Angle\
<<setw(8)<<setprecision(4)<<S_Node[j][0]\
<<setw(8)<<setprecision(4)<<S_Node[j][1]\
<<setw(8)<<setprecision(4)<<S_Node[j][2]\
<<setw(8)<<setprecision(4)<<S_Node[j][3]\
<<setw(10)<<setprecision(6)<<DS_Node[j][0]\
<<setw(10)<<setprecision(6)<<DS_Node[j][1]<<endl;
if(i>0)
{
if(V<Voltage_Value_MaxMin[0])
{
Voltage_Value_MaxMin[0]=V;
Node_Name_Voltage_MaxMin[0]=k;
}
if(V>Voltage_Value_MaxMin[1])
{
Voltage_Value_MaxMin[1]=V;
Node_Name_Voltage_MaxMin[1]=k;
}
if(Angle<Voltage_Value_MaxMin[2])
{
Voltage_Value_MaxMin[2]=Angle;
Node_Name_Voltage_MaxMin[2]=k;
}
if(Angle>Voltage_Value_MaxMin[3])
{
Voltage_Value_MaxMin[3]=Angle;
Node_Name_Voltage_MaxMin[3]=k;
}
}
}
//線路潮流輸出:序號,左節點,右節點,線路類型,Pij,Qij,Pji,Qji,有功線損,
//無功線損。
int i_old,j_old; //線路左、右節點舊號
int Node_Line[LINEMAX][2]; //線路左、右節點舊號工作數組
int Type_Exchange[LINEMAX]; //線路左、右節點舊號交換標志:
//0-沒交換,1-交換。
int Line_No_OldtoNew[LINEMAX]; //舊節點雙排序后的線路號到新線路號
//的轉換數組。
int kk,Line_Type;
double DPLOSS=0,DQLOSS=0; //系統總的有功、無功網損
for(k=0;k<Num_Line;k++)
{
i=Line_NodeName[k][0]; //線路左節點新號
j=Line_NodeName[k][1]; //線路右節點新號
i_old=Node_Name_NewtoOld[i]; //線路左節點舊號
j_old=Node_Name_NewtoOld[j]; //線路右節點舊號
if(i_old<=j_old) //線路左節點舊號<=線路右節點舊號,不交換
{
Node_Line[k][0]=i_old;
Node_Line[k][1]=j_old;
Type_Exchange[k]=0;
}
else //線路左節點舊號>線路右節點舊號,交換
{
Node_Line[k][0]=j_old;
Node_Line[k][1]=i_old;
Type_Exchange[k]=1;
}
Line_No_OldtoNew[k]=k; //舊節點雙排序后的線路號到新線路號的轉
//換數組賦初值
}
for(i=0;i<Num_Line-1;i++)
{
np=i;
for(j=i+1;j<Num_Line;j++)
{
if(Node_Line[j][0]<Node_Line[np][0]\
||(Node_Line[j][0]==Node_Line[np][0])\
&&Node_Line[j][1]<Node_Line[np][1])np=j;
}
I_Temp=Node_Line[np][0];
Node_Line[np][0]=Node_Line[i][0];
Node_Line[i][0]=I_Temp;
I_Temp=Node_Line[np][1];
Node_Line[np][1]=Node_Line[i][1];
Node_Line[i][1]=I_Temp;
I_Temp=Type_Exchange[np];
Type_Exchange[np]=Type_Exchange[i];
Type_Exchange[i]=I_Temp;
I_Temp=Line_No_OldtoNew[np];
Line_No_OldtoNew[np]=Line_No_OldtoNew[i];
Line_No_OldtoNew[i]=I_Temp;
}
/*cout<<endl<<setw(48)<<"Line Flow Output"<<endl; //屏幕輸出部分
cout<<setw(48)<<"================"<<endl;
cout<<setw(4)<<"No"<<setw(4)<<"LBus"<<setw(4)<<"RBus"\
<<setw(4)<<"Type"\
<<setw(9)<<"Pij"<<setw(10)<<"Qij"\
<<setw(10)<<"Pji"<<setw(10)<<"Qji"\
<<setw(12)<<"Line_P_Loss"<<setw(12)<<"Line_Q_Loss"<<endl;*/
onfile<<endl<<setw(50)<<"Line Flow Output"<<endl; //磁盤輸出部分
onfile<<setw(50)<<"================"<<endl;
onfile<<setw(5)<<"No"<<setw(5)<<"LBus"<<setw(5)<<"RBus"\
<<setw(5)<<"Type"\
<<setw(9)<<"Pij"<<setw(10)<<"Qij"\
<<setw(10)<<"Pji"<<setw(10)<<"Qji"\
<<setw(12)<<"Line_P_Loss"<<setw(12)<<"Line_Q_Loss"<<endl;
for(k=0;k<Num_Line;k++)
{
kk=Line_No_OldtoNew[k]; //對應的新線路號
Line_Type=Line_Flag[kk]; //線路類型標志
if(Type_Exchange[k]==1) //線路左、右節點舊號發生過交換,需對變
{ //壓器支路線路類型標志做修改。
if(Line_Type==1)Line_Type=2;
else if(Line_Type==2)Line_Type=1;
//屏幕輸出部分
/*cout<<setw(4)<<k<<setw(4)<<Node_Line[k][0]\
<<setw(4)<<Node_Line[k][1]\
<<setw(4)<<Line_Type\
<<setw(9)<<setprecision(4)<<S_Line[kk][2]\
<<setw(10)<<setprecision(4)<<S_Line[kk][3]\
<<setw(10)<<setprecision(4)<<S_Line[kk][0]\
<<setw(10)<<setprecision(4)<<S_Line[kk][1]\
<<setw(12)<<setprecision(4)<<S_Line[kk][0]+S_Line[kk][2]\
<<setw(12)<<setprecision(4)<<S_Line[kk][1]+S_Line[kk][3]\
<<endl;*/
//磁盤輸出部分
onfile<<setw(5)<<k<<setw(5)<<Node_Line[k][0]\
<<setw(5)<<Node_Line[k][1]\
<<setw(5)<<Line_Type\
<<setw(9)<<setprecision(4)<<S_Line[kk][2]\
<<setw(10)<<setprecision(4)<<S_Line[kk][3]\
<<setw(10)<<setprecision(4)<<S_Line[kk][0]\
<<setw(10)<<setprecision(4)<<S_Line[kk][1]\
<<setw(12)<<setprecision(4)<<S_Line[kk][0]+S_Line[kk][2]\
<<setw(12)<<setprecision(4)<<S_Line[kk][1]+S_Line[kk][3]\
<<endl;
}
else
{
//屏幕輸出部分
/*cout<<setw(4)<<k<<setw(4)<<Node_Line[k][0]\
<<setw(4)<<Node_Line[k][1]\
<<setw(4)<<Line_Type\
<<setw(9)<<setprecision(4)<<S_Line[kk][0]\
<<setw(10)<<setprecision(4)<<S_Line[kk][1]\
<<setw(10)<<setprecision(4)<<S_Line[kk][2]\
<<setw(10)<<setprecision(4)<<S_Line[kk][3]\
<<setw(12)<<setprecision(4)<<S_Line[kk][0]+S_Line[kk][2]\
<<setw(12)<<setprecision(4)<<S_Line[kk][1]+S_Line[kk][3]\
<<endl;*/
//磁盤輸出部分
onfile<<setw(5)<<k<<setw(5)<<Node_Line[k][0]\
<<setw(5)<<Node_Line[k][1]\
<<setw(5)<<Line_Type\
<<setw(9)<<setprecision(4)<<S_Line[kk][0]\
<<setw(10)<<setprecision(4)<<S_Line[kk][1]\
<<setw(10)<<setprecision(4)<<S_Line[kk][2]\
<<setw(10)<<setprecision(4)<<S_Line[kk][3]\
<<setw(12)<<setprecision(4)<<S_Line[kk][0]+S_Line[kk][2]\
<<setw(12)<<setprecision(4)<<S_Line[kk][1]+S_Line[kk][3]\
<<endl;
}
DPLOSS=DPLOSS+S_Line[kk][0]+S_Line[kk][2];
DQLOSS=DQLOSS+S_Line[kk][1]+S_Line[kk][3];
}
//系統總體性能指標輸出:有功網損,無功網損,最低電壓值及其節點名,最高電壓
//值及其節點名,最小電壓相角及其節點名,最大電壓相角及其節點名,收斂次數,
//計算時間。
//屏幕輸出部分
/*cout<<endl<<setw(58)<<"System Characteristics Index Output"<<endl;
cout<<setw(58)<<"==================================="<<endl;
cout<<setw(9)<<"P_LOSS"<<setw(9)<<"Q_LOSS"\
<<setw(7)<<"Vmin"<<setw(4)<<"Bus"\
<<setw(7)<<"Vmax"<<setw(4)<<"Bus"\
<<setw(8)<<"ANGmin"<<setw(4)<<"Bus"\
<<setw(8)<<"ANGmax"<<setw(4)<<"Bus"\
<<setw(7)<<"Num_It"<<setw(8)<<"Time(s)"<<endl;
cout<<setw(9)<<setprecision(4)<<DPLOSS\
<<setw(9)<<setprecision(4)<<DQLOSS\
<<setw(7)<<setprecision(4)<<Voltage_Value_MaxMin[0]\
<<setw(4)<<Node_Name_Voltage_MaxMin[0]\
<<setw(7)<<setprecision(4)<<Voltage_Value_MaxMin[1]\
<<setw(4)<<Node_Name_Voltage_MaxMin[1]\
<<setw(8)<<setprecision(2)<<Voltage_Value_MaxMin[2]\
<<setw(4)<<Node_Name_Voltage_MaxMin[2]\
<<setw(8)<<setprecision(2)<<Voltage_Value_MaxMin[3]\
<<setw(4)<<Node_Name_Voltage_MaxMin[3]\
<<setw(7)<<Num_Iteration\
<<setw(8)<<setprecision(3)<<Duration<<endl<<endl;*/
//磁盤輸出部分
onfile<<endl<<setw(60)<<"System Characteristics Index Output"<<endl;
onfile<<setw(60)<<"==================================="<<endl;
onfile<<setw(9)<<"P_LOSS"<<setw(9)<<"Q_LOSS"\
<<setw(8)<<"Vmin"<<setw(4)<<"Bus"\
<<setw(8)<<"Vmax"<<setw(4)<<"Bus"\
<<setw(8)<<"ANGmin"<<setw(4)<<"Bus"\
<<setw(8)<<"ANGmax"<<setw(4)<<"Bus"\
<<setw(8)<<"Num_It"<<setw(9)<<"Time(s)"<<endl;
onfile<<setw(9)<<setprecision(4)<<DPLOSS\
<<setw(9)<<setprecision(4)<<DQLOSS\
<<setw(8)<<setprecision(4)<<Voltage_Value_MaxMin[0]\
<<setw(4)<<Node_Name_Voltage_MaxMin[0]\
<<setw(8)<<setprecision(4)<<Voltage_Value_MaxMin[1]\
<<setw(4)<<Node_Name_Voltage_MaxMin[1]\
<<setw(8)<<setprecision(2)<<Voltage_Value_MaxMin[2]\
<<setw(4)<<Node_Name_Voltage_MaxMin[2]\
<<setw(8)<<setprecision(2)<<Voltage_Value_MaxMin[3]\
<<setw(4)<<Node_Name_Voltage_MaxMin[3]\
<<setw(8)<<Num_Iteration\
<<setw(9)<<setprecision(3)<<Duration<<endl<<endl;
onfile.close(); //關閉結果輸出磁盤文件
}
//將角度換算到區間[-PAI,PAI]
void TreatAngle(double &angle)
{
if(angle>SinglePai)
angle=angle-DoublePai;
if(angle<-SinglePai)
angle=angle+DoublePai;
}
void main()
{
int i,kgpv,kg_old;
int Num_Node=0; //總節點數
int Num_Line=0; //總線路數
int Num_Gen=0; //總發電機數
int Num_Load=0; //總負荷數
int Num_Swing=0; //總平衡機節點數
int Num_GPV=0; //發電機節點中的PV節點總數
int Num_GPQ=0; //發電機節點中的PQ節點總數
int Num_Cur_Const=0; //常數電流節點總數
int Iter_Max; //迭代次數最大值
int Num_Iteration=0; //迭代次數
int VolIni_Flag; //讀電壓初值標志:1-讀;0-不讀
int VolRes_Flag; //保留電壓(作為下次初值)標志
//:1-保留;0-不保留。
double Eps=10.0; //節點功率失配量值收斂限值
double Power_Dis_Max; //最大節點功率失配量值
double Duration; //存放計算時間(s)
double Power_Dis[NODEMAX][2]; //功率失配量dP、dQ
double Pij_Sum[NODEMAX][2]; //節點所有出線功率累加
double Power_Dis_Correct[NODEMAX]; //dP/V(dSita.V)、dQ/V(dV)
double DVolt[NODEMAX][2]; //電壓修正量dSita.V、dV
clock_t Start, Finish; //計算的起、止時鐘ticks(1ms)
ofstream of_PQDisOut; //功率失配量輸出流定義
Data_Input(Num_Line,Num_Gen,Num_Load,Eps,Iter_Max,
VolIni_Flag,VolRes_Flag); //數據輸入
Start=clock(); //開始時鐘ticks
Node_Sequen(Num_Node,Num_Line,Num_Gen,Num_Load,
Num_Swing,Num_GPV,Num_GPQ); //序號處理
Y_Bus1(Num_Node,Num_Line,Num_Load,Num_Swing); //第一導納陣
Factor_Table(Num_Node,Num_Swing,Num_GPV,0); //形成第一因子表
Y_Bus2(Num_Node,Num_Line,Num_Load,Num_Swing); //第二導納陣
Factor_Table(Num_Node,Num_Swing,Num_GPV,1); //形成第二因子表
Initial(Num_Node,Num_Line,Num_Load,Num_Swing,
Num_GPV,Num_GPQ,Num_Cur_Const,DVolt,
of_PQDisOut,VolIni_Flag); //初始化
Iteration_Back: //迭代開始點
PowerDis_Comp(Num_Node,Num_Load,Num_Swing,
Num_GPV,Num_Cur_Const,Power_Dis,
Pij_Sum,DVolt,of_PQDisOut,
Num_Iteration,Power_Dis_Max); //計算功率失配量
if(Power_Dis_Max>Eps&&Num_Iteration<Iter_Max) //收斂判斷
{
for(i=0;i<Num_Node-Num_Swing;i++)
Power_Dis_Correct[i]=\
Power_Dis[i][0]/Voltage[i][1]; //取dP/V
Equ_Calculation(Num_Node,Num_Swing,Power_Dis_Correct,0);
//有功求解
for(i=0;i<Num_Node-Num_Swing;i++)
{
Voltage[i][0]=Voltage[i][0]\
-Power_Dis_Correct[i]/Voltage[i][1]; //修正相位
TreatAngle(Voltage[i][0]);
DVolt[i][0]=Power_Dis_Correct[i]; //保存相位差dSita.V
Power_Dis_Correct[i]=\
Power_Dis[i][1]/Voltage[i][1]; //取dQ/V
}
Equ_Calculation(Num_Node,Num_Swing,Power_Dis_Correct,1);
//無功求解
for(i=0;i<Num_Node-Num_Swing;i++)
{
Voltage[i][1]=Voltage[i][1]\
-Power_Dis_Correct[i]; //修正幅值
DVolt[i][1]=Power_Dis_Correct[i]; //保存幅值差dV
}
for(kgpv=0;kgpv<Num_GPV;kgpv++) //發電機PV節點的電壓幅值=VG
{
i=Gen_PVNode[kgpv][0];
kg_old=Gen_PVNode[kgpv][1];
Voltage[i][1]=GGen[kg_old].PQV[1];
DVolt[i][1]=0.0; //PV節點電壓幅值差=0.0
}
Num_Iteration++; //迭代次數增1
goto Iteration_Back; //迭代折返點
}
Finish=clock(); //結束時鐘ticks
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -