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

📄 powerflowdlg.cpp

📁 vc编写的电力系统潮流计算程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		i=abs(Branch[n].i);
		j=abs(Branch[n].j);
	    R=Branch[n].R;
	    X=Branch[n].X;
	    YK=Branch[n].YK;
		Zmag2=R*R+X*X;
		Gij=R/Zmag2;
		Bij=X/Zmag2;
		b_ij=-1.0/X;
		if(Branch[n].i<0||Branch[n].j<0)     //若为变压器导纳需除以非标准变比
		{
			Yij[n].G=-Gij/YK;
			Yij[n].B=Bij/YK;
			Yijl[n].G=0.0;
			Yijl[n].B=-b_ij/YK;
		}
		else                         //输电线路按式(4-1)计算
		{
			Yij[n].G=-Gij;
			Yij[n].B=Bij;
			Yijl[n].G=0.0;
			Yijl[n].B=-b_ij;
		}
		Yij[n].j=j;
		Yijl[n].j=j;
		if(Branch[n].i<0||Branch[n].j<0)       //累计变压器支路的自导纳
		{
			Yii[i].G=Yii[i].G+Gij/YK;
			Yii[i].B=Yii[i].B-Bij/YK;
			Yii[j].G=Yii[j].G+Gij/YK;
			Yii[j].B=Yii[j].B-Bij/YK;
			Yiil[i].B=Yiil[i].B+b_ij/YK;
			Yiil[j].B=Yiil[j].B+b_ij/YK;
		}
		else                                   //累计输电线路有关节点的自导纳
		{
			Yii[i].G=Yii[i].G+Gij;
			Yii[i].B=Yii[i].B-Bij;
			Yii[j].G=Yii[j].G+Gij;
			Yii[j].B=Yii[j].B-Bij;
			Yiil[i].B=Yiil[i].B+b_ij;
			Yiil[j].B=Yiil[j].B+b_ij;
		}
		NYsum[i]=NYsum[i]+1;
	}
	NYseq[1]=1;
	for(i=1;i<=m_N-1;i++)
	{
		NYseq[i+1]=NYseq[i]+NYsum[i];
	}
}	

//接地支路的导纳矩阵形成函数
CPowerflowDlg::CGndy()
{
	double YK,b_ij,Gij,Bij;;
    int i,j,n;
	for(n=1;n<=m_Nb;n++)
	{
		i=Branch[n].i;
		j=Branch[n].j;
		YK=Branch[n].YK;
		if(i<0||j<0)
		{
			if(i<0)              //变压器非标准变比设在i侧,并累计相应的自导纳
			{
				i=abs(i);
				Gij=Yij[n].G;
				Bij=Yij[n].B;
				b_ij=Yijl[n].B;
				Yii[i].G=Yii[i].G+(1.0-1.0/YK)*Gij;
				Yii[i].B=Yii[i].B+(1.0-1.0/YK)*Bij;
				Yiil[i].B=Yiil[i].B+(1.0-1.0/YK)*b_ij;
				Yii[j].G=Yii[j].G+(1.0-YK)*Gij;
				Yii[j].B=Yii[j].B+(1.0-YK)*Bij;
				Yiil[j].B=Yiil[j].B+(1.0-YK)*b_ij;
			}
			else                  //设在j侧
			{
				j=abs(j);
				Gij=Yij[n].G;
				Bij=Yij[n].B;
				b_ij=Yijl[n].B;
				Yii[j].G=Yii[j].G+(1.0-1.0/YK)*Gij;
				Yii[j].B=Yii[j].B+(1.0-1.0/YK)*Bij;
				Yiil[j].B=Yiil[j].B+(1.0-1.0/YK)*b_ij;
				Yii[i].G=Yii[i].G+(1.0-YK)*Gij;
				Yii[i].B=Yii[i].B+(1.0-YK)*Bij;
				Yiil[i].B=Yiil[i].B+(1.0-YK)*b_ij;
			}
		}
		else                //对输电线路累计充电电容自导纳
		{
			Bij=YK/2;
			b_ij=YK/2;
			Yii[i].B=Yii[i].B+Bij;
			Yii[j].B=Yii[j].B+Bij;
			Yiil[i].B=Yiil[i].B+b_ij;
			Yiil[j].B=Yiil[j].B+b_ij;
		}
	}
}

//形成因子表
CPowerflowDlg::CYinzb()
{
	int n_pv=1,n_u=1,i,j;
	double Btemp;
	int i_pv=PVNode[1].i;
	for(i=1;i<=m_N-1;i++)
	{
		if((flag==2)&&(i=i_pv))          //形成第二因子表时跳过PV节点有关的行
		{
		     n_pv=n_pv+1;
			 i_pv=PVNode[n_pv].i;
			 NUsum[i]=0;
			 D[i]=0;
			 continue;
		}
		else
		{
			for(int count=i+1;count<=m_N-1;count++)
			{
				B[count]=0.0;
			}
			if(flag==1)              //形成第一因子表时需用到不接地导纳矩阵
				B[i]=Yii[i].B;
			else                     //形成第二因子表时需用到接地导纳矩阵
                B[i]=Yiil[i].B;
			for(count=NYseq[i];count<=NYseq[i+1]-1;count++)
			{
				if(flag==1)
				{
			        j=Yij[count].j;
				    B[j]=Yij[count].B;
				}
				else
				{
					j=Yijl[count].j;
				    B[j]=Yijl[count].B;
				}
			}
			if(flag==2)
			{
				for(count=1;count<=Npv;count++)     //形成第二因子表跳过与PV节点有关的列
				{
					int j=PVNode[count].i;
					B[j]=0;
				}
			}
			n_u=1;
			for(int i_above=1;i_above<=i-1;i_above++)
			{				
				for(count=1;count<=NUsum[i_above];)
				{
					if(U[n_u].j!=i)
					{
						count=count+1;
						n_u=n_u+1;
					}
					else
					{
						Btemp=U[n_u].value/D[i_above];
						while(count<=NUsum[i_above])
						{
							j=U[n_u].j;
							B[j]=B[j]-Btemp*U[n_u].value;
							count=count+1;
							n_u=n_u+1;
						}
					}
				}
			}
		}
		Btemp=1.0/B[i];         //形成因子表的第i行元素
		D[i]=Btemp;
		int count=0;
		for(int j=i+1;j<=m_N-1;j++)
		{
			if(B[j]==0)
				continue;
			else
			{
				U[n_u].value=B[j]*Btemp;
				U[n_u].j=j;
				count=count+1;
				n_u=n_u+1;
			}
			NUsum[i]=count;
		}
	}
}
			
//线性方程组的求解								
CPowerflowDlg::CXxfczj()
{
	int n_u=1,count,i,j;
//	struct U_Type U[200];
	for(i=1;i<=m_N-1;i++)           //执行前代运算
	{
		DItemp=DI[i];
		for(count=1;count<=NUsum[i];count++)
		{
			j=U[n_u].j;
			DI[j]=DI[j]-DItemp*U[n_u].value;
			n_u=n_u+1;
		}
		DI[i]=DItemp*D[i];
	}
	for(i=m_N-1;i>=1;i--)           //执行回代运算
	{
		DItemp=DI[i];
		for(count=1;count<=NUsum[i];count++)
		{
			n_u=n_u-1;
			j=U[n_u].j;
			DItemp=DItemp-DI[j]*U[n_u].value;
		}
		DI[i]=DItemp;
	}
}

