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

📄 pf30.cpp

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