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

📄 enum_branch.cpp

📁 电力系统发输电系统基于非序贯的蒙特卡罗抽样的风险评估程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include<math.h>
#include<stdlib.h>

#include"datastruct.h"
#include"sub_flow.h"

//处理含线路故障的事件的函数
void enum_branch(struct Gendata *tempgendata,struct Busdata *tempbusdata,struct Branchdata *tempbranchdata,
					 int Busnum,int Branchnum,int Gennum,int *balanceno,int *igen)
{
	double total_load=0;//总负荷
	double total_PG=0;  //总发电机功率

//	for(int i=0;i<Busnum;i++)
//	{
//		tempbusdata[i].PG=0;//将各节点发电机出力清零
//		tempbusdata[i].maxPG=0;
//	}
	
	for(int i=0;i<Gennum;i++)
	{
		if(igen[i]==1)
			for(int j=0;j<Busnum;j++)
			{
				if(tempbusdata[j].busno==tempgendata[i].linkno)
				{
					if(tempbusdata[j].PG>tempgendata[i].maxP)
						tempbusdata[j].PG-=tempgendata[i].maxP;//重新设置各节点发电机出力
					else 
						tempbusdata[j].PG=0;
					tempbusdata[j].maxPG-=tempgendata[i].maxP;
					break;
				}
			}
	}
	/*判断系统是否解列,如果解列则形成子系统*/
	int flag,flag1,flag2;//flag记录搜索到的支路数,flag1记录搜索到的节点数,flag2循环标志符
	int *flag3,*flag4,*flag5,*flag6;
	flag3=new int[Busnum];///记录搜索到的节点标志符,搜到置1,反之置0
	flag4=new int[Busnum];///记录搜索到节点号
	flag5=new int[Branchnum];///记录搜索到的支路标志符,搜到置1,反之置0
	flag6=new int[Branchnum];////记录搜索到的支路号
	int startfind;
	for(i=0;i<Busnum;i++)
	{
		*(flag3+i)=0;
		*(flag4+i)=-1;
	}
	for(i=0;i<Branchnum;i++)
	{
		*(flag5+i)=0;
		*(flag6+i)=-1;
	}
	
	
	flag=0;
	flag1=1;
	flag2=0;
	//////////////////////////////////////////////////////////	
	while(flag2!=Busnum)
	{
		if(flag2==0)
		{
			startfind=0;//从0节点开始搜索
			*(flag3+startfind)=1;
			*(flag4+0)=startfind;
		}
		else if(flag2>0&&*(flag4+flag2)!=-1)
			startfind=*(flag4+flag2);
		
		for(i=0;i<Branchnum;i++)
		{ 
			if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].from==tempbusdata[startfind].busno)
			{
				if(*(flag5+i)==0)
				{
					*(flag5+i)=1;
					*(flag6+flag)=i;
					flag++;
				}
				for(int j=0;j<Busnum;j++)
				{
					if(tempbusdata[j].busno==tempbranchdata[i].to)
					{
						if(*(flag3+j)==0)
						{
							*(flag3+j)=1;
							*(flag4+flag1)=j;
							flag1++;
						}
						break;
					}
				}
			}
			else if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].to==tempbusdata[startfind].busno)
			{
				if(*(flag5+i)==0)
				{
					*(flag5+i)=1;
					*(flag6+flag)=i;
					flag++;
				}
				for(int j=0;j<Busnum;j++)
				{
					if(tempbusdata[j].busno==tempbranchdata[i].from)
					{
						if(*(flag3+j)==0)
						{
							*(flag3+j)=1;
							*(flag4+flag1)=j;
							flag1++;
						}
						break;
					}
				}
			}
		}
		if(*(flag4+flag2)==-1)
			flag2=Busnum-1;
		flag2++;
	}
	///////////////////////////////////////////////////////////////
	//////////第一次搜索结束//////////////////////////////////////
	//////////////////////////////////////////////////////////////
	if(flag1!=Busnum)////所找到的节点数不等于总的节点数,说明系统解列
	{//////2
		//形成子系统
		int sub_busnum1,sub_branchnum1;
		sub_busnum1=flag1;
		struct Busdata *sub_busdata1;
		struct Branchdata *sub_branchdata1;
		sub_branchnum1=flag;
		sub_busdata1=new struct Busdata[sub_busnum1];
		sub_branchdata1=new struct Branchdata[sub_branchnum1];
		//形成新的节点参数矩阵1
		int j=0;
		for(i=0;i<sub_busnum1;i++)
		{
			if(*(flag3+*(flag4+i))==1)
			{
				sub_busdata1[j]=tempbusdata[*(flag4+i)];
				j++;
			}
		}
		//形成新的支路参数矩阵1
		j=0;
		for(i=0;i<sub_branchnum1;i++)
		{
			if(tempbranchdata[*(flag6+i)].alrnum>0&&*(flag5+*(flag6+i))==1)
			{
				sub_branchdata1[j]=tempbranchdata[*(flag6+i)];
				j++;
			}
		}
		//计算子系统潮流程序,并进行过载、线路过载判断,负荷削减等操作
		sub_flow(tempbusdata,tempbranchdata,tempgendata,Busnum,Branchnum,Gennum,igen,
			  sub_busdata1,sub_branchdata1,sub_busnum1,sub_branchnum1);
		delete []sub_busdata1;
        delete []sub_branchdata1;
		sub_busdata1=NULL;
		sub_branchdata1=NULL;
		//printf("sub_system1\n");
		/////////////////////子系统1
		flag2=0;
		while(flag2<(Busnum-sub_busnum1))
		{
			if(flag2==0)
			{
				for(i=0;i<Busnum;i++)
				{
					if(*(flag3+i)==0)
					{
						startfind=i;//从还未搜索到的节点开始搜索
						break;
					}
				}
				*(flag3+startfind)=1;
				*(flag4+flag1)=startfind;
				flag1++;
			}
			else if(flag2>0&&*(flag4+flag2+sub_busnum1)!=-1)
				startfind=*(flag4+flag2+sub_busnum1);
			
			for(i=0;i<Branchnum;i++)
			{ 
				if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].from==tempbusdata[startfind].busno)
				{
					if(*(flag5+i)==0)
					{
						*(flag5+i)=1;
						*(flag6+flag)=i;
						flag++;
					}
					for(int j=0;j<Busnum;j++)
					{
						if(tempbusdata[j].busno==tempbranchdata[i].to)
						{
							if(*(flag3+j)==0)
							{
								*(flag3+j)=1;
								*(flag4+flag1)=j;
								flag1++;
							}
							break;
						}
					}
				}
				else if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].to==tempbusdata[startfind].busno)
				{
					if(*(flag5+i)==0)
					{
						*(flag5+i)=1;
						*(flag6+flag)=i;
						flag++;
					}
					for(int j=0;j<Busnum;j++)
					{
						if(tempbusdata[j].busno==tempbranchdata[i].from)
						{
							if(*(flag3+j)==0)
							{
								*(flag3+j)=1;
								*(flag4+flag1)=j;
								flag1++;
							}
							break;
						}
					}
				}
			}
			if(*(flag4+flag2+sub_busnum1)==-1)
				flag2=Busnum-sub_busnum1-1;
			flag2++;
		}
		int sub_busnum2,sub_branchnum2;
		struct Busdata *sub_busdata2;
		struct Branchdata *sub_branchdata2;
		sub_busnum2=flag1-sub_busnum1;
		sub_branchnum2=flag-sub_branchnum1;
		sub_branchdata2=new struct Branchdata[sub_branchnum2];
		sub_busdata2=new struct Busdata[sub_busnum2];
		//形成新的节点参数矩阵2
		j=0;
		for(i=sub_busnum1;i<flag1;i++)
		{
			if(*(flag3+*(flag4+i))==1)
			{
				sub_busdata2[j]=tempbusdata[*(flag4+i)];
				j++;
			}
		}
		//形成新的支路参数矩阵2
		j=0;
		for(i=sub_branchnum1;i<flag;i++)
		{
			sub_branchdata2[j]=tempbranchdata[*(flag6+i)];
			j++;
		}
		//计算子系统潮流程序,并进行过载、线路过载判断,负荷削减等操作
		sub_flow(tempbusdata,tempbranchdata,tempgendata,Busnum,Branchnum,Gennum,igen,
			  sub_busdata2,sub_branchdata2,sub_busnum2,sub_branchnum2);
		//printf("sub_system2\n");
		delete []sub_busdata2;
        delete []sub_branchdata2;
		sub_busdata2=NULL;
		sub_branchdata2=NULL;
		/////////////子系统2///////////////
		if(flag1<Busnum)//如果还未搜索完,则继续
		{//////3
			flag2=0;
			while(flag2<(Busnum-sub_busnum1-sub_busnum2))
			{
				if(flag2==0)
				{
					for(i=0;i<Busnum;i++)
					{
						if(*(flag3+i)==0)
						{
							startfind=i;
							break;
						}
					}
					*(flag3+startfind)=1;
					*(flag4+flag1)=startfind;
					flag1++;
				}
				else if(flag2>0&&*(flag4+flag2+sub_busnum1+sub_busnum2)!=-1)
					startfind=*(flag4+flag2+sub_busnum1+sub_busnum2);
				
				for(i=0;i<Branchnum;i++)
				{ 
					if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].from==tempbusdata[startfind].busno)
					{
						if(*(flag5+i)==0)
						{
							*(flag5+i)=1;
							*(flag6+flag)=i;
							flag++;
						}
						for(int j=0;j<Busnum;j++)
						{
							if(tempbusdata[j].busno==tempbranchdata[i].to)
							{
								if(*(flag3+j)==0)
								{
									*(flag3+j)=1;
									*(flag4+flag1)=j;
									flag1++;
								}
								break;
							}
						}
					}
					else if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].to==tempbusdata[startfind].busno)
					{
						if(*(flag5+i)==0)
						{
							*(flag5+i)=1;
							*(flag6+flag)=i;

⌨️ 快捷键说明

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