//计算节点功率
CPowerflowDlg::CPQNodal()
{
	double Vi,VV,A,B,theta;
    int i,j,n;
	for(i=1;i<=m_N;i++)
	{
		NodalPower[i][flag]=0.0;
	}
	for(i=1;i<=m_N;i++)
	{
		Vi=NodalVoltage[i].V;
		if(flag==1)
			A=Yii[i].G;
		else
			A=-Yii[i].B;
		NodalPower[i][flag]+=Vi*Vi*A;          //公式(4-24)
		if(i==m_N)
			break;
		else
		{
			for(n=NYseq[i];n<=NYseq[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;                        //以下与式(4-27)对应
				theta=NodalVoltage[i].theta-NodalVoltage[j].theta;
				A=A*VV*cos(theta);
				B=B*VV*sin(theta);
				NodalPower[i][flag]=NodalPower[i][flag]+A+B;
				NodalPower[j][flag]=NodalPower[j][flag]+A-B;
			}
		}
	}
}

//送电压初值
CPowerflowDlg::CVNodal()
{
/*	struct NodalVoltage_Type NodalVoltage[100];
	struct PVNode_Type PVNode[100];*/
	for(int i=1;i<=m_N;i++)             //向PQ节点送其应维持的电压       
	{
		NodalVoltage[i].V=m_Vo;
		NodalVoltage[i].theta=0.0;
	}
	for(int n=1;n<=Npv;n++)              //向PV节点送其应维持的电压
	{
		i=PVNode[n].i;
		NodalVoltage[i].V=PVNode[n].V;
	}
}

//计算功率误差,并留最大功率误差
CPowerflowDlg::CMaxError()
{
    int i=1;
	double Vi,Wi,Wtemp;
	int n_g=1,n_l=1,n_pv=1,ErrorNode;
	int i_g=Generator[1].i,i_l=Load[1].i,i_pv=PVNode[1].i;
	MaxError=0.0;
	do//(i=1;i<=m_N;i++)
	{
		Vi=NodalVoltage[i].V;
		if(i==i_l)             //判断是否为负荷节点
		{
			if(flag==1)
				Wi=Load[n_l].P;
			else
				Wi=Load[n_l].Q;
			n_l=n_l+1;
			i_l=Load[n_l].i;
		}
		else
			Wi=0.0;
		Wtemp=Wi;
		Wi=Wi-NodalPower[i][flag];
		if(i==i_g)              //判断是否为发电机节点
		{
			NodalPower[i][flag]=Wtemp;
			GenePower[i_g][flag]=-Wi;
			if(flag==1)
				Wi=Wi+Generator[n_g].P;
			else
				Wi=Wi+Generator[n_g].Q;
			n_g=n_g+1;
			i_g=Generator[n_g].i;
		}
		if(i==m_N)          //平衡节点不参与留最大功率误差的运算
			break;
		else
		{
		    if((flag==2)&&(i==i_pv))
			{
			    n_pv=n_pv+1;
			    i_pv=PVNode[n_g].i;
			    DI[i]=0;
			}
		    else
			{
			    if(fabs(Wi)>MaxError)
				{
				    MaxError=fabs(Wi);           //获取最大功率误差
			        ErrorNode=i;
				}
			}
		    DI[i]=Wi/Vi;
		}
		i+=1;
	}
	while(1);
}

//修正电压
CPowerflowDlg::CRefVoltage()
{
//	struct NodalVoltage_Type NodalVoltage[100];
	double Dtheta,DV;
	CXxfczj();          //求解线性方程组
	for(int i=1;i<=m_N-1;i++)
	{
		if(flag==1)            //进行角度修正
		{
		    Dtheta=DI[i]/m_Vo;
		    NodalVoltage[i].theta=NodalVoltage[i].theta-Dtheta;
		}
		else                   //电压幅值修正
		{
			DV=DI[i];
			NodalVoltage[i].V=NodalVoltage[i].V-DV;
		}
	}
}

//输出节点数据
CPowerflowDlg::COutNodalData()
{
	double Vmin,V,theta,P,Q;
	double a[50],Pg[50],Qg[50];
	int VminNode=1;
	Vmin=NodalVoltage[1].V;
	int i_g=Generator[1].i;
	int n_g=1;
	for(int i=1;i<=m_N;i++)
	{
		theta=NodalVoltage[i].theta/3.14159*180;
		V=NodalVoltage[i].V;
		if(V<Vmin)
		{
			Vmin=V;
			VminNode=i;
		}
		else
			;
		if(i==i_g)
		{
			P=GenePower[i][1];
			Q=GenePower[i][2];
			n_g=n_g+1;
			i_g=Generator[n_g].i;
		}
		else
		{
			P=0.0;
			Q=0.0;
		}
		//cout i,V,theta,NodalPower[i][1],NodalPower[i][2],P,Q;
		a[i]=theta;Pg[i]=P;Qg[i]=Q;
		cout<<"i="<<i<<"\t"<<"V="<<V<<"\t"<<"a="<<theta<<"\t"<<"Pl="<<NodalPower[i][1]<<"\t"<<"Ql="<<NodalPower[i][2]<<"\t"<<"Pg="<<P<<"\t"<<"Qg="<<Q<<endl;
		m_vmin=Vmin;m_node=VminNode;
	}
	m_i1=1;m_v1=NodalVoltage[1].V;m_a1=a[1];m_i2=2;m_v2=NodalVoltage[2].V;m_a2=a[2];
	m_i3=3;m_v3=NodalVoltage[3].V;m_a3=a[3];m_i4=4;m_v4=NodalVoltage[4].V;m_a4=a[4];
	m_i5=5;m_v5=NodalVoltage[5].V;m_a5=a[5];
	m_pgo1=Pg[1];m_qgo1=Qg[1];m_pgo2=Pg[2];m_qgo2=Qg[2];m_pgo3=Pg[3];m_qgo3=Qg[3];
    m_pgo4=Pg[4];m_qgo4=Qg[4];m_pgo5=Pg[5];m_qgo5=Qg[5];
}

//支路数据输出
CPowerflowDlg::COutBranchData()
{
	PLoss=0.0,QLoss=0.0;
	double R,X,YK,Zmag2,Vi,theta,Ei,Fi,Vj,Ej,Fj,DE,DF,Ir,Ii,Pij,Qij,Pji,Qji;
    int i,j,n;
	for(n=1;n<=m_Nb;n++)
	{
		i=abs(Branch[n].i);
		j=abs(Branch[n].j);
		R=Branch[n].R;
		X=Branch[n].X;
		YK=Branch[n].YK;
		Vi=NodalVoltage[i].V;
		theta=NodalVoltage[i].theta;
		Ei=Vi*cos(theta);
		Fi=Vi*sin(theta);
		Vj=NodalVoltage[j].V;
		theta=NodalVoltage[j].theta;
		Ej=Vj*cos(theta);
		Fj=Vj*sin(theta);
		if((Branch[n].i<0)||(Branch[n].j<0))
		{
			if(Branch[n].i<0)
			{
				Ei=Ei/YK;
				Fi=Fi/YK;
			}
			else
			{
				Ej=Ej/YK;
				Fj=Fj/YK;
			}
			YK=0.0;
		}
		else
			;
		DE=Ei-Ej;
		DF=Fi-Fj;
		Zmag2=R*R+X*X;
		Ir=(DE*R+DF*X)/Zmag2;
		Ii=(DF*R-DE*X)/Zmag2;
		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/2.0;
		Qji=Qji-Vj*Vj*YK/2.0;
		PLoss=PLoss+Pij+Pji;
		QLoss=QLoss+Qij+Qji;
		//cout i,j,Pij,Qij,Pji,Qji;
		cout<<"i="<<i<<"\t"<<"j="<<j<<"\t"<<"Pij="<<Pij<<"\t"<<"Qij="<<Qij<<"\t"<<"Pji="<<Pji<<"\t"<<"Qji="<<Qji<<endl;
		m_pij=Pij;m_qij=Qij;
		m_pji=Pji;m_qji=Qji;
	}
	//cout PLoss,QLoss,Vmin,VminNode;
	m_ploss=PLoss;m_qloss=QLoss;//<<"\t"<<"Vmin="<<Vmin<<\"t"<<"VminNode="<<VminNode<<endl;
}

⌨️ 快捷键说明

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