?? pf30.cpp
字號:
//多平衡節點+普通PQ分解
#include "fstream.h"
#include "math.h"
#include "stdlib.h"
#include "iomanip.h"
#include "time.h"
#define LINEMAX 5000 //最大線路數
#define GENERATORMAX 500 //最大發電機數
#define LOADMAX 2000 //最大負荷數
#define NODEMAX 2000 //最大節點數
#define SWINGMAX 20 //最大平衡節點數
#define PVMAX 500 //最大PV節點數
#define NODEFACTOR 10 //導納矩陣中非零非對角元素的個數相對于
//最大節點數(NODEMAX)的倍數.
#define Deg_to_Rad 0.017453292 //度到弧度的轉換系數
#define Rad_to_Deg 57.29577951 //弧度到度的轉換系數
#define SinglePai 3.14159265 //圓周率
#define DoublePai 6.2831853 //兩倍的圓周率
struct Line //線路參數結構定義
{
int Node_No[2]; //線路兩端節點名(號):0-左節點;1-右節點
int Flag; //線路類型標志:0-普通支路;1、2-變壓器支路。其中,
//1-非標準變比在左側節點,2-非標準變比在右側節點。
//對接地支路,左右節點名(號)相同。
double RXBK[3]; //0-R;1-X;2-Bc/2 或 K
}LLine[LINEMAX];
struct Generator //發電機參數結構定義
{
int Node_No; //發電機節點名(號)
int Flag; //發電機節點類型標志:0-平衡節點;1-PQ節點;2-PV節點
double PQV[2]; //對平衡節點,0-V,1-Angle;對PQ節點,0-P,1-Q;對PV節
//點,0-P,1-V。
}GGen[GENERATORMAX];
struct Load //負荷參數結構定義
{
int Node_No; //負荷節點名(號)
int Flag; //負荷節點靜特性標志:0-不計靜特性;1-計靜特性。
double ABC[6]; //PL=a1*V**V+b1*V+c1,QL=a2*V*V+b2*V+c2。
//0-a1;1-a2;2-b1;3-b2;4-c1;5-c2。
}LLoad[LOADMAX];
int Node_Name_NewtoOld[NODEMAX];//新節點名(號)-->舊節點名(號)
int Node_Flag[NODEMAX]; //節點類型標志:0-平衡,1-PQ,2-PV
int Line_NodeName[LINEMAX][2]; //線路的左、右節點新名(號)
int Line_No_NewtoOld[LINEMAX]; //新線路號-->舊線路號
int Line_Flag[LINEMAX]; //新線路的類型標志:0,1,2說明同Line結構
int Gen_NodeName[GENERATORMAX]; //發電機節點的新節點名(號)
int Gen_No_NewtoOld[GENERATORMAX]; //新發電機順序號-->舊發電機順序號
int Gen_SWNode[SWINGMAX][2]; //平衡節點數據:0-新節點名(號);
//1-對應的舊發電機順序號
int Gen_PVNode[PVMAX][2]; //發電機PV節點數據:0-新節點名(號);
//1-對應的舊發電機順序號
int Gen_PQNode[GENERATORMAX][2];//發電機PQ節點數據:0-新節點名(號);
//1-對應的舊發電機順序號
int Load_NodeName[LOADMAX]; //負荷節點的新節點名(號)
int Load_No_NewtoOld[LOADMAX]; //新負荷順序號-->舊負荷順序號
//讀數據子程
void Data_Input(int &Num_Line,int &Num_Gen,int &Num_Load,double &Eps,
int &Iter_Max,int &VolIni_Flag,int &VolRes_Flag)
{
int i,j;
// 從鍵盤讀數據文件名
char argv[20];
cout<<"Please input diskette data-file name:"<<endl;
cin.getline(argv,sizeof(argv));
// 打開數據文件
ifstream infile(argv);
if(infile.fail())
{
cerr<<"Error opening the diskette data-file:"<<argv<<endl;
exit(0);
}
else
{
//讀記數器變量值
infile>>Num_Line>>Num_Gen>>Num_Load>>Eps>>Iter_Max\
>>VolIni_Flag>>VolRes_Flag;
/* cout<<setw(5)<<Num_Line<<setw(5)<<Num_Gen\
<<setw(5)<<Num_Load<<setw(10)<<Eps\
<<Iter_Max<<VolIni_Flag<<VolRes_Flag<<endl; */
if(Num_Line>LINEMAX)
{
cout<<"Lines Number > LINEMAX!"<<endl; exit(0);
}
if(Num_Gen>GENERATORMAX)
{
cout<<"Generators Number > GENERATORMAX!"<<endl;
exit(1);
}
if(Num_Load>LOADMAX)
{
cout<<"Loads Number > LOADMAX!"<<endl; exit(2);
}
//讀線路參數
for(i=0;i<Num_Line;i++)
{
infile>>LLine[i].Node_No[0]>>LLine[i].Node_No[1]\
>>LLine[i].Flag;
for(j=0;j<3;j++)infile>>LLine[i].RXBK[j];
/*cout<<setw(5)<<LLine[i].Node_No[0]\
<<setw(5)<<LLine[i].Node_No[1]\
<<setw(5)<<LLine[i].Flag;
cout<<setw(10)<<LLine[i].RXBK[0]\
<<setw(10)<<LLine[i].RXBK[1]\
<<setw(10)<<LLine[i].RXBK[2]<<endl; */
}
//讀發電機參數
for(i=0;i<Num_Gen;i++)
{
infile>>GGen[i].Node_No>>GGen[i].Flag>>GGen[i].PQV[0]\
>>GGen[i].PQV[1];
/* cout<<setw(5)<<GGen[i].Node_No\
<<setw(5)<<GGen[i].Flag\
<<setw(10)<<GGen[i].PQV[0]\
<<setw(10)<<GGen[i].PQV[1]<<endl; */
}
//讀負荷參數
for(i=0;i<Num_Load;i++)
{
infile>>LLoad[i].Node_No>>LLoad[i].Flag;
for(j=0;j<6;j++)infile>>LLoad[i].ABC[j];
/* cout<<setw(5)<<LLoad[i].Node_No<<setw(5)<<LLoad[i].Flag;
for(j=0;j<6;j++)cout<<setw(10)<<LLoad[i].ABC[j];
cout<<endl; */
}
}
infile.close();
}
//序號處理子程
void Node_Sequen(int &Num_Node,int Num_Line,int Num_Gen,int Num_Load,
int &Num_Swing,int &Num_GPV,int &Num_GPQ)
{
int i,j,Flag,temp,np;
int Node_Name[NODEMAX][2]; //0-節點名(號);1-節點出線數
//統計各節點的出線數
for (i=0;i<NODEMAX;i++)Node_Name[i][1]=0; //節點出線數初始化為0
for(i=0;i<Num_Line;i++)
{
if(LLine[i].Node_No[0]==LLine[i].Node_No[1])
continue; //接地支路(左右節點相同)不在出線統計之內
Flag=0; //左節點出線數分析開始
for(j=0;j<Num_Node;j++)
{
if(LLine[i].Node_No[0]==Node_Name[j][0])//該節點已經在節點
{ //數組中出現,只需
Node_Name[j][1]++; //出線數加1。
Flag=1;
};
if(Flag==1)break;
}
if(Flag==0) //該節點還沒在
{ //節點數組中出
Node_Name[Num_Node][0]=LLine[i].Node_No[0]; //現,需將該節
Node_Name[Num_Node][1]++; //點名(號)添加
Num_Node++; //到節點數組中,
if(Num_Node>NODEMAX) //然后該節點的
{ //出線數加1,并
cout<<"Nodes Number > NODEMAX!"<<endl; //將節點數也加
exit(4); //1。
}
}
Flag=0; //右節點出線數分析開始
for(j=0;j<Num_Node;j++)
{
if(LLine[i].Node_No[1]==Node_Name[j][0])//該節點已經在節點
{ //數組中出現,只需
Node_Name[j][1]++; //出線數加1
Flag=1;
};
if(Flag==1)break;
}
if(Flag==0) //該節點還沒在
{ //節點數組中出
Node_Name[Num_Node][0]=LLine[i].Node_No[1]; //現,需將該節
Node_Name[Num_Node][1]++; //點名(號)添加
Num_Node++; //到節點數組中,
if(Num_Node>NODEMAX) //然后該節點的
{ //出線數加1,并
cout<<"Nodes Number > NODEMAX!"<<endl; //將節點數也加
exit(5); //1。
}
}
}
//節點出線數統計完畢,屏幕輸出。其中,Num_Node為總節點數。
/* cout<<endl<<"Node: Number, Name and out-line number"<<endl;
for(i=0;i<Num_Node;i++)cout<<setw(5)<<i<<setw(5)<<Node_Name[i][0]\
<<setw(5)<<Node_Name[i][1]<<endl;*/
//根據出線數由小到大的順序對節點進行排序(冒泡算法)
for(i=0;i<Num_Node-1;i++)
{
np=i;
for(int j=i+1;j<Num_Node;j++)
if(Node_Name[np][1]>Node_Name[j][1])np=j;
temp=Node_Name[i][0];
Node_Name[i][0]=Node_Name[np][0];
Node_Name[np][0]=temp;
temp=Node_Name[i][1];
Node_Name[i][1]=Node_Name[np][1];
Node_Name[np][1]=temp;
}
/* cout<<endl<<"Node Sequence: Number, Name and out-line number"<<endl;
for(i=0;i<Num_Node;i++)cout<<setw(5)<<i<<setw(5)<<Node_Name[i][0]\
<<setw(5)<<Node_Name[i][1]<<endl;*/
//平衡節點統計:總數及各節點的名(號)
int Node_Name_Swing[SWINGMAX];
for(i=0;i<Num_Gen;i++)
{
if(GGen[i].Flag==0)
{
Node_Name_Swing[Num_Swing]=GGen[i].Node_No;
Num_Swing++;
if(Num_Swing>SWINGMAX)
{
cout<<"Swinging Generators Number > SWINGMAX!"<<endl;
exit(6);
}
}
}
/* cout<<endl<<"Swing: Number and Name "<<Num_Swing<<endl;
for(i=0;i<Num_Swing;i++)cout<<setw(5)<<i<<setw(5)<<\
Node_Name_Swing[i]<<endl;*/
//根據出線數由小到大的順序對節點排序,并將平衡節點排在最后(序號最大)
int Nswing=0,Nnode=0;
for(i=0;i<Num_Node;i++)
{
Flag=0;
for(j=0;j<Num_Swing;j++)
{
if(Node_Name[i][0]==Node_Name_Swing[j])Flag=1;
if(Flag==1)break; //Flag=1時,表示該節點為平衡節點,
} //需排在靠后的位置上。
if(Flag==0)
{
Node_Name_NewtoOld[Nnode]=Node_Name[i][0];
Nnode++;
}
else //最后的各平衡節點間也仍然按出線數由小到大的順序排列
{
Node_Name_NewtoOld[Num_Node-Num_Swing+Nswing]=\
Node_Name[i][0];
Nswing++;
}
}
/* cout<<endl<<"Node Sequence with swing nodes being in the end: "\
<<"Number, Name"<<endl;
for(i=0;i<Num_Node;i++)cout<<setw(5)<<i<<setw(5)\
<<Node_Name_NewtoOld[i]<<endl; */
//新線路類型標志賦初值
for(i=0;i<Num_Line;i++)Line_Flag[i]=LLine[i].Flag;
//線路名(號)處理:變成新的節點名(號)且左節點的絕對值小于右節點的絕對值
for(i=0;i<Num_Line;i++)
{
Flag=0;
for(j=0;j<Num_Node;j++)
{
if(LLine[i].Node_No[0]==Node_Name_NewtoOld[j])//左節點處理
{
Line_NodeName[i][0]=j; //賦新名(號)
Flag=1;
}
if(Flag==1)break;
}
Flag=0;
for(j=0;j<Num_Node;j++)
{
if(LLine[i].Node_No[1]==Node_Name_NewtoOld[j])//右節點處理
{
Line_NodeName[i][1]=j; //賦新名(號)
Flag=1;
}
if(Flag==1)break;
}
if(Line_NodeName[i][0]>Line_NodeName[i][1])//左節點的絕對值小于
{ //右節點的絕對值處理
if(LLine[i].Flag==1)Line_Flag[i]=2; //變壓器的非標準
if(LLine[i].Flag==2)Line_Flag[i]=1; //變比側發生變化
temp=Line_NodeName[i][0];
Line_NodeName[i][0]=Line_NodeName[i][1];
Line_NodeName[i][1]=temp;
}
}
/* cout<<endl<<"Line:line number,type,left node,right node"<<endl;
for(i=0;i<Num_Line;i++)
cout<<setw(5)<<i<<setw(5)<<Line_Flag[i]\
<<setw(5)<<Line_NodeName[i][0]\
<<setw(5)<<Line_NodeName[i][1]<<endl;
*/
//線路排序:按照左節點的絕對值由小到大、若左節點的絕對值相等則按照右節
//點的絕對值由小到大順序排序(雙排序冒泡算法)
for(i=0;i<Num_Line;i++)Line_No_NewtoOld[i]=i;
for(i=0;i<Num_Line-1;i++)
{
np=i;
for(j=i+1;j<Num_Line;j++)
{
if(Line_NodeName[j][0]<Line_NodeName[np][0] \
||(Line_NodeName[j][0]==Line_NodeName[np][0] \
&&Line_NodeName[j][1]<Line_NodeName[np][1]))
{
np=j;
}
}
temp=Line_NodeName[np][0];
Line_NodeName[np][0]=Line_NodeName[i][0];
Line_NodeName[i][0]=temp;
temp=Line_NodeName[np][1];
Line_NodeName[np][1]=Line_NodeName[i][1];
Line_NodeName[i][1]=temp;
temp=Line_No_NewtoOld[np];
Line_No_NewtoOld[np]=Line_No_NewtoOld[i];
Line_No_NewtoOld[i]=temp;
temp=Line_Flag[np];
Line_Flag[np]=Line_Flag[i];
Line_Flag[i]=temp;
}
/* cout<<endl<<"Line sequencing: new line number,new type, new left"\
<<" node, new right node, old line number"<<endl;
for(i=0;i<Num_Line;i++)
cout<<setw(5)<<i<<setw(5)<<Line_Flag[i]\
<<setw(5)<<Line_NodeName[i][0]\
<<setw(5)<<Line_NodeName[i][1]\
<<setw(5)<<Line_No_NewtoOld[i]<<endl;
*/
//發電機節點名(號)處理:變成新的節點名(號)
for(i=0;i<Num_Gen;i++)
{
Flag=0;
for(j=0;j<Num_Node;j++)
{
if(GGen[i].Node_No==Node_Name_NewtoOld[j])
{
Gen_NodeName[i]=j; //賦新名(號)
Flag=1;
}
if(Flag==1)break;
}
}
/* cout<<endl<<"Generator node new name:number, new node name"<<endl;
for(i=0;i<Num_Gen;i++)
cout<<setw(5)<<i<<setw(5)<<Gen_NodeName[i]<<endl;*/
//發電機排序:按照新節點名(號)由小到大的順序排序,并找出新發電機序號
//對應的舊發電機序號
for(i=0;i<Num_Gen;i++)Gen_No_NewtoOld[i]=i;
for(i=0;i<Num_Gen-1;i++)
{
np=i;
for(j=i+1;j<Num_Gen;j++)
{
if(Gen_NodeName[j]<Gen_NodeName[np])
{
np=j;
}
}
temp=Gen_NodeName[np];
Gen_NodeName[np]=Gen_NodeName[i];
Gen_NodeName[i]=temp;
temp=Gen_No_NewtoOld[np];
Gen_No_NewtoOld[np]=Gen_No_NewtoOld[i];
Gen_No_NewtoOld[i]=temp;
}
/*cout<<endl<<"Generator sequencing: new gen number, new node, old"\
<<" gen number"<<endl;
for(i=0;i<Num_Gen;i++)
cout<<setw(5)<<i<<setw(5)<<Gen_NodeName[i]\
<<setw(5)<<Gen_No_NewtoOld[i]<<endl;*/
//負荷節點名(號)處理:變成新的節點名(號)
for(i=0;i<Num_Load;i++)
{
Flag=0;
for(j=0;j<Num_Node;j++)
{
if(LLoad[i].Node_No==Node_Name_NewtoOld[j])
{
Load_NodeName[i]=j; //賦新名(號)
Flag=1;
}
if(Flag==1)break;
}
}
/* cout<<endl<<"Load node new name: number, new node name"<<endl;
for(i=0;i<Num_Load;i++)
cout<<setw(5)<<i<<setw(5)<<Load_NodeName[i]<<endl;*/
//負荷排序:按照新節點名(號)由小到大的順序排序,并找出新負荷序號
//對應的舊負荷序號
for(i=0;i<Num_Load;i++)Load_No_NewtoOld[i]=i;
for(i=0;i<Num_Load-1;i++)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -