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

📄 pf33.cpp

📁 含有移相器的配电网潮流计算程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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 + -