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

📄 pq潮流程序.cpp

📁 使用C语言
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			{
				outf<<"第"<<i<<"行";
				outf<<"第"<<U2[n].j<<"列"<<" "<<U2[n].value<<endl;
				n++;
			}  
		}
	}	
	
	 for(n=1;n<=14;n++)
	cout<<"D2["<<n<<"]="<<D2[n]<<endl;
	for(n=1;n<=25;n++)
	cout<<"U2["<<n<<"]="<<U2[n].value<<endl;
}
//----------------三角分解函数块--------------------//
void sanjiao(U_Type *U,int *sum3,double *D)
{
	
	int i,n_u,j,count;
	double DItemp;

	n_u=1;
	for(i=1;i<=nod_num-1;i++)
	{
		DItemp=DI[i];
		for(count=1;count<=sum3[i];count++)
		{  
			j=U[n_u].j;
		
			DI[j]=DI[j]-DItemp*U[n_u].value;
            //cout<<"用第"<<i<<"行消去第"<<j<<"行:DI["<<j<<"]="<<"DI["<<j<<"]-DItemp*U["<<n_u<<"].value="
				//<<a<<"-"<<DItemp<<"*"<<U[n_u].value<<"="<<DI[j]<<endl;
			n_u++;
		}
		DI[i]=DItemp*D[i];
		//cout<<"i="<<i<<" "<<"DI["<<i<<"]"<<DI[i]<<endl;
	}
	for(i=nod_num-1;i>=1;i--)
	{
		DItemp=DI[i];
		for(count=1;count<=sum3[i];count++)
		{
			n_u--;
			j=U[n_u].j;
			DItemp=DItemp-DI[j]*U[n_u].value;
		}
		DI[i]=DItemp;
	
		
	}
	
//	cout<<"*********"<<endl;
	
}

//----------------计算节点功率框图--------------//
void jiediangonglv(int flag)
{
	int i,j,n;
	double Vi,A,B,VV,theta;
	if(flag==1)
		for(i=1;i<=nod_num;i++)
		{
			
			NodalyPower[i]=0.0;
			
		}
		else
			for(i=1;i<=nod_num;i++)
			{
				NodalwPower[i]=0.0;
			}
			
			for(i=1;i<=nod_num;i++)
			{
				Vi=NodalVoltage[i].V;
				if(flag==1)
				{
					A=yii[i].g;
					NodalyPower[i]+=Vi*Vi*A;
				}
				else
				{
					A=-yii[i].b;
					NodalwPower[i]+=Vi*Vi*A;
				}
				
				
				
				if(i==nod_num)//最后一个节点为平衡节点跳出,不执行以下语句
					break;
				
				for(n=seq[i];n<=seq[i+1]-1;n++)
				{
					if(flag==1)
					{
						A=yij[n].g;
						B=yij[n].b;
					}
					else
					{
						A=-yij[n].b;
						B=yij[n].g;
					}
					
					j=yij[n].j;
					VV=Vi*NodalVoltage[j].V;
					theta=NodalVoltage[i].theta-NodalVoltage[j].theta;
					A=A*VV*cos(theta);
					B=B*VV*sin(theta);
					if(flag==1)
					{
						NodalyPower[i]=NodalyPower[i]+A+B;
						NodalyPower[j]=NodalyPower[j]+A-B;
					}
					else
					{
						NodalwPower[i]=NodalwPower[i]+A+B;
						NodalwPower[j]=NodalwPower[j]+A-B;
					}
				}
				
				
			}
		/*if(flag==2)
			{
			for(i=1;i<nod_num;i++)
			{
					cout<<"NodalwPower["<<i<<"]="<<NodalwPower[i]<<endl;
			}
			}
		*/
			
}
//--------------求最大功率误差的函数块-------------//
void zuidagonglvwucha(int flag)
{
	int i,n_g,n_l,n_pv,i_g,i_l,i_pv;
	double Wi,Wtemp,Vi;
	
	MaxError=0.0;
	i=1;
	n_g=1;
	n_l=1;
	n_pv=1;
	i_g=generator[1].i;
	i_l=load[1].i;
	i_pv=generator[1].i;
	for(i=1;i<=nod_num;i++)
	{
		Vi=NodalVoltage[i].V;//取i节点的电压
		if(i==i_l)//如果是负荷支路
		{
			if(flag==1)
			{Wi=load[n_l].P;}
			else
			{Wi=load[n_l].Q;}
			n_l++;
			i_l=load[n_l].i; 
		}
		else
			Wi=0.0;
		
		Wtemp=Wi;
		if(flag==1)
			Wi=Wi-NodalyPower[i];
		else
			Wi=Wi-NodalwPower[i];
		if(i==i_g)//如果是发电机支路
		{
			if(flag==1)
			{
				NodalyPower[i]=Wtemp;
				GeneyPower[i_g]=-Wi;
			}
			else
			{
				NodalwPower[i]=Wtemp;
				GenewPower[i_g]=-Wi;
			}
			if(flag==1)
				Wi=Wi+generator[n_g].P;
			else
				Wi=Wi+generator[n_g].Q;
			n_g++;
			i_g=generator[n_g].i;
			
		}
		if(i==pinghengji[1].i)//如果是平衡机
		{
			if(flag==1)
			{
				NodalyPower[i]=Wtemp;
				PinghengjiyPower[i]=-Wi;
			}
			else
			{   NodalwPower[i]=Wtemp;
			PinghengjiwPower[i]=-Wi;
			}
			if(flag==1)
				Wi=Wi+pinghengji[1].P;
			else
				Wi=Wi+pinghengji[1].Q;
			
		}
		
		
		if(i==nod_num)//平衡节点参与前半部分的运算,主要是为了求出该节点实际发出的功率,以备打印输出
			break;//平衡节点不参与留最大功率误差的运算,以避免对收敛性作出错误的判断
		if(flag==2&&i==i_pv)
		{
			n_pv++;
			i_pv=generator[n_pv].i;
			DI[i]=0;
		}
		else
		{
			if(fabs(Wi)>MaxError)
			{
				MaxError=fabs(Wi);
				ErrorNode=i;
			}
			DI[i]=Wi/Vi;
		}
		/*if(flag==2)
		cout<<"DI["<<i<<"]="<<DI[i]<<endl;*/
	}
	
	
	cout<<"MaxError="<<MaxError<<endl;
	
}

