⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pf30.cpp

📁 电力系统潮流计算程序 电力专业的学生用的最多的一个小程序。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			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 + -