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

📄 powerflow.cpp

📁 电力系统牛顿拉夫逊法的潮流程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    
  GenPower=malloc((N+1)*sizeof(struct GeneratorPower)); /*为发电机所发功率数组分配内存*/  
  fprintf(fp,"\t系统潮流计算结果:\n(1)迭代过程纪录:\n迭代次数\t    \t有功迭代\t\t无功迭代\n\t\t   ΔPmax\tP-Node\t ΔQmax\t\tQ-Node\n");
  for(k=0;1;k++)
  {
    fprintf(fp,"   %2d:\t",k);
    if(Kp==1)
    {
        NodePower(1,N,NodeVol,NodePow,Yii,Yij,NYseq);/*节点功率计算函数*/
        Iteration(1,Generator,Load,PVNode,NodeVol,NodePow,GenPower,N,DI1,&MaxError,&ErrNode);/*迭代*/
        fprintf(fp,"\t%10.7lf\t %d\t",MaxError,ErrNode);
        if(MaxError>=epsilon)
            FormulaSolution(1,U1,D1,NUsum1,DI1,N,NodeVol,V0);/*线性方程求解*/
        else
            Kp=0;
    }
    else
        fprintf(fp,"\t\t\t\t");
    if(Kq==1)
    {
        NodePower(2,N,NodeVol,NodePow,Yii,Yij,NYseq);/*节点功率计算函数*/
        Iteration(2,Generator,Load,PVNode,NodeVol,NodePow,GenPower,N,DI2,&MaxError,&ErrNode);/*迭代*/
        fprintf(fp,"%10.7lf\t %d\n",MaxError,ErrNode);
        if(MaxError>=epsilon)
            FormulaSolution(2,U2,D2,NUsum2,DI2,N,NodeVol,V0);/*线性方程求解*/
        else
            Kq=0;

    }
    else
        fprintf(fp,"\n");
    if(Kp==0&&Kq==0)
        break;
    if(k>2000)
    {
        fprintf(fp,"\n迭代次数超过2000次,系统不收敛!\n");
        fprintf(fp,"本系统为%d个节点、%d条支路系统,含有%d个补偿电容和%d个并联电抗\n",N,Nb,Nc,Nr);
        now=time(NULL);
        fprintf(fp,"\t\t处理时间: %s\n",ctime(&now));
        /*fclose(fp);
        exit(1);*/
        goto DATA;
    }

    
    printf("COMPUTING......\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
  }


  fprintf(fp,"\n总计迭代次数: %d 次!\n\n",k+1);
  fprintf(fp,"(2)潮流计算结果(节点电压):\n Node\t\tV\t\tθ\t\tP\t\tQ\n");
  NodeDataOutput(fp,NodeVol,Generator,N,GenPower,NodePow,Load,Nl);
  fprintf(fp,"\n(3)潮流计算结果(支路功率):\n    Branch\t\tP\t\tQ\t\tQc\t\tQr\n");
  BranchDataOutput(fp,Nb,Nc,Nr,Branch,Compensation,Reactance,NodeVol);
  fprintf(fp,"\n本系统为%d个节点、%d条支路系统,含有%d个补偿电容和%d个并联电抗\n",N,Nb,Nc,Nr);
  now=time(NULL);
  fprintf(fp,"\n\t\t\t处理时间: %s\n",ctime(&now));

DATA:
  fprintf(fp,"\n\n附原始数据:\n");
  fprintf(fp,"节点数=%d 个,支路数=%d 条,补偿电容=%d 个,并联电抗=%d 个,发电机=%d 个,负荷=%d 个,系统平均电压=%lf,误差=%lf\n",N,Nb,Nc,Nr,Ng,Nl,V0,epsilon);
  for(n=1;n<=Nb;n++)
  {
    if((Branch[n].i>0)&&(Branch[n].j>0))
    {
        fprintf(fp,"节点%3d和节点%3d之间的电力线参数:",Branch[n].i,Branch[n].j);
        fprintf(fp,"R+jX=%e+j%e   Y0=%e\n",Branch[n].R,Branch[n].X,Branch[n].YK);
    }
    else
    {
        fprintf(fp,"节点%3d和节点%3d之间的变压器参数:",abs(Branch[n].i),abs(Branch[n].j));
        fprintf(fp,"R+jX=%e+j%e   K=%lf,",Branch[n].R,Branch[n].X,fabs(Branch[n].YK));
    if(Branch[n].i<0)
        i=abs(Branch[n].i);
    else
        i=abs(Branch[n].j);
    fprintf(fp,"非标准变比位于节点%3d侧\n",i);
    }
  }
  for(n=1;n<=Nc;n++)
  {
    fprintf(fp,"位于节点%3d的补偿电容:",Compensation[n].i);
    fprintf(fp,"Y=j%e\n",Compensation[n].Y);
  }
  for(n=1;n<=Nr;n++)
  {
    fprintf(fp,"位于节点%3d的并联电抗:",Reactance[n].i);
    fprintf(fp,"X=j%e\n",Reactance[n].X);
  }
  for(n=1;n<=Nl;n++)
  {
    fprintf(fp,"节点%3d的负荷  :",Load[n].i);
    fprintf(fp,"P+jQ=%lf-j%lf   V=%lf \n",Load[n].P,fabs(Load[n].Q),Load[n].V);
  }
  for(n=1;n<=Ng;n++)
  {
    fprintf(fp,"节点%3d的发电机:",Generator[n].i);
    fprintf(fp,"P+jQ=%lf+j%lf   V=%lf \n",Generator[n].P,Generator[n].Q,Generator[n].V);
  }
  for(n=1;n<Npv;n++)
  {
    if(n==1)
    fprintf(fp,"PV节点有%3d个,分别为:",Npv-1);
    fprintf(fp,"节点%3d,",PVNode[n].i); 
  }

  fprintf(fp,"\n\n\n");

  fclose(fp);
  free(Branch);
  free(Compensation);
  free(Reactance);
  free(Generator);
  free(Load);
  free(PVNode);
  free(Yii);
  free(Yiil);
  free(Yij);
  free(Yijl);
  free(NYseq);
  free(U1);
  free(U2);
  free(D1);
  free(D2);
  free(NUsum1);
  free(NUsum2);
  free(DI1);
  free(DI2);
  free(NodePow);
  free(NodeVol);
  free(GenPower);
}



void Datain(int Nb,int Nl,int Nc,int Nr,int Ng,FILE *fp,struct Branch_Type *Branch,struct Compensation_Type *Compensation,struct Reactance_Type *Reactance,struct Load_Type *Load,struct Generator_Type *Generator,struct PVNode_Type *PVNode,int *Npv)
{
  int n;
  /**********下面从数据文件中读取支路、发电机、负荷的数据***********/

  for(n=1;n<=Nb;n++)
  {
    fscanf(fp,"%d,%d,%lf,%lf,%lf",&(Branch[n].i),&(Branch[n].j),&(Branch[n].R),&(Branch[n].X),&(Branch[n].YK));
  }
  for(n=1;n<=Nc;n++)
  {
    fscanf(fp,"%d,%lf",&(Compensation[n].i),&(Compensation[n].Y));
  }
  for(n=1;n<=Nr;n++)
  {
    fscanf(fp,"%d,%lf",&(Reactance[n].i),&(Reactance[n].X));
  }
  for(n=1;n<=Ng;n++)
  {
    fscanf(fp,"%d,%lf,%lf,%lf",&(Generator[n].i),&(Generator[n].P),&(Generator[n].Q),&(Generator[n].V));
    if((Generator[n].V)<0)
    {
        (*Npv)++;
        PVNode[(*Npv)].i=Generator[n].i;
        PVNode[(*Npv)].V=-(Generator[n].V);
    }
  }
  for(n=1;n<=Nl;n++)
  {
    fscanf(fp,"%d,%lf,%lf,%lf",&(Load[n].i),&(Load[n].P),&(Load[n].Q),&(Load[n].V));
    if((Load[n].V)<0)
    {
        (*Npv)++;
        PVNode[(*Npv)].i=Load[n].i;
        PVNode[(*Npv)].V=-(Load[n].V);
    }
  }



  fclose(fp);/*关闭数据输入流*/
/******************读取支路、发电机、负荷的数据完成,并关闭系统数据文件********************/



}