//------------修正电压程序函数块----------------//
void xiuzheng(int flag)
{   
	int i;
	double Dtheta,DV;
	if(flag==1)//用第一因子表求解
	{
		sanjiao(U1,sum1,D1);
	}
    else
		sanjiao(U2,sum2,D2);//用第二因子表求解
	for(i=1;i<=nod_num-1;i++)
	{
		if(flag==1)
		{
			Dtheta=DI[i]/NodalVoltage[i].V;
			NodalVoltage[i].theta=NodalVoltage[i].theta-Dtheta;
		}
		else
		{
			DV=DI[i];
			NodalVoltage[i].V=NodalVoltage[i].V-DV;
			
			
				//fenxi<<i<<"节点"<<NodalVoltage[i].V<<endl;//??????????///
		}
	}
	//fenxi<<endl;
	
}
//-------------------迭带函数块------------------//
void Diedai()
{    
	int i,n;
	
	NodalVoltage=new NodalVoltage_Type[nod_num+1];//节点无功
	NodalyPower=new double[nod_num+1];//节点有功
	NodalwPower=new double[nod_num+1];//节点电压和相角
	DI=new double[nod_num];
	GeneyPower=new double[nod_num+1];
	GenewPower=new double[nod_num+1];
	PinghengjiyPower=new double[nod_num+1];
	PinghengjiwPower=new double[nod_num+1];
	
	
	for(i=1;i<=nod_num;i++)
	{ 
		NodalVoltage[i].V=1.0; 
		NodalVoltage[i].theta=0.0;
	}
	
	for(n=1;n<=generator_num;n++)
	{
		i=generator[n].i;
		NodalVoltage[i].V=fabs(generator[n].V);
	}
	i=pinghengji[1].i;
	NodalVoltage[i].V=pinghengji[1].V; //赋平衡机节点的电压
	cout<<"i="<<i<<" "<<"NodalVoltage[i].V"<<NodalVoltage[i].V<<" "<<"pinghengji[1].V"<<pinghengji[1].V<<endl;
	int flag1=0;
	int flag2=0;
	//送初值完毕  
	cout<<"第1次迭带"<<endl;
	while(1)
	{
		jiediangonglv(1);//计算有功功率
		zuidagonglvwucha(1);//求有功误差及最大有功功率误差
		if(MaxError<E)
			flag1=1;
		xiuzheng(1);//修正相角
		jiediangonglv(2);//计算无功功率
		zuidagonglvwucha(2);//求无功误差
		if(MaxError<E)
			flag2=1;
		if(flag1==1&&flag2==1)
			break;
		xiuzheng(2);//修正电压幅值
		
		diedai++;
		cout<<"第"<<diedai+1<<"次迭带"<<endl;
	
	}
	
}
void dayin()
{  
	ofstream shuchuuu("节点数据输出.txt");
	shuchuuu<<setprecision(5)<<setiosflags(ios::right)<<setiosflags(ios::fixed);
	shuchuuu<<"**************************潮流计算程序(西安交通大学电气工程学院胡与非编写)***************************"<<endl;
	shuchuuu<<"运行方式名:IEEE_"<<nod_num<<"_Bus_Test_System"<<endl;
	shuchuuu<<"系统基本特性:"<<endl;
	shuchuuu<<setw(15)<<"基准容量:100(MVA)"<<setw(15)<<"容许适配额:"<<E<<endl;
	shuchuuu<<setw(15)<<"母线数:"<<nod_num<<endl;
	shuchuuu<<setw(15)<<"发电机数:"<<generator_num+1<<endl;
	shuchuuu<<setw(15)<<"负荷数:"<<load_num<<endl;
	shuchuuu<<setw(15)<<"线路数:"<<line_num<<endl;
	shuchuuu<<setw(15)<<"计算方法:PQ分解法"<<endl;
	shuchuuu<<setw(15)<<"迭代次数:"<<diedai+1<<endl;
	shuchuuu<<setw(15)<<"最大误差发生在第"<<ErrorNode<<"节点,误差为"<<MaxError<<endl;
	shuchuuu<<endl;
	shuchuuu<<endl;	
	shuchuuu<<"---------------------------------------潮流计算结果--------------------------------------------------"<<endl;
	shuchuuu<<endl;
	shuchuuu<<"***************************************节点电压及功率(标幺值)**************************************"<<endl;
	shuchuuu<<"-----------------------------------------------------------------------------------------------------"<<endl;
	shuchuuu<<setw(5)<<"节点名"<<setw(10)<<"电压"<<setw(15)<<"相角(度)"<<setw(15)<<"发电机有功"<<setw(15)<<"发电机无功"<<setw(15)<<"负荷有功"<<setw(15)<<"负荷无功"<<endl;
	shuchuuu<<"-----------------------------------------------------------------------------------------------------"<<endl;
	double P,Q,V,Vmin,theta1,PLoss,QLoss,x,r,YK,Vi,Vj,theta,Ei,Ej,Fi,Fj,z,Pij,Pji,Qij,Qji,DE,DF,Ir,Ii;
	int VminNode,i,n,I,J;
	P=0.0;
	Q=0.0;
	Vmin=NodalVoltage[1].V;

	VminNode=1;

	for(i=1;i<=nod_num;i++)
	{
		theta=NodalVoltage[i].theta/3.14159*180;//换算成度
		V=NodalVoltage[i].V;
		if(V<Vmin)
		{
			Vmin=V;
			VminNode=i;
		}

	}
	int flag,j;
	int k=1;
	while(k<=nod_num)
	{
		flag=0;
		for(i=1;i<=nod_num;i++)
		{
			if(old[i]==k)
			{ 
				for(j=1;j<=generator_num;j++)
				{
					if(i==generator[j].i)//找到了发电机
					{
						flag=1;
			        	break;
					}
				}

				if(flag==1)
				{
					P=GeneyPower[i];
					Q=GenewPower[i];
				}
				
			  else
			  {
				if(i==pinghengji[1].i)
				{
					P=PinghengjiyPower[i];
					Q=PinghengjiwPower[i];
				}
				else	
				{
					P=0.0;
					Q=0.0;
				}
				
			  }		
				
				shuchuuu<<setw(5)<<old[i]<<setw(10)<<NodalVoltage[i].V<<setw(15)<<NodalVoltage[i].theta/3.14159*180<<setw(15)<<P<<setw(15)<<Q<<setw(15)<<setw(15)<<-NodalyPower[i]<<setw(15)<<-NodalwPower[i]<<setw(15)<<endl;
			}
		}
		k++;
	}
	//cout<<GeneyPower[3]<<endl<<generator[3].P;
	//-----------以下打印支路数据---------------//
     ofstream zhilu("支路数据输出.txt");
	 zhilu<<setprecision(5)<<setiosflags(ios::right)<<setiosflags(ios::fixed);
     zhilu<<"-----------------------------------------------------------------------------------------------------"<<endl;
   	zhilu<<"***************************************支路功率及损耗(标幺值)**************************************"<<endl;
	zhilu<<"-----------------------------------------------------------------------------------------------------"<<endl;
	zhilu<<setw(5)<<"节点i"<<setw(10)<<"节点j"<<setw(15)<<"Pij"<<setw(15)<<"Qij"<<setw(15)<<"Pji"<<setw(15)<<"Qji"<<endl;
    
	PLoss=0.0;
	QLoss=0.0;
	k=1;
	while(k<=line_num)
	{
		flag=0;
		for(n=1;n<=line_num;n++)
		{
			if(line[n].hh==k)
			{
				flag=1;
				break;
			}
		}
		if(flag==1)
		{
			I=abs(line[n].i);
			J=abs(line[n].j);
			r=line[n].r;
			x=line[n].x;
			YK=line[n].b;
			Vi=NodalVoltage[I].V;
			theta1=NodalVoltage[I].theta;
			Ei=Vi*cos(theta1);
			Fi=Vi*sin(theta1);
			
			Vj=NodalVoltage[J].V;
			theta1=NodalVoltage[J].theta;
			Ej=Vj*cos(theta1);
			Fj=Vj*sin(theta1);
			if(line[n].i<0||line[n].j<0)
			{
				if(line[n].i<0)
				{
					Ei=Ei/YK;
					Fi=Fi/YK;
				}
				else
				{
					Ej=Ej/YK;
					Fj=Fj/YK;
				}
				YK=0.0;
			}
			
			DE=Ei-Ej;
			DF=Fi-Fj;
			z=r*r+x*x;
			Ir=(DE*r+DF*x)/z;
			Ii=(DF*r-DE*x)/z;
			
			Pij=Ir*Ei+Ii*Fi;
			Qij=Ir*Fi-Ii*Ei;
			Pji=-Ir*Ej-Ii*Fj;
			Qji=-Ir*Fj+Ii*Ej;
			
			Qij=Qij-Vi*Vi*YK;
			Qji=Qji-Vj*Vj*YK;
			
			PLoss=PLoss+Pij+Pji;
			QLoss=QLoss+Qij+Qji;
			if(old[I]<old[J])
			zhilu<<setw(5)<<old[I]<<setw(10)<<old[J]<<setw(15)<<Pij<<setw(15)<<Qij<<setw(15)<<Pji<<setw(15)<<Qji<<endl;
	        if(old[I]>old[J])
			zhilu<<setw(5)<<old[J]<<setw(10)<<old[I]<<setw(15)<<Pji<<setw(15)<<Qji<<setw(15)<<Pij<<setw(15)<<Qij<<endl;

		}	
		k++;	
	}
	double Qii,Pii;
	k=1;
	while(k<=grand_num)
	{
		flag=0;
		for(n=1;n<=grand_num;n++)//计算接地支路的无功功率
		{  
			if(grand[n].hh==k)
			{flag=1;
			break;
			}
		}
		if(flag==1)
		{
			i=grand[n].i;
			Vi=NodalVoltage[i].V;
			YK=grand[n].b;
			Qii=Vi*Vi*YK;
			Pii=0;
			zhilu<<setw(5)<<old[i]<<setw(10)<<old[i]<<setw(15)<<Pii<<setw(15)<<Qii<<setw(15)<<Pii<<setw(15)<<Qii<<endl;
		QLoss=QLoss-Qii;
		}

		k++;
	}
	
	zhilu<<"最大网损为:PLOSS="<<PLoss<<"  QLOSS="<<QLoss<<endl;
	zhilu<<"系统最低电压出现在"<<old[VminNode]<<"节点最低电压为"<<Vmin<<endl;
	
}

void main()
{
	read();
	op();
	daona();
	Diedai();
	dayin();
	
	delete []line;
	delete []generator;
	delete []grand;
	delete []load;
	delete []youhua;
	delete []seq;
	delete []sum;
	delete []yii;
	delete []D1;
	delete []D2;
	delete []U1;
	delete []U2;
	delete []NodalyPower;
    delete []NodalwPower;
	delete []NodalVoltage;
	delete []GeneyPower;
	delete []GenewPower;
	delete []DI;
    delete PinghengjiyPower;
    delete PinghengjiwPower;
	
	
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -