?? pf30.cpp
字號(hào):
//多平衡節(jié)點(diǎn)+普通PQ分解
#include "fstream.h"
#include "math.h"
#include "stdlib.h"
#include "iomanip.h"
#include "time.h"
#define LINEMAX 5000 //最大線路數(shù)
#define GENERATORMAX 500 //最大發(fā)電機(jī)數(shù)
#define LOADMAX 2000 //最大負(fù)荷數(shù)
#define NODEMAX 2000 //最大節(jié)點(diǎn)數(shù)
#define SWINGMAX 20 //最大平衡節(jié)點(diǎn)數(shù)
#define PVMAX 500 //最大PV節(jié)點(diǎn)數(shù)
#define NODEFACTOR 10 //導(dǎo)納矩陣中非零非對(duì)角元素的個(gè)數(shù)相對(duì)于
//最大節(jié)點(diǎn)數(shù)(NODEMAX)的倍數(shù).
#define Deg_to_Rad 0.017453292 //度到弧度的轉(zhuǎn)換系數(shù)
#define Rad_to_Deg 57.29577951 //弧度到度的轉(zhuǎn)換系數(shù)
#define SinglePai 3.14159265 //圓周率
#define DoublePai 6.2831853 //兩倍的圓周率
struct Line //線路參數(shù)結(jié)構(gòu)定義
{
int Node_No[2]; //線路兩端節(jié)點(diǎn)名(號(hào)):0-左節(jié)點(diǎn);1-右節(jié)點(diǎn)
int Flag; //線路類型標(biāo)志:0-普通支路;1、2-變壓器支路。其中,
//1-非標(biāo)準(zhǔn)變比在左側(cè)節(jié)點(diǎn),2-非標(biāo)準(zhǔn)變比在右側(cè)節(jié)點(diǎn)。
//對(duì)接地支路,左右節(jié)點(diǎn)名(號(hào))相同。
double RXBK[3]; //0-R;1-X;2-Bc/2 或 K
}LLine[LINEMAX];
struct Generator //發(fā)電機(jī)參數(shù)結(jié)構(gòu)定義
{
int Node_No; //發(fā)電機(jī)節(jié)點(diǎn)名(號(hào))
int Flag; //發(fā)電機(jī)節(jié)點(diǎn)類型標(biāo)志:0-平衡節(jié)點(diǎn);1-PQ節(jié)點(diǎn);2-PV節(jié)點(diǎn)
double PQV[2]; //對(duì)平衡節(jié)點(diǎn),0-V,1-Angle;對(duì)PQ節(jié)點(diǎn),0-P,1-Q;對(duì)PV節(jié)
//點(diǎn),0-P,1-V。
}GGen[GENERATORMAX];
struct Load //負(fù)荷參數(shù)結(jié)構(gòu)定義
{
int Node_No; //負(fù)荷節(jié)點(diǎn)名(號(hào))
int Flag; //負(fù)荷節(jié)點(diǎn)靜特性標(biāo)志:0-不計(jì)靜特性;1-計(jì)靜特性。
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];//新節(jié)點(diǎn)名(號(hào))-->舊節(jié)點(diǎn)名(號(hào))
int Node_Flag[NODEMAX]; //節(jié)點(diǎn)類型標(biāo)志:0-平衡,1-PQ,2-PV
int Line_NodeName[LINEMAX][2]; //線路的左、右節(jié)點(diǎn)新名(號(hào))
int Line_No_NewtoOld[LINEMAX]; //新線路號(hào)-->舊線路號(hào)
int Line_Flag[LINEMAX]; //新線路的類型標(biāo)志:0,1,2說明同Line結(jié)構(gòu)
int Gen_NodeName[GENERATORMAX]; //發(fā)電機(jī)節(jié)點(diǎn)的新節(jié)點(diǎn)名(號(hào))
int Gen_No_NewtoOld[GENERATORMAX]; //新發(fā)電機(jī)順序號(hào)-->舊發(fā)電機(jī)順序號(hào)
int Gen_SWNode[SWINGMAX][2]; //平衡節(jié)點(diǎn)數(shù)據(jù):0-新節(jié)點(diǎn)名(號(hào));
//1-對(duì)應(yīng)的舊發(fā)電機(jī)順序號(hào)
int Gen_PVNode[PVMAX][2]; //發(fā)電機(jī)PV節(jié)點(diǎn)數(shù)據(jù):0-新節(jié)點(diǎn)名(號(hào));
//1-對(duì)應(yīng)的舊發(fā)電機(jī)順序號(hào)
int Gen_PQNode[GENERATORMAX][2];//發(fā)電機(jī)PQ節(jié)點(diǎn)數(shù)據(jù):0-新節(jié)點(diǎn)名(號(hào));
//1-對(duì)應(yīng)的舊發(fā)電機(jī)順序號(hào)
int Load_NodeName[LOADMAX]; //負(fù)荷節(jié)點(diǎn)的新節(jié)點(diǎn)名(號(hào))
int Load_No_NewtoOld[LOADMAX]; //新負(fù)荷順序號(hào)-->舊負(fù)荷順序號(hào)
//讀數(shù)據(jù)子程
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;
// 從鍵盤讀數(shù)據(jù)文件名
char argv[20];
cout<<"Please input diskette data-file name:"<<endl;
cin.getline(argv,sizeof(argv));
// 打開數(shù)據(jù)文件
ifstream infile(argv);
if(infile.fail())
{
cerr<<"Error opening the diskette data-file:"<<argv<<endl;
exit(0);
}
else
{
//讀記數(shù)器變量值
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);
}
//讀線路參數(shù)
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; */
}
//讀發(fā)電機(jī)參數(shù)
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; */
}
//讀負(fù)荷參數(shù)
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();
}
//序號(hào)處理子程
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-節(jié)點(diǎn)名(號(hào));1-節(jié)點(diǎn)出線數(shù)
//統(tǒng)計(jì)各節(jié)點(diǎn)的出線數(shù)
for (i=0;i<NODEMAX;i++)Node_Name[i][1]=0; //節(jié)點(diǎn)出線數(shù)初始化為0
for(i=0;i<Num_Line;i++)
{
if(LLine[i].Node_No[0]==LLine[i].Node_No[1])
continue; //接地支路(左右節(jié)點(diǎn)相同)不在出線統(tǒng)計(jì)之內(nèi)
Flag=0; //左節(jié)點(diǎn)出線數(shù)分析開始
for(j=0;j<Num_Node;j++)
{
if(LLine[i].Node_No[0]==Node_Name[j][0])//該節(jié)點(diǎn)已經(jīng)在節(jié)點(diǎn)
{ //數(shù)組中出現(xiàn),只需
Node_Name[j][1]++; //出線數(shù)加1。
Flag=1;
};
if(Flag==1)break;
}
if(Flag==0) //該節(jié)點(diǎn)還沒在
{ //節(jié)點(diǎn)數(shù)組中出
Node_Name[Num_Node][0]=LLine[i].Node_No[0]; //現(xiàn),需將該節(jié)
Node_Name[Num_Node][1]++; //點(diǎn)名(號(hào))添加
Num_Node++; //到節(jié)點(diǎn)數(shù)組中,
if(Num_Node>NODEMAX) //然后該節(jié)點(diǎn)的
{ //出線數(shù)加1,并
cout<<"Nodes Number > NODEMAX!"<<endl; //將節(jié)點(diǎn)數(shù)也加
exit(4); //1。
}
}
Flag=0; //右節(jié)點(diǎn)出線數(shù)分析開始
for(j=0;j<Num_Node;j++)
{
if(LLine[i].Node_No[1]==Node_Name[j][0])//該節(jié)點(diǎn)已經(jīng)在節(jié)點(diǎn)
{ //數(shù)組中出現(xiàn),只需
Node_Name[j][1]++; //出線數(shù)加1
Flag=1;
};
if(Flag==1)break;
}
if(Flag==0) //該節(jié)點(diǎn)還沒在
{ //節(jié)點(diǎn)數(shù)組中出
Node_Name[Num_Node][0]=LLine[i].Node_No[1]; //現(xiàn),需將該節(jié)
Node_Name[Num_Node][1]++; //點(diǎn)名(號(hào))添加
Num_Node++; //到節(jié)點(diǎn)數(shù)組中,
if(Num_Node>NODEMAX) //然后該節(jié)點(diǎn)的
{ //出線數(shù)加1,并
cout<<"Nodes Number > NODEMAX!"<<endl; //將節(jié)點(diǎn)數(shù)也加
exit(5); //1。
}
}
}
//節(jié)點(diǎn)出線數(shù)統(tǒng)計(jì)完畢,屏幕輸出。其中,Num_Node為總節(jié)點(diǎn)數(shù)。
/* 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;*/
//根據(jù)出線數(shù)由小到大的順序?qū)?jié)點(diǎn)進(jìn)行排序(冒泡算法)
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;*/
//平衡節(jié)點(diǎn)統(tǒng)計(jì):總數(shù)及各節(jié)點(diǎn)的名(號(hào))
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;*/
//根據(jù)出線數(shù)由小到大的順序?qū)?jié)點(diǎn)排序,并將平衡節(jié)點(diǎn)排在最后(序號(hào)最大)
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時(shí),表示該節(jié)點(diǎn)為平衡節(jié)點(diǎn),
} //需排在靠后的位置上。
if(Flag==0)
{
Node_Name_NewtoOld[Nnode]=Node_Name[i][0];
Nnode++;
}
else //最后的各平衡節(jié)點(diǎn)間也仍然按出線數(shù)由小到大的順序排列
{
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; */
//新線路類型標(biāo)志賦初值
for(i=0;i<Num_Line;i++)Line_Flag[i]=LLine[i].Flag;
//線路名(號(hào))處理:變成新的節(jié)點(diǎn)名(號(hào))且左節(jié)點(diǎn)的絕對(duì)值小于右節(jié)點(diǎn)的絕對(duì)值
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])//左節(jié)點(diǎn)處理
{
Line_NodeName[i][0]=j; //賦新名(號(hào))
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])//右節(jié)點(diǎn)處理
{
Line_NodeName[i][1]=j; //賦新名(號(hào))
Flag=1;
}
if(Flag==1)break;
}
if(Line_NodeName[i][0]>Line_NodeName[i][1])//左節(jié)點(diǎn)的絕對(duì)值小于
{ //右節(jié)點(diǎn)的絕對(duì)值處理
if(LLine[i].Flag==1)Line_Flag[i]=2; //變壓器的非標(biāo)準(zhǔn)
if(LLine[i].Flag==2)Line_Flag[i]=1; //變比側(cè)發(fā)生變化
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;
*/
//線路排序:按照左節(jié)點(diǎn)的絕對(duì)值由小到大、若左節(jié)點(diǎn)的絕對(duì)值相等則按照右節(jié)
//點(diǎn)的絕對(duì)值由小到大順序排序(雙排序冒泡算法)
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;
*/
//發(fā)電機(jī)節(jié)點(diǎn)名(號(hào))處理:變成新的節(jié)點(diǎn)名(號(hào))
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; //賦新名(號(hào))
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;*/
//發(fā)電機(jī)排序:按照新節(jié)點(diǎn)名(號(hào))由小到大的順序排序,并找出新發(fā)電機(jī)序號(hào)
//對(duì)應(yīng)的舊發(fā)電機(jī)序號(hào)
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;*/
//負(fù)荷節(jié)點(diǎn)名(號(hào))處理:變成新的節(jié)點(diǎn)名(號(hào))
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; //賦新名(號(hào))
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;*/
//負(fù)荷排序:按照新節(jié)點(diǎn)名(號(hào))由小到大的順序排序,并找出新負(fù)荷序號(hào)
//對(duì)應(yīng)的舊負(fù)荷序號(hào)
for(i=0;i<Num_Load;i++)Load_No_NewtoOld[i]=i;
for(i=0;i<Num_Load-1;i++)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -