📄 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
Duration=(double)(Finish-Start)/CLOCKS_PER_SEC; //计算时间(s)
if(Vo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -