ymatrix.cpp

来自「牛顿-拉夫逊法潮流计算的算法实现」· C++ 代码 · 共 241 行

CPP
241
字号
////////////////////////////////////////////////////////////////////////////////////////
///////   导纳矩阵 形成稀疏导纳阵                               //////////
//////////////////////////////////////////////////////////////////////////

#include "YMatrix.h"
#include <iostream.h>
#include <fstream.h>
#define RE 10
YMatrix::YMatrix()
{
	
}
YMatrix::~YMatrix()
{
	
}
void YMatrix::SpareYMatrix()
{
	extern SystemInfo m_SystemInfo;   ///系统信息
    extern LineInfo *m_LineInfo;       ///线路信息
	extern TransformerInfo *m_TransformerInfo;  ///变压器支路 
	extern BusInfo *m_BusInfo;        //// 节点 
	
	int nodenum=m_SystemInfo.SystemTotalBusNum;
	int linenum=m_SystemInfo.GeneralLineNum;   ////一般支路数目
	int totallinenum=m_SystemInfo.GeneralLineNum+m_SystemInfo.LandBranchNum;  ///总支路数(一般+接地)
	int transformernum=m_SystemInfo.TransformerNum;  ///变压器数
	int UYnum=m_SystemInfo.GeneralLineNum+m_SystemInfo.TransformerNum;///也就是总线路数据.上三角元素的个数
    
	////消除双回线的影响
   	int *busIno=new int[UYnum+RE];  //////记录线路编号较小端点
	int *busJno=new int[UYnum+RE];  //////记录线路编号较大端点
	int mullinenun=0;  ////多回线的数目
    for(int i=1;i<=linenum;i++)
	{
		busIno[i]=m_LineInfo[i].BusINo;
		busJno[i]=m_LineInfo[i].BusJNo;
	}
	for(i=linenum+1;i<=UYnum;i++)
	{	
		
		busIno[i]=m_TransformerInfo[i-linenum].BusINo;	
		busJno[i]=m_TransformerInfo[i-linenum].BusJNo;
	}
	for(i=1;i<=UYnum;i++)
	{
		for(int j=1;j<=UYnum;j++)
			if(i!=j&&busIno[i]==busIno[j]&&busJno[i]==busJno[j]) 
				mullinenun++;
	}	
    mullinenun=mullinenun/2;    
	m_SystemInfo.MultiLineNum=mullinenun;
	UYnum=UYnum-mullinenun;  //得到实际的上三角元素个数	
	
	UY=new CYMatrix[UYnum+RE];   ////导纳矩阵上三角元素
	DY=new CYMatrix[nodenum+RE]; ////导纳矩阵对角元
    JY=new int[UYnum+RE];        ///上三角元素的列号
	IY=new int[nodenum+1+RE];      ///上三角元素每行第一个非零元素在UY中的位置(首地址)
	for(i=1;i<=nodenum+1;i++)
		DY[i].G=DY[i].B=IY[i]=0;
	IY[1]=1;
	///////形成导纳阵
	int JYno=0;///上三角列元素的序号
    int *JY_lineno=new int[UYnum+RE];  ///记录上三角元素的行号,用来判断是否换行,剔除双回线
	
	for(int k=1;k<=nodenum;k++)
	{	
		int I,J; //两个编号中小的为I,大的为J
		for(int m=1;m<=linenum;m++)   ////普通线路对应的节点
		{
			int i=m_LineInfo[m].BusINo;
			int j=m_LineInfo[m].BusJNo;
			
			if(i<j) { I=i; J=j;}
			else    { I=j; J=i;} 
			if(k==I)
			{
			    double mul_G=0,mul_B=0;
				if(JY[JYno]==J&&JY_lineno[JYno]==I)
				{
				 mul_G=UY[JYno].G;
                 mul_B=UY[JYno].B;
				}

				if(JY[JYno]!=J||JY_lineno[JYno]!=I) JYno++;
				JY[JYno]=J;
				JY_lineno[JYno]=I;
				double r=m_LineInfo[m].R;
				double x=m_LineInfo[m].X;
				double z=r*r+x*x;       
				UY[JYno].G=-r/z;
				UY[JYno].B=x/z;
				
				DY[i].G+=-UY[JYno].G;
				DY[i].B+=-UY[JYno].B+m_LineInfo[m].Yk;
				
				DY[j].G+=-UY[JYno].G;
				DY[j].B+=-UY[JYno].B+m_LineInfo[m].Yk;
				
				if(JY[JYno]==J&&JY_lineno[JYno]==I)
				{
	              UY[JYno].G+=mul_G;
				  UY[JYno].B+=mul_B;
				}
			}		
		}
		for(m=1;m<=transformernum;m++)   ///变压器对应的节点
		{
			int i=m_TransformerInfo[m].BusINo;
			int j=m_TransformerInfo[m].BusJNo;
			if(i<j) { I=i; J=j;}
			else    { I=j; J=i;} 
			
			if(k==I)
			{       
				double mul_G=0,mul_B=0;
				if(JY[JYno]==J&&JY_lineno[JYno]==I)
				{
				 mul_G=UY[JYno].G;
                 mul_B=UY[JYno].B;
				}

				if(JY[JYno]!=J||JY_lineno[JYno]!=I) JYno++;
				JY[JYno]=J;	
				JY_lineno[JYno]=I;
				double r=m_TransformerInfo[m].R;
				double x=m_TransformerInfo[m].X;
				double z=r*r+x*x;    
				double TK=m_TransformerInfo[m].Ratio;
				//UY[JYno].G=(-r/z)/TK;
				//UY[JYno].B=(x/z)/TK;		

				UY[JYno].G=(-r/z)/TK;
				UY[JYno].B=(x/z)/TK;


				DY[i].G+=-UY[JYno].G+((TK-1)/TK)*(r/z);
				DY[i].B+=-UY[JYno].B+((TK-1)/TK)*(-x/z);
				
				DY[j].G+=-UY[JYno].G+(1-TK)/(TK*TK)*(r/z);
				DY[j].B+=-UY[JYno].B+(1-TK)/(TK*TK)*(-x/z);
				if(JY[JYno]==J&&JY_lineno[JYno]==I)
				{
	              UY[JYno].G+=mul_G;
				  UY[JYno].B+=mul_B;
				}
			}		
		}
        IY[k+1]=1+JYno;

//			cout<<k<<" "<<IY[k]<<"  " <<JY[JYno]<<endl;	
    }
//	for(k=1;k<=nodenum;k++)
//	{
//		for(int i=IY[k];i<IY[k+1];i++)
//		{
//			int j=JY[i];
//			cout<<k<<" "<<j<<" "<<i<<endl;
//		}
//		cout<<endl;
//	}
	////补充接地支路
	for(k=linenum+1;k<=totallinenum;k++)
	{
		int i=m_LineInfo[k].BusINo;
		int j=m_LineInfo[k].BusJNo;
		DY[i].G+=m_LineInfo[k].R;
		DY[j].B+=m_LineInfo[k].X;
	}
//for(k=1;k<=nodenum;k++)
// cout<<k<<"  "<<DY[k].G<<"+"<<DY[k].B<<"j"<<endl;
	//////////////////对非对角元每行按照行号从小到大排序
	for(k=1;k<=nodenum;k++)
	{
		for(int j=IY[k];j<IY[k+1];j++)
		{
			for(i=IY[k];i<IY[k+1]-1;i++)
			{
				if(JY[i]>JY[i+1])
				{
					int temp1=JY[i];
					JY[i]=JY[i+1];
					JY[i+1]=temp1;
					double temp2=UY[i].G;
					UY[i].G=UY[i+1].G;
					UY[i+1].G=temp2;
					temp2=UY[i].B;
					UY[i].B=UY[i+1].B;
					UY[i+1].B=temp2;
				}
			}
			
		}
	}
//     for(k=1;k<=nodenum;k++)
//	{
//		for(i=IY[k];i<IY[k+1];i++)
//			cout<<k<<JY[i]<<" "<<UY[i].G<<"+"<<UY[i].B<<"j"<<"      ";
//		cout<<endl;
 //  	}
	ofstream dataout;
	if(nodenum==5)
	{
		dataout.open("输出文件//5节点//导纳矩阵.txt");
	}
	else if(nodenum==14)
	{
	dataout.open("输出文件//14节点//导纳矩阵.txt");
	}
	else if(nodenum==30)
	{
	dataout.open("输出文件//30节点//导纳矩阵.txt");
	}
    else if(nodenum==57)
	{
	dataout.open("输出文件//57节点//导纳矩阵.txt");
	}
	else if(nodenum==118)
	{
	dataout.open("输出文件//118节点//导纳矩阵.txt");
	}

    dataout<<"导纳矩阵对角元:"<<endl;
for(k=1;k<=nodenum;k++)
{
	dataout<<k<<"  "<<DY[k].G<<"+"<<DY[k].B<<"j"<<endl;
}	
dataout<<endl;
dataout<<"导纳矩阵非对角元:"<<endl;
     for(k=1;k<=nodenum;k++)
 	{
 		for(i=IY[k];i<IY[k+1];i++)
 			dataout<<k<<JY[i]<<" "<<UY[i].G<<"+"<<UY[i].B<<"j"<<"      ";
 		dataout<<endl;
   	}
	dataout<<"所对应的节点是进行编号之后的节点";
	dataout.close();
	delete [] busIno;
	delete [] busJno;
	delete [] JY_lineno;
}

⌨️ 快捷键说明

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