📄 curtailment.cpp
字号:
#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 + -