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

📄 curtailment.cpp

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



#include"datastruct.h"
#include"powerflow.h"
#include"matrix.h"


//削负荷函数,按启发式就近原则削负荷
void curtailment(struct Busdata *subbusdata,struct Branchdata *subbranchdata,struct Gendata *tempgendata,
				 int sub_Busnum,int sub_Branchnum,int Gennum,int *igen,//原系统数据
				 struct Busdata *tempbusdata,struct Branchdata *tempbranchdata,//子系统数据
				 int Busnum,int Branchnum,int *balanceno)

{
	double total_PG=0;
    double total_PL=0;
	double maxtotal_PG=0;
    
	double *B;
	double *X;
	double *PSP;    //节点净注入功率
	double *Angle;  //节点电压相角向量
	double *branchP; //线路有功
	int *over;

	double temp,temp1;//temp2;
	int overflowno;//记录过载的线路数
	int *overflowline;//记录过载的线路名称

	B=new double[(Busnum-1)*(Busnum-1)];
	X=new double[(Busnum-1)*(Busnum-1)];
	PSP=new double[Busnum-1];
	Angle=new double[Busnum];
	branchP=new double[Branchnum];
	overflowline=new int[Branchnum];
	over=new int[1];

	if(Busnum==1&&tempbusdata[0].PG<tempbusdata[0].PL)//处理单节点系统
		tempbusdata[0].PL=tempbusdata[0].PG;
	else if(Busnum>1)//多节点系统
	{
		int flag,flag1,flag2;//flag记录搜索到的支路数,flag1记录搜索到的节点数,flag2循环标志符
		int *flag3,*flag4,*flag5,*flag6,*flag7;
		flag3=new int[Busnum];///记录搜索到的节点标志符,搜到置1,反之置0
		flag4=new int[Busnum];///记录搜索到节点号
		flag5=new int[Branchnum];///记录搜索到的支路标志符,搜到置1,反之置0
		flag6=new int[Branchnum];////记录搜索到的支路号
		flag7=new int[Busnum];//记录负荷削减域
		int startfind;
		
		total_PL=0;
		total_PG=0;
		maxtotal_PG=0;
		for(int i=0;i<Busnum;i++)
		{
			total_PL+=tempbusdata[i].PL;
			
			total_PG+=tempbusdata[i].PG;
			maxtotal_PG+=tempbusdata[i].maxPG;
		}
		

	
		if(total_PL-maxtotal_PG>0&&total_PL>0)//过负荷
		{
			///////////////////////确定负荷削减域//////////////////////////
			for(int i=0;i<Busnum;i++)
			{
				*(flag3+i)=0;
				*(flag4+i)=-1;
				*(flag7+i)=-1;
			}
			for(i=0;i<Branchnum;i++)
			{
				*(flag5+i)=0;
				*(flag6+i)=-1;
			}
			/////////////////////先找出故障节点集//////////////////////
			flag2=0;
			////找出发电机故障节点集
			for(i=0;i<Gennum;i++)
			{
				for(int j=0;j<Busnum;j++)
					if(igen[i]==1&&tempbusdata[j].busno==tempgendata[i].linkno)
					{
						if(*(flag7+j)==-1)
						{
							*(flag3+j)=1;
							*(flag4+flag2)=j;
							*(flag7+j)=0;////故障节点
							flag2++;
						}
						break;
					}
			}
			////找出原系统支路受端故障节点集
			for(i=0;i<sub_Branchnum;i++)
			{
				if(subbranchdata[i].alrnum<1)
				{
					for(int j=0;j<Busnum;j++)
					{
						if(tempbusdata[j].busno==subbranchdata[i].from&&subbranchdata[i].branchP<0)
						{
							if(*(flag7+j)==-1)
							{
								*(flag3+j)=1;
								*(flag4+flag2)=j;
								*(flag7+j)=0;////故障节点
								flag2++;
							}
					        break;		
						}
						else if(tempbusdata[j].busno==subbranchdata[i].to&&subbranchdata[i].branchP>0)
						{
							if(*(flag7+j)==-1)
							{
								*(flag3+j)=1;
								*(flag4+flag2)=j;
								*(flag7+j)=0;////故障节点
								flag2++;
							}
							break;
						}
					}
				}
			}
			//intPrintfVector(flag7,1,Busnum);
			//intPrintfVector(flag4,1,Busnum);
			///////////////////////确定削减域/////////////////////////
			flag=0;
			flag1=flag2;
			flag2=0;
			while(flag2!=Busnum)
			{
				//printf("nihao%d\n",flag1);
				startfind=*(flag4+flag2);
				if(startfind!=-1)
					*(flag3+startfind)=1;
				
				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;
									*(flag7+j)=*(flag7+startfind)+1;
									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;
									*(flag7+j)=*(flag7+startfind)+1;
									*(flag4+flag1)=j;
									flag1++;
								}
								break;
							}
						}
					}
				}
				if(*(flag4+flag2)==-1)
					flag2=Busnum-1;
				flag2++;
			}

			temp=0;
			int j=0;
			while(temp<total_PL-maxtotal_PG&&j<Busnum)
			{
				for(i=0;i<Busnum;i++)
				{
					if(*(flag7+i)==j)
						temp+=tempbusdata[i].PL;
				}
				j++;
			}
			////////按比例削负荷削减域内的负荷
			if(temp>total_PL-maxtotal_PG)
			{
				for(i=0;i<Busnum;i++)
				{
					tempbusdata[i].PG=tempbusdata[i].maxPG;//发电机以最大方式运行
					if(*(flag7+i)<j&&*(flag7+i)>-1)
						tempbusdata[i].PL=tempbusdata[i].PL*(1-(total_PL-maxtotal_PG)/temp);
				}
			}
			else if(temp<=total_PL-maxtotal_PG)//无故障节点集但是系统过负荷,则每个节点按比例削负荷
			{
				for(i=0;i<Busnum;i++)
				{
					tempbusdata[i].PG=tempbusdata[i].maxPG;//发电机以最大方式运行
					tempbusdata[i].PL=tempbusdata[i].PL*(1-(total_PL-maxtotal_PG)/total_PL);
				}
			}
		}

	*over=0;
	int Maxcounter=10;
	int count=0;
	while(*over==0&&count<Maxcounter)
	{/////////////////////////////////////////////////////////////////
		total_PL=0;
		total_PG=0;
		maxtotal_PG=0;
		
		for(int i=0;i<Busnum;i++)
		{
			total_PL+=tempbusdata[i].PL;
			//printf("%lf\t",tempbusdata[i].PL);
			total_PG+=tempbusdata[i].PG;
			maxtotal_PG+=tempbusdata[i].maxPG;
		}
		if(total_PL-maxtotal_PG<0&&total_PG-tempbusdata[*balanceno].PG+tempbusdata[*balanceno].maxPG<total_PL)//按比例增发电机出力
		{
			for(i=0;i<Busnum;i++)
			{
				if(i!=*balanceno)
					tempbusdata[i].PG=tempbusdata[i].PG*
					(1+((total_PL-(total_PG-tempbusdata[*balanceno].PG+tempbusdata[*balanceno].maxPG))
					/(total_PG-tempbusdata[*balanceno].PG)));
				else 
					tempbusdata[i].PG=tempbusdata[i].maxPG;
			}
		}
		else if(total_PL-maxtotal_PG<0&&total_PG-tempbusdata[*balanceno].PG+tempbusdata[*balanceno].maxPG>total_PL)
		{
			if(total_PG-tempbusdata[*balanceno].PG>total_PL)////按比例减小除平衡节点外的发电机出力
			{
				for(i=0;i<Busnum;i++)
				{
					if(i!=*balanceno)
						tempbusdata[i].PG=tempbusdata[i].PG*
						(1-((total_PG-tempbusdata[*balanceno].PG-total_PL)/(total_PG-tempbusdata[*balanceno].PG)));
				}
			}
		}
		/////////////////潮流计算///////////////////
		*over=1;
		formB(B,tempbranchdata,tempbusdata,Busnum,Branchnum,balanceno);
		matrixinv(X,B,Busnum-1);
		formPSP(PSP,tempbusdata,Busnum,balanceno);
		formAngle(Busnum-1,Busnum-1,Busnum-1,1,X,PSP,Angle,Busnum,tempbusdata,balanceno);
		formBranchP(branchP,Angle,tempbranchdata,tempbusdata,Busnum,Branchnum);
		
		//判断是否过载,并记下所有过载的线路
		overflowno=0;
		for(int h=0;h<Branchnum;h++)
		{
//			printf("%lf\t",tempbranchdata[h].branchP);
			if((fabs(tempbranchdata[h].branchP)>(tempbranchdata[h].capacity+0.0000001))/////////////////////////////////
				&&tempbranchdata[h].alrnum>0)//*over=1不过载,为0过载
			{
				*over=0;
				//printf("线路%d过载,潮流:%5.4f\n",branchdata[h].branchno,branchdata[h].branchP);
				*(overflowline+overflowno)=h;
				overflowno++;
			}
		}
//		printf("\n");
//		getchar();
		if(*over==0)//有线路过载
		{
			for(i=0;i<overflowno;i++)
				tempbranchdata[*(overflowline+i)].alrnum=0;
			/*判断系统是否解列*/
			for(int 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=*balanceno;//从平衡节点开始搜索
					*(flag3+startfind)=1;
					*(flag4+flag2)=startfind;
				}
				else if(*(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)//解列,判断是否有瓶颈线路集
			{
				int overflowno11=0;
				int *cut;
				cut=new int[Branchnum];
				for(int kk=0;kk<overflowno;kk++)
				{
					tempbranchdata[*(overflowline+kk)].alrnum=1;
					/////////////增加一条支路,判断系统是否解列
					for(int 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=*balanceno;//从平衡节点开始搜索
							*(flag3+startfind)=1;
							*(flag4+flag2)=startfind;
						}
						else if(*(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;
									}
								}
							}
						}

⌨️ 快捷键说明

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