void AdmittanceMatrix(int N,int Nb,struct Yii_Type *Yii,struct Yii_Type *Yiil,struct Yij_Type *Yij,struct Yij_Type *Yijl,struct Branch_Type *Branch,int *NYseq1,int *NYsum1)
{
  int i,n;


  int *NYsum=malloc((N+1)*sizeof(int));
  int *NYseq=malloc((N+1)*sizeof(int));
  for(i=1;i<=N;i++)
  {
    Yii[i].G=0.0;
    Yii[i].B=0.0;
    Yiil[i].G=0.0;
    Yiil[i].B=0.0;
    NYsum[i]=0;
  }

/************下面形成不考虑接地支路时的导纳矩阵*******************/
  for(n=1;n<=Nb;n++)
  {
    int i=abs(Branch[n].i);
    int j=abs(Branch[n].j);
    double R=(Branch[n].R);
    double X=(Branch[n].X);
    double YK=(Branch[n].YK);

    double Zmag2=R*R+X*X;
    double Gij=R/Zmag2;
    double Bij=-X/Zmag2;

    double b_ij=-1.0/X;

    if((Branch[n].i<0)||(Branch[n].j<0))
    {
        Yij[n].G=-Gij/YK;
        Yij[n].B=-Bij/YK;
        Yijl[n].G=0.0;
        Yijl[n].B=-b_ij/YK;
    }
    else
    {
        Yij[n].G=-Gij;
        Yij[n].B=-Bij;
        Yijl[n].G=0.0;
        Yijl[n].B=-b_ij;

        /*这几句在最后一次执行时,执行ps.dat时NYsum[1]、[2]变为0,NYsum[3]=-21845,NYsum[4]=-21845,但是[1]、[2]、[3]均应为2,[4]应为0;在执行ps-5.dat时则没有这问题*//*现在通过在此子程序内定义新的NYsum和NYseq已经得到了解决*/

    }
    Yij[n].j=j;
    Yijl[n].j=j;

    if((Branch[n].i<0)||(Branch[n].j<0))
    {
        Yii[i].G=Yii[i].G+Gij/YK;
        Yii[i].B=Yii[i].B+Bij/YK;
        Yii[j].G=Yii[j].G+Gij/YK;
        Yii[j].B=Yii[j].B+Bij/YK;

        Yiil[i].B=Yiil[i].B+b_ij/YK;
        Yiil[j].B=Yiil[j].B+b_ij/YK;
    }
    else
    {
        Yii[i].G=Yii[i].G+Gij;
        Yii[i].B=Yii[i].B+Bij;
        Yii[j].G=Yii[j].G+Gij;
        Yii[j].B=Yii[j].B+Bij;

        Yiil[i].B=Yiil[i].B+b_ij;
        Yiil[j].B=Yiil[j].B+b_ij;
    }
    NYsum[i]+=1;

  }

  NYseq[1]=1;

/****************这里给各行的首元素定位********************/

  for(i=1;i<=N-1;i++)
  {
    NYseq[i+1]=NYseq[i]+NYsum[i];
  }

  for(n=1;n<=N;n++)
 {
  NYseq1[n]=NYseq[n];
 }




}


void AdmittanceMatrixAdd(int Nb,int Nc,int Nr,struct Yii_Type *Yii,struct Yii_Type *Yiil,struct Yij_Type *Yij,struct Yij_Type *Yijl,struct Branch_Type *Branch,struct Compensation_Type *Compensation,struct Reactance_Type *Reactance)
{
  int n;
  /*char ch;*/




/*******************下面在导纳矩阵中追加接地支路*********************/

  for(n=1;n<=Nb;n++)
  {
    int i=Branch[n].i;
    int j=Branch[n].j;
    double YK=Branch[n].YK;

    if(!(i<0||j<0))
    {
        double Bij=YK/2.0;
        double b_ij=YK/2.0;

        Yii[i].B=Yii[i].B+Bij;
        Yii[j].B=Yii[j].B+Bij;

        Yiil[i].B=Yiil[i].B+b_ij;
        Yiil[j].B=Yiil[j].B+b_ij;
    }
    else
    {
        double Gij;
        double Bij;
        double b_ij;
        if(i<0)
        {
            i=abs(i);
            Gij=Yij[n].G;
            Bij=Yij[n].B;

            b_ij=Yijl[n].B;

            Yii[i].G=Yii[i].G+(1.0-1.0/YK)*Gij;
            Yii[i].B=Yii[i].B+(1.0-1.0/YK)*Bij;
            Yiil[i].B=Yiil[i].B+(1.0-1.0/YK)*b_ij;


            Yii[j].G=Yii[j].G+(1.0-YK)*Gij;
            Yii[j].B=Yii[j].B+(1.0-YK)*Bij;
            Yiil[j].B=Yiil[j].B+(1.0-YK)*b_ij;
        }
        else
        {
            j=abs(j);
            Gij=Yij[n].G;
            Bij=Yij[n].B;

            b_ij=Yijl[n].B;

            Yii[j].G=Yii[j].G+(1.0-1.0/YK)*Gij;
            Yii[j].B=Yii[j].B+(1.0-1.0/YK)*Bij;
            Yiil[j].B=Yiil[j].B+(1.0-1.0/YK)*b_ij;


            Yii[i].G=Yii[i].G+(1.0-YK)*Gij;
            Yii[i].B=Yii[i].B+(1.0-YK)*Bij;
            Yiil[i].B=Yiil[i].B+(1.0-YK)*b_ij;
        }
    }
  }
/********************追加接地支路完成**********************/
/********************追加对地补偿电容***********************/
  for(n=1;n<=Nc;n++)
  {
    int i=Compensation[n].i;
    double Bij=Compensation[n].Y;
    double b_ij=Compensation[n].Y;

    Yii[i].B=Yii[i].B+Bij;
    
    Yiil[i].B=Yiil[i].B+b_ij;
   }
/********************追加对地并联电感***********************/
  for(n=1;n<=Nr;n++)
  {
    int i=Reactance[n].i;
    double Bij=-1/Reactance[n].X;
    double b_ij=-1/Reactance[n].X;

    Yii[i].B=Yii[i].B+Bij;
    
    Yiil[i].B=Yiil[i].B+b_ij;
    
  }



}



void Factorial(int flag,int N,int Npv,struct PVNode_Type *PVNode,int *NUsum,struct Yii_Type *Yii,struct Yij_Type *Yij,int *NYseq,double *D,struct U_Type *U)/*因子表形成函数*/
{
  int n_pv,i_pv,j,n_u,i_above;
  int i,count;
  double *B=malloc((N+1)*sizeof(double));
  double Btemp;
  
  n_pv=1;
  i_pv=PVNode[1].i;
  
  for(i=1;i<N;i++)
  {
    if((flag==2)&&(i==i_pv))
    {
        n_pv++;
        i_pv=PVNode[n_pv].i;
        NUsum[i]=0;
        D[i]=0.0;
        continue;
    }
    else
    {
        for(count=i+1;count<N;count++)
            B[count]=0.0;
        
        B[i]=Yii[i].B;
        
        for(count=NYseq[i];count<NYseq[i+1];count++)
        {
            j=Yij[count].j;
            B[j]=Yij[count].B;
        }
        
        if(flag==2)
        {
            for(count=1;count<=Npv;count++)
            {
                j=PVNode[count].i;
                B[j]=0.0;
            }
            
        }

        
        n_u=1;
        i_above=1;
        
        while(i_above<=(i-1))
        {
            count=1;
            
            while(count<=NUsum[i_above])
            {
                if(U[n_u].j==i)
                {   
                    
                    Btemp=U[n_u].value/D[i_above];

⌨️ 快捷键说明

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