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

📄 pq潮流程序.cpp

📁 使用C语言
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include<fstream.h>
#include<math.h>
#include <iomanip.h>
//----------------线路数据结构体--------------//
struct Line
{
	int i;//线路一端所连的节点号,节点号绝对值i<j,i按绝对值从小到大排列;
	//节点号为负表示为变压器支路,负号的节点侧为变压器的非标准变比侧;此时节点电容换为变压器变比
	int j;//线路另一端所连的节点号
	double r;//线路电阻
	double x;//线路电抗
	double b;//接地电容,若为变压器节点电容换为变压器变比//这里的b为线路导纳的一半b/2
	int hh;//标记支路号 用于还原输出
}*line;
//----------------接地线路数据结构体--------------//
struct Grand_line
{
	int i;//接地支路号
	double r;//接地支路电阻
	double b;//接地支路电容
	int hh;//标记支路号,用于还原输出
}*grand;
//----------------发电机数据结构体--------------//
struct Generator
{
	int i;//发电机节点号,最后一个发电机为平衡节点
	double P;//发电机有功功率
	double Q;//发电机无功功率
	double V;//发电机机端电压,电压为负表示PV节点
}*generator;
struct Pinghengji
{
	int i;//平衡机节点号,最后一个发电机为平衡节点
	double P;//平衡机有功功率
	double Q;//平衡机无功功率
	double V;//平衡机机端电压
}*pinghengji;
//----------------负荷数据结构体--------------//
struct Load
{
	int i;//负荷节点号
	double P;//负荷的有功功率
	double Q;//负荷的无功功率
	double V;//负荷处的电压(初始为0)
}*load;
//----------------优化结构体--------------//
struct Youhua
{int nn;//记录节点的度
int nn1;
int *jd;//记录节点号
int *w;
}*youhua;
//-------------自导纳结构体--------------//
struct Yii
{double g,b;
}*yii;
struct Yii1
{double g,b;
}*yii1;
//------------互导纳结构体----------------//
struct Yij
{double g,b;
int j;
}*yij;
struct Yij1
{double g,b;
int j;
}*yij1;
//----------------U--------------//
struct U_Type
{double value;
int j;
}*U1,*U2,*U;


//-------------------节点电压数组-----------------//
struct NodalVoltage_Type
{double V,theta;

}*NodalVoltage;

//---------定义支路数,节点数,接地支路数,发电机数,负荷数,平衡节点号,精度---//
int line_num,nod_num,grand_num,generator_num,load_num,ph;
int diedai=0;//统计迭带次数
int test;
int *sum,*seq ,*seq1,*sum1,*seq2,*sum2,*old,*neww;
double *D1,*D2,*NodalyPower,*NodalwPower,*GeneyPower,*GenewPower,*DI,*PinghengjiyPower,*PinghengjiwPower;
double MaxError=50;
int ErrorNode=0;
double E;
//ofstream fenxi("分析.txt");


//---------定义读入函数块-------------------------------//
void read()
{
	char *a;
A: cout<<"请输入测试系统的节点数:";
   cin>>test;
   switch(test)
   {
   case 5:a="D5.txt";
	   break;
   case 14:a="D14.txt";
	   break;
   case 30:a="D30.txt";
	   break;
   case 57:a="D57.txt";
	   break;
   case 118:a="D118.txt";
	   break;
   default:
	   cout<<"input error:没有找到相应节点的测试系统"<<endl;
	   goto A;
   }
   //ofstream outfile("原始数据输出.txt");
   ifstream in(a,ios::in|ios::nocreate);
   if(!in)
   {
	   cout<<"open error"<<endl;
	   
   }
   //---读入支路数,节点数,接地支路数,发电机数,负荷数,平衡节点号,精度---//
   in>>line_num>>nod_num>>grand_num>>generator_num>>load_num>>ph>>E;
  /* outfile<<"线路数为:"<<line_num<<" "<<"节点数为:"<<nod_num<<" "<<"接地线路数为:"<<grand_num<<" ";
   outfile<<"发电机数为:"<<generator_num<<" "<<"负荷数为:"<<load_num<<"平衡节点号为: "<<ph<<"精度为"<<E<<endl;*/
   
   //---输入各线路的两端节点号,电阻,电抗,电容---------//
   line=new struct Line[line_num+3];//动态开辟line_num+1个Line类型的结构体;
  int k=1;
   for(int i=1;i<=line_num;i++)//只用到1-line_num+1个
   {in>>line[i].i>>line[i].j>>line[i].r>>line[i].x>>line[i].b;
   line[i].hh=k;
   k++;
   }
   
  /* for(i=1;i<=line_num;i++)
   {outfile<<line[i].i<<" "<<line[i].j<<" "<<line[i].r<<" "<<line[i].x<<" "<<line[i].b<<"非接地支路"<<line[i].hh<<endl;
   }*/
   
   //---输入各接地线路的节点号,电阻,电容---------//
   grand=new struct Grand_line[grand_num+3];//动态开辟grand_num+1个Grand_line类型的结构体;
   k=1;
   for(i=1;i<=grand_num;i++)
   {in>>grand[i].i>>grand[i].r>>grand[i].b;
    grand[i].hh=k;
	k++;
   }
  /* for(i=1;i<=grand_num;i++)
   {outfile<<grand[i].i<<" "<<grand[i].r<<" "<<grand[i].b<<" "<<"接地支路"<<grand[i].hh<<endl;
   }*/
   //---输入发电机的节点号,有功功率,无功功率,电压---------//
   generator=new struct Generator[generator_num+3];//动态开辟generator_num+1个Generator类型的结构体;
   
   for(i=1;i<=generator_num;i++)
   {in>>generator[i].i>>generator[i].P>>generator[i].Q>>generator[i].V;
   }
  /*for(i=1;i<=generator_num;i++)
   {outfile<<generator[i].i<<" "<<generator[i].P<<" "<<generator[i].Q<<" "<<generator[i].V<<"发电机"<<endl;
   }*/
   //---输入平衡机的节点号,有功功率,无功功率,电压---------//
   pinghengji=new struct Pinghengji[2];//动态开辟2个Pinghengji类型的结构体;
   
   
   in>>pinghengji[1].i>>pinghengji[1].P>>pinghengji[1].Q>>pinghengji[1].V;
   
  // outfile<<pinghengji[1].i<<" "<<pinghengji[1].P<<" "<<pinghengji[1].Q<<" "<<pinghengji[1].V<<"平衡机"<<endl;
   
   //---输入负荷的节点号,有功功率,无功功率,电压---------//
   load=new struct Load[load_num+3];//动态开辟load_num+1个Load类型的结构体;
   
   for(i=1;i<=load_num;i++)
   {in>>load[i].i>>load[i].P>>load[i].Q>>load[i].V;
   }
   /*for(i=1;i<=load_num;i++)
   {outfile<<load[i].i<<" "<<load[i].P<<" "<<load[i].Q<<" "<<load[i].V<<"负荷"<<endl;
   }*/
}
//---优化节点编号函数块-----------------------------//
void op()
{
	old=new int[nod_num+1];//开辟一个空间存放原来的节点号 
	neww=new int[nod_num+1];//开辟一个空间存放新的的节点号
	int i,j,n,m,min,k,mm,a,flag,jj,nnn,bb,kk; 
	
	youhua=new struct Youhua[nod_num+1];
	for( i=1;i<=nod_num;i++)
	{
		
		youhua[i].jd=new int[20];
		youhua[i].w=new int[20];
		old[i]=0;
        neww[i]=0;
		
	}
	
	
	for(i=1;i<=nod_num;i++)//清零
	{	youhua[i].nn=0;
	}
	for(i=1;i<=line_num;i++)//按支路扫描,统计每个节点的度以及每个节点连接的是什么 
	{   a=0;
	
		  n=abs(line[i].i);
		  m=abs(line[i].j);
		  if(m==abs(line[i-1].j)&&n==abs(line[i-1].i))//并联支路只用计算一次度,形成初始化度表;连了些什么,每个点有多少度;
		  {a=1;}
		  if(!a)
		  {
			  
			  youhua[n].nn++;
			  youhua[m].nn++;
			  youhua[n].jd[youhua[n].nn]=m;
			  youhua[m].jd[youhua[m].nn]=n;
		  }
		  
	}
	
	k=1;
	
	cout<<"消去"<<old[k-1]<<"节点"<<endl;
	for(i=1;i<=nod_num;i++)//输出调试
	{flag=0;
	for(j=1;j<=k;j++)
		if(i==old[j])
		{flag=1;break;}
		if(!flag)
		{cout<<i<<" ";
		for(j=1;j<=youhua[i].nn;j++)
			cout<<youhua[i].jd[j]<<" ";
		cout<<"**"<<youhua[i].nn<<endl;
		}
	}
	
	
	
	while(k<=nod_num)
	{	 
		min=1000;
		
		for(i=1;i<=nod_num;i++)
		{  flag=0;
		for(j=1;j<=k-1;j++)//如果是已经编过号的则不考虑
			if(i==old[j])
			{flag=1;break;
			}
			if(!flag)
			{    if(min>youhua[i].nn)
			{min=youhua[i].nn;//记录下最小度的节点号
			old[k]=i;//新-老变换对
			neww[i]=k;//老-新变换对
			}//记录下旧的节点号,新的节点号为k
			}
		}
		
		
		//--------扫描该删去那些节点的连接---------//
		for(i=1;i<=youhua[old[k]].nn;i++)
		{ mm=youhua[old[k]].jd[i];
		for(j=1;j<=youhua[mm].nn;j++)//对*(youhua[mm].jd)进行操作
			
		{
			if(youhua[mm].jd[j]==old[k]) 
				
			{ for(jj=j;jj<=youhua[mm].nn-1;jj++)
			{ youhua[mm].jd[jj]=youhua[mm].jd[jj+1];//把后面的元素赋给前面
			} 
			youhua[mm].nn--;//度减1
			break;
			}
		}
		}
		
		//--------扫描有没有新增加的度---------//
		for(i=1;i<=youhua[old[k]].nn;i++)//扫描(youhua[old[k]].jd[i])
		{  mm=youhua[old[k]].jd[i];//2
		
		for(jj=i+1;jj<=youhua[old[k]].nn;jj++)
		{   nnn=youhua[old[k]].jd[jj];//5
		flag=0;
		for(j=1;j<=youhua[mm].nn;j++)
			if(nnn==youhua[mm].jd[j])//5 8
			{flag=1;break;}
			if(!flag)
			{   youhua[mm].nn++;//度数加1
			youhua[nnn].nn++;
			youhua[mm].jd[youhua[mm].nn]=nnn;//把新增加的度放在最后一位
			youhua[nnn].jd[youhua[nnn].nn]=mm;  
			}
			
		}
		
		
		}
		
		
		
		
		k++;
	}
	
	//-----------把平衡节点的编号放在最后一位-------//
	
	for(i=1;i<=nod_num;i++)
	{  if(old[i]==ph)
	
	{    for(j=i;j<=nod_num-1;j++)
	{old[j]=old[j+1];
	neww[old[j+1]]--;
	
	}
	old[nod_num]=ph;
	neww[ph]=nod_num;
	}
	
	}
	
	//-------------优化后的编号------------------//
	ofstream outfil("新老编号对照.txt");
	outfil<<"新老编号对照"<<endl;
	
	for(i=1;i<=nod_num;i++)
		outfil<<i<<" "<<old[i]<<endl;
	
	ofstream outfilee("老新编号对照.txt");
	outfilee<<"老新编号对照"<<endl;
	
	for(i=1;i<=nod_num;i++)
		outfilee<<i<<" "<<neww[i]<<endl;
	
	
	
	//--------改变线路的节点的编号---------------//
	for(i=1;i<=line_num;i++)
	{
		for(j=1;j<=nod_num;j++)
			
		{
			if(abs(line[i].i)==old[j])
			{
				if(line[i].i>0)
					line[i].i=j;
				else
					line[i].i=-j;
				
				break;
			}
			
			
		}
		for(j=1;j<=nod_num;j++)
			
		{
			if(abs(line[i].j)==old[j])
			{
				if(line[i].j>0)
					line[i].j=j;
				else
					line[i].j=-j;
				
				break;
			}
			
		}
		if(abs(line[i].i)>abs(line[i].j))
		{
			a=line[i].i;
			line[i].i=line[i].j;
			line[i].j=a;
		}
	}
/*	ofstream shuchuyuanshi("f0.txt");
	for(i=1;i<=line_num;i++)
	{
		shuchuyuanshi<<line[i].i<<" "<<line[i].j<<" "<<line[i].r<<" "<<line[i].x<<" "<<line[i].b<<endl; 
	}*/
//	ofstream shuchu("f2.txt");
	
	//--------改变接地线路的节点的编号---------------//
	for(i=1;i<=grand_num;i++)
	{  
		for(j=1;j<=nod_num;j++)
			
		{
			if(grand[i].i==old[j])
			{	grand[i].i=j;
			break;
			}
			
			
		}
		
	}
	for(i=1;i<=grand_num-1;i++)
	{
		for(j=i+1;j<=grand_num;j++)
		{
			if(grand[i].i>grand[j].i)
			{       grand[grand_num+1]=grand[i];  
			grand[i]=grand[j];
			grand[j]=grand[grand_num+1];
			}
			
		}
	}
	
	
	
/*	for(k=1;k<=grand_num;k++)//输出调试
	{
		shuchu<<grand[k].i<<" "<<grand[k].r<<" "<<grand[k].b<<" "<<"接地支路"<<grand[k].hh<<endl;
		
	}*/
	
	
	
	
	//--------改变发电机节点的编号---------------//
	for(i=1;i<=generator_num;i++)
	{  
		for(j=1;j<=nod_num;j++)
			
		{
			if(generator[i].i==old[j])
			{	generator[i].i=j;
			break;
			}
			
			
		}
		
	}
	
	for(i=1;i<=generator_num-1;i++)
	{
		for(j=i+1;j<=generator_num;j++)
		{
			if(generator[i].i>generator[j].i)
			{       generator[generator_num+1]=generator[i];  
			generator[i]=generator[j];
			generator[j]=generator[generator_num+1];
			}
			
		}
	}
/*	for(k=1;k<=generator_num;k++)//输出调试
	{
		shuchu<<generator[k].i<<" "<<generator[k].P<<" "<<generator[k].Q<<" "<<generator[k].V<<"发电机"<<endl;
		
	}*/
	//-----------改变平衡机节点的编号,因为只有一个平衡机所以不用重新排序-----//
	for(j=1;j<=nod_num;j++)
		
	{
		if(pinghengji[1].i==old[j])
		{	pinghengji[1].i=j;
		break;
		}
		
		
	}
//	shuchu<<pinghengji[1].i<<" "<<pinghengji[1].P<<" "<<pinghengji[1].Q<<" "<<pinghengji[1].V<<"平衡机"<<endl;
	//--------改变负荷节点的编号---------------//
	for(i=1;i<=load_num;i++)
	{  
		for(j=1;j<=nod_num;j++)
			
		{
			if(load[i].i==old[j])
			{	load[i].i=j;
			break;
			}
			
			
		}
		
	}
/*	ofstream shuchu1("f3.txt");
	for(k=1;k<=load_num;k++)//输出调试
	{
		shuchu1<<load[k].i<<" "<<load[k].P<<" "<<load[k].Q<<" "<<load[k].V<<"负荷"<<endl;
		
	}*/
	for(i=1;i<=load_num-1;i++)
	{
		for(j=i+1;j<=load_num;j++)
		{
			if(load[i].i>load[j].i)
			{       load[load_num+1]=load[i];  
			load[i]=load[j];
			load[j]=load[load_num+1];
			}
			
		}
	}
/*	for(k=1;k<=load_num;k++)//输出调试
	{
		shuchu<<load[k].i<<" "<<load[k].P<<" "<<load[k].Q<<" "<<load[k].V<<"负荷"<<endl;
		
	}*/
	
	
	
	//从小到大的排列//
	
	for( i=1;i<=nod_num;i++)//清零
	{	youhua[i].nn=0;
	youhua[i].nn1=0;
	}
	for(i=1;i<=line_num;i++)//按支路扫描,统计优化后每个节点的度以及每个节点连接的是什么 
	{   
		
		n=abs(line[i].i);
	       m=abs(line[i].j);
		   
		   
		   
		   youhua[n].nn++;
		   youhua[m].nn++;
		   if(m>n)
			   
		   {
			   youhua[n].nn1++;
			   youhua[n].jd[youhua[n].nn1]=m;
		   }
		   if(n>m)
		   {    youhua[m].nn1++;
		   youhua[m].jd[youhua[m].nn1]=n;
		   }
		   
		   
	}
	for(i=1;i<=nod_num;i++)
	{
		for(j=1;j<=youhua[i].nn1;j++)
			for(k=j;k<=youhua[i].nn1;k++)
				if(youhua[i].jd[j]>youhua[i].jd[k])
				{a=youhua[i].jd[j];
				youhua[i].jd[j]=youhua[i].jd[k];
				youhua[i].jd[k]=a;
				}
	}
	k=0;
	cout<<"支路号"<<endl;

⌨️ 快捷键说明

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