📄 pf30.cpp
字号:
Cur_Count[0]=Cur_Count[0]+Cur_Temp[0];
Cur_Count[1]=Cur_Count[1]+Cur_Temp[1];
}
Cur_Count[1]=-Cur_Count[1]; //电流取共軛
Comp_Mul(Pij_Sum[i],VV,Cur_Count); //至此,求得从节点i发出的所
//有Pij和Qij之和。
if(kgpv<Num_GPV&&i==Gen_PVNode[kgpv][0]) //发电机PV节点
{
if(kl<Num_Load&&i==Load_NodeName[kl]) //负荷节点
{
kl_old=Load_No_NewtoOld[kl]; //负荷旧顺序号
if(LLoad[kl_old].Flag==1) //计及负荷静特性
Power_Dis[i][0]=Power_Dis[i][0]\
-LLoad[kl_old].ABC[2]*V;
kl++;
}
if(ki<Num_Cur_Const&&i==Node_Name_Curr_Const[ki])
{ //含常数电流节点
Power_Dis[i][0]=Power_Dis[i][0]\
+V*(Current_Const[ki][0]*cos(Ang)\
+Current_Const[ki][1]*sin(Ang));
ki++;
}
Power_Dis[i][0]=Power_Dis[i][0]-Pij_Sum[i][0];
kgpv++;
}
else //PQ节点(包括发电机、负荷及联络节点)
{
if(kl<Num_Load&&i==Load_NodeName[kl]) //负荷节点
{
kl_old=Load_No_NewtoOld[kl]; //负荷旧顺序号
if(LLoad[kl_old].Flag==1) //计及负荷静特性
{
Power_Dis[i][0]=Power_Dis[i][0]\
-LLoad[kl_old].ABC[2]*V;
Power_Dis[i][1]=Power_Dis[i][1]
-LLoad[kl_old].ABC[3]*V;
}
kl++;
}
if(ki<Num_Cur_Const&&i==Node_Name_Curr_Const[ki])
{ //含常数电流节点
Power_Dis[i][0]=Power_Dis[i][0]\
+V*(Current_Const[ki][0]*cos(Ang)\
+Current_Const[ki][1]*sin(Ang));
Power_Dis[i][1]=Power_Dis[i][1]\
+V*(Current_Const[ki][0]*sin(Ang)\
-Current_Const[ki][1]*cos(Ang));
ki++;
}
Power_Dis[i][0]=Power_Dis[i][0]-Pij_Sum[i][0];
Power_Dis[i][1]=Power_Dis[i][1]-Pij_Sum[i][1];
}
}
P_Dis_Max=0.0;
Q_Dis_Max=0.0;
for(i=0;i<Num_Node-Num_Swing;i++)
{
if(fabs(Power_Dis[i][0])>P_Dis_Max)
{
P_Dis_Max=fabs(Power_Dis[i][0]);
ipmax=i;
}
if(fabs(Power_Dis[i][1])>Q_Dis_Max)
{
Q_Dis_Max=fabs(Power_Dis[i][1]);
iqmax=i;
}
}
Power_Dis_Max=__max(P_Dis_Max,Q_Dis_Max);
cout<<setw(15)<<Num_Iteration\
<<setw(15)<<setprecision(8)<<P_Dis_Max\
<<setw(6)<<Node_Name_NewtoOld[ipmax]\
<<setw(15)<<setprecision(8)<<Q_Dis_Max\
<<setw(6)<<Node_Name_NewtoOld[iqmax]<<endl;
of_PQDisOut<<setw(15)<<Num_Iteration\
<<setw(15)<<setprecision(8)<<P_Dis_Max\
<<setw(6)<<Node_Name_NewtoOld[ipmax]\
<<setw(15)<<setprecision(8)<<Q_Dis_Max\
<<setw(6)<<Node_Name_NewtoOld[iqmax]<<endl;
//节点功率一次偏差修正项
for(k=0;k<Num_Cur_Const;k++) //常数电流修正项处理
{
i=Node_Name_Curr_Const[k]; //节点号
if(i<Num_Node-Num_Swing)
{
Ix=Current_Const[k][0];
Iy=Current_Const[k][1];
Ang=Voltage[i][0];
PP=(-Ix*sin(Ang)+Iy*cos(Ang))*DVolt[i][0]\
+(Ix*cos(Ang)+Iy*sin(Ang))*DVolt[i][1];
QQ=(Ix*cos(Ang)+Iy*sin(Ang))*DVolt[i][0]\
+(Ix*sin(Ang)-Iy*cos(Ang))*DVolt[i][1];
Power_Dis[i][0]=Power_Dis[i][0]-PP*0.1;
if(Node_Flag[i]!=2)Power_Dis[i][1]=Power_Dis[i][1]-QQ*0.1;
}
}
for(i=0;i<Num_Node-Num_Swing;i++) //i节点所有出线的Pij、Qij之和
{ //修正项处理。
V=Voltage[i][1];
PP=Pij_Sum[i][1]*DVolt[i][0]-Pij_Sum[i][0]*DVolt[i][1];
QQ=-Pij_Sum[i][0]*DVolt[i][0]-Pij_Sum[i][1]*DVolt[i][1];
// Power_Dis[i][0]=Power_Dis[i][0]-PP/V;
// if(Node_Flag[i]!=2)Power_Dis[i][1]=Power_Dis[i][1]-QQ/V;
Power_Dis[i][0]=Power_Dis[i][0]-PP*0.1;
if(Node_Flag[i]!=2)Power_Dis[i][1]=Power_Dis[i][1]-QQ*0.1;
}
for(k=0;k<Num_Load;k++) //负荷静特性之修正项处理
{
i=Load_NodeName[k];
k1=Load_No_NewtoOld[k];
if(i<Num_Node-Num_Swing&&LLoad[k1].Flag==1)
{
PP=-LLoad[k1].ABC[2]*DVolt[i][1];
QQ=-LLoad[k1].ABC[3]*DVolt[i][1];
Power_Dis[i][0]=Power_Dis[i][0]-PP*0.5;
if(Node_Flag[i]!=2)Power_Dis[i][1]=Power_Dis[i][1]-QQ*.5;
}
}
}
//电压保存(按内部节点号)子程
void Voltage_Reserve(int Num_Node,int Num_Swing)
{
ofstream of_VOut("vol30.ini",ios::out,filebuf::openprot);//打开文件
if(of_VOut.fail()) //判断打开是否有错
{
cerr<<"Error opening the diskette data-file:"\
<<"Vol30.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];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -