📄 pf33.cpp
字号:
SN=sin(Ang);
G=Y_BigRtoX[k][0];
B=Y_BigRtoX[k][1];
PP=Vj*(-G*SN+B*CS)*DVolt[i][0]+(Vj*(G*CS+B*SN)-2.0*G*Vi)*DVolt[i][1]+\
Vi*(G*SN-B*CS)*DVolt[j][0]+Vi*(G*CS+B*SN)*DVolt[j][1];
QQ=Vj*(G*CS+B*SN)*DVolt[i][0]+(Vj*(G*SN-B*CS)+2.0*B*Vi)*DVolt[i][1]+\
-Vi*(G*CS+B*SN)*DVolt[j][0]+Vi*(G*SN-B*CS)*DVolt[j][1];
Power_Dis[i][0]=Power_Dis[i][0]-PP;
Power_Dis[i][1]=Power_Dis[i][1]-QQ;
PP=-Vj*(G*SN+B*CS)*DVolt[i][0]+Vj*(G*CS-B*SN)*DVolt[i][1]+\
Vi*(G*SN+B*CS)*DVolt[j][0]+(Vi*(G*CS-B*SN)-2.0*G*Vj)*DVolt[j][1];
QQ=Vj*(-G*CS+B*SN)*DVolt[i][0]-Vj*(G*SN+B*CS)*DVolt[i][1]+\
Vi*(G*CS-B*SN)*DVolt[j][0]-(Vi*(G*SN+B*CS)-2.0*B*Vj)*DVolt[j][1];
Power_Dis[j][0]=Power_Dis[j][0]-PP;
Power_Dis[j][1]=Power_Dis[j][1]-QQ;
}*/
}
void Voltage_Reserve(int Num_Node,int Num_Swing) //电压保存(按内部节点号)子程
{
ofstream of_VOut("vol33.ini",ios::out,filebuf::openprot); //打开电压输出磁盘文件
if(of_VOut.fail()) //判断打开是否有错
{
cerr<<"Error opening the diskette data-file:"<<"Vol33.ini"<<endl;
exit(10);
}
of_VOut<< setiosflags( ios::fixed );
for(int i=0;i<Num_Node-Num_Swing;i++)
of_VOut<<setw(12)<<Voltage[i][0]<<setw(12)<<Voltage[i][1]<<endl;
of_VOut.close(); //关闭磁盘文件
}
//结果输出子程
void Result_Output(int Num_Node,
int Num_Line,
int Num_Gen,
int Num_Load,
int Num_Swing,
int Num_Iteration,
double Duration)
{
int i,j,k,kg_old,kl_old,k_old;
double Z[2],BK; //线路参数临时工作单元
double S_Count[NODEMAX][2]; //节点所有出线功率累加数组:0-实部,1-虚部
double S_Line[LINEMAX][4]; //线路功率:0-Pij,1-Qij,2-Pji,3-Qji
double S_Node[NODEMAX][4]; //节点功率:0-PG,1-QG,2-PL,3-QL
double DS_Node[NODEMAX][2]; //节点功率失配量:0-有功失配量,1-无功失配量
double S_T[2],V_T[2],I_T[2],I1_T[2],I2_T[2]; //临时工作单元
double V,t,Angle,Vi,Vj,Angi,Angj;
//将平衡节点的电压值送入数组Voltage[][]中
for(i=0;i<Num_Swing;i++)
{
j=Gen_SWNode[i][0];
kg_old=Gen_SWNode[i][1];
Angle=GGen[kg_old].PQV[1]*Deg_to_Rad;
Voltage[j][0]=Angle;
Voltage[j][1]=GGen[kg_old].PQV[0];
} //至此可以直接使用系统中所有节点电压的相位和幅值
//初值化处理
for(i=0;i<Num_Node;i++)
{
S_Count[i][0]=0.0; //节点所有出线功率累加数组赋初值0
S_Count[i][1]=0.0;
S_Node[i][0]=0.0; //节点功率数组赋初值0
S_Node[i][1]=0.0;
S_Node[i][2]=0.0;
S_Node[i][3]=0.0;
}
//求线路潮流及各节点的所有出线功率累加
for(k=0;k<Num_Line;k++)
{
i=Line_NodeName[k][0]; //取线路左节点
j=Line_NodeName[k][1]; //取线路右节点
k_old=Line_No_NewtoOld[k]; //对应的旧线路顺序号
Z[0]=LLine[k_old].RXBK[0]; //取线路的电阻值
Z[1]=LLine[k_old].RXBK[1]; //取线路的电抗值
BK=LLine[k_old].RXBK[2]; //取线路容纳的半值或变压器的非标准变比
if(Line_Flag[k]==0) //普通支路
{
if(i!=j) //非接地支路
{
Vi=Voltage[i][1];
Vj=Voltage[j][1];
Angi=Voltage[i][0];
Angj=Voltage[j][0];
V_T[0]=Vi*cos(Angi)-Vj*cos(Angj);
V_T[1]=Vi*sin(Angi)-Vj*sin(Angj);
Comp_Div(I_T,V_T,Z);
I1_T[0]=I_T[0]-BK*Vi*sin(Angi); //Iij
I1_T[1]=I_T[1]+BK*Vi*cos(Angi);
I1_T[1]=-I1_T[1]; //取Iij的共轭
I2_T[0]=-I_T[0]-BK*Vj*sin(Angj); //Iji
I2_T[1]=-I_T[1]+BK*Vj*cos(Angj);
I2_T[1]=-I2_T[1]; //取Iji的共轭
V_T[0]=Vi*cos(Angi);
V_T[1]=Vi*sin(Angi);
Comp_Mul(S_T,V_T,I1_T); //求Sij
S_Line[k][0]=S_T[0];
S_Line[k][1]=S_T[1];
S_Count[i][0]=S_Count[i][0]+S_T[0]; //节点i出线功率累加
S_Count[i][1]=S_Count[i][1]+S_T[1];
V_T[0]=Vj*cos(Angj);
V_T[1]=Vj*sin(Angj);
Comp_Mul(S_T,V_T,I2_T); //求Sji
S_Line[k][2]=S_T[0];
S_Line[k][3]=S_T[1];
S_Count[j][0]=S_Count[j][0]+S_T[0]; //节点j出线功率累加
S_Count[j][1]=S_Count[j][1]+S_T[1];
}
else //接地支路
{
Vi=Voltage[i][1];
Angi=Voltage[i][0];
V_T[0]=Vi*cos(Angi);
V_T[1]=Vi*sin(Angi);
Comp_Div(I_T,V_T,Z);
I1_T[0]=I_T[0]-BK*Vi*sin(Angi); //求接地支路电流Iii
I1_T[1]=I_T[1]+BK*Vi*cos(Angi);
I1_T[1]=-I1_T[1]; //取Iii的共轭
Comp_Mul(S_T,V_T,I1_T);
S_Line[k][0]=S_T[0]; //求Sii(由节点i到地节点)
S_Line[k][1]=S_T[1];
S_Line[k][2]=0.0; //求Sii(由地节点到节点i,其值等于零)
S_Line[k][3]=0.0;
S_Count[i][0]=S_Count[i][0]+S_T[0]; //节点i出线功率累加
S_Count[i][1]=S_Count[i][1]+S_T[1];
}
}
else if(Line_Flag[k]==1) //非标准变比在节点i侧的变压器支路
{
Vi=Voltage[i][1];
Vj=Voltage[j][1];
Angi=Voltage[i][0];
Angj=Voltage[j][0];
V_T[0]=Vi*cos(Angi)-Vj*cos(Angj);
V_T[1]=Vi*sin(Angi)-Vj*sin(Angj);
Comp_Div(I_T,V_T,Z);
I_T[0]=I_T[0]/BK;
I_T[1]=I_T[1]/BK;
V_T[0]=Vi*cos(Angi);
V_T[1]=Vi*sin(Angi);
Comp_Div(I1_T,V_T,Z);
t=(1.0/BK-1.0)/BK;
I1_T[0]=I1_T[0]*t;
I1_T[1]=I1_T[1]*t;
I1_T[0]=I1_T[0]+I_T[0]; //Iij
I1_T[1]=I1_T[1]+I_T[1];
I1_T[1]=-I1_T[1]; //取Iij的共轭
V_T[0]=Vj*cos(Angj);
V_T[1]=Vj*sin(Angj);
Comp_Div(I2_T,V_T,Z);
t=1.0-1.0/BK;
I2_T[0]=I2_T[0]*t-I_T[0]; //Iji
I2_T[1]=I2_T[1]*t-I_T[1];
I2_T[1]=-I2_T[1]; //取Iji的共轭
V_T[0]=Vi*cos(Angi);
V_T[1]=Vi*sin(Angi);
Comp_Mul(S_T,V_T,I1_T); //求Sij
S_Line[k][0]=S_T[0];
S_Line[k][1]=S_T[1];
S_Count[i][0]=S_Count[i][0]+S_T[0]; //节点i出线功率累加
S_Count[i][1]=S_Count[i][1]+S_T[1];
V_T[0]=Vj*cos(Angj);
V_T[1]=Vj*sin(Angj);
Comp_Mul(S_T,V_T,I2_T); //求Sji
S_Line[k][2]=S_T[0];
S_Line[k][3]=S_T[1];
S_Count[j][0]=S_Count[j][0]+S_T[0]; //节点j出线功率累加
S_Count[j][1]=S_Count[j][1]+S_T[1];
}
else if(Line_Flag[k]==2) //非标准变比在节点j侧的变压器支路
{
Vi=Voltage[i][1];
Vj=Voltage[j][1];
Angi=Voltage[i][0];
Angj=Voltage[j][0];
V_T[0]=Vi*cos(Angi)-Vj*cos(Angj);
V_T[1]=Vi*sin(Angi)-Vj*sin(Angj);
Comp_Div(I_T,V_T,Z);
I_T[0]=I_T[0]/BK;
I_T[1]=I_T[1]/BK;
V_T[0]=Vi*cos(Angi);
V_T[1]=Vi*sin(Angi);
Comp_Div(I1_T,V_T,Z);
t=1.0-1.0/BK;
I1_T[0]=I1_T[0]*t;
I1_T[1]=I1_T[1]*t;
I1_T[0]=I1_T[0]+I_T[0]; //Iij
I1_T[1]=I1_T[1]+I_T[1];
I1_T[1]=-I1_T[1]; //取Iij的共轭
V_T[0]=Vj*cos(Angj);
V_T[1]=Vj*sin(Angj);
Comp_Div(I2_T,V_T,Z);
t=(1.0/BK-1.0)/BK;
I2_T[0]=I2_T[0]*t-I_T[0]; //Iji
I2_T[1]=I2_T[1]*t-I_T[1];
I2_T[1]=-I2_T[1]; //取Iji的共轭
V_T[0]=Vi*cos(Angi);
V_T[1]=Vi*sin(Angi);
Comp_Mul(S_T,V_T,I1_T); //求Sij
S_Line[k][0]=S_T[0];
S_Line[k][1]=S_T[1];
S_Count[i][0]=S_Count[i][0]+S_T[0]; //节点i出线功率累加
S_Count[i][1]=S_Count[i][1]+S_T[1];
V_T[0]=Vj*cos(Angj);
V_T[1]=Vj*sin(Angj);
Comp_Mul(S_T,V_T,I2_T); //求Sji
S_Line[k][2]=S_T[0];
S_Line[k][3]=S_T[1];
S_Count[j][0]=S_Count[j][0]+S_T[0]; //节点j出线功率累加
S_Count[j][1]=S_Count[j][1]+S_T[1];
}
else //没有此种线路类型
{
cout<<"There is not this line type!"<<endl;
exit(0);
}
}
//将节点功率失配量赋初值为节点出线功率累加的负值
for(i=0;i<Num_Node;i++)
{
DS_Node[i][0]=-S_Count[i][0];
DS_Node[i][1]=-S_Count[i][1];
}
//求取负荷节点功率PL和QL
for(i=0;i<Num_Load;i++)
{
j=Load_NodeName[i]; //负荷节点名称
kl_old=Load_No_NewtoOld[i]; //负荷节点旧顺序号
if(LLoad[kl_old].Flag==1) //计及静特性
{
V=Voltage[j][1];
S_Node[j][2]=LLoad[kl_old].ABC[0]*V*V+LLoad[kl_old].ABC[2]*V+\
LLoad[kl_old].ABC[4];
S_Node[j][3]=LLoad[kl_old].ABC[1]*V*V+LLoad[kl_old].ABC[3]*V+\
LLoad[kl_old].ABC[5];
}
else if(LLoad[kl_old].Flag==0) //不计静特性
{
S_Node[j][2]=LLoad[kl_old].ABC[4];
S_Node[j][3]=LLoad[kl_old].ABC[5];
}
else //没有此种类型的负荷节点
{
cout<<"There is not this load node type!"<<endl;
exit(1);
}
DS_Node[j][0]=DS_Node[j][0]-S_Node[j][2]; //功率失配量处理
DS_Node[j][1]=DS_Node[j][1]-S_Node[j][3];
}
//求取发电机节点功率PG和QG
for(i=0;i<Num_Gen;i++)
{
j=Gen_NodeName[i]; //发电机节点名称
kg_old=Gen_No_NewtoOld[i]; //发电机节点旧顺序号
if(GGen[kg_old].Flag==0) //平衡发电机节点
{
S_Node[j][0]=S_Count[j][0]+S_Node[j][2];
S_Node[j][1]=S_Count[j][1]+S_Node[j][3];
}
else if(GGen[kg_old].Flag==1) //发电机PQ节点
{
S_Node[j][0]=GGen[kg_old].PQV[0];
S_Node[j][1]=GGen[kg_old].PQV[1];
}
else if(GGen[kg_old].Flag==2) //发电机PV节点
{
S_Node[j][0]=GGen[kg_old].PQV[0];
S_Node[j][1]=S_Count[j][1]+S_Node[j][3];
}
else //没有此种类型的发电机节点
{
cout<<"There is not this generator node type!"<<endl;
exit(2);
}
DS_Node[j][0]=DS_Node[j][0]+S_Node[j][0]; //功率失配量处理
DS_Node[j][1]=DS_Node[j][1]+S_Node[j][1];
}
//节点潮流输出:序号,节点号,节点类型,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]; //线路左、右节点旧
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -