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

📄 pq.cpp

📁 PQ分解法潮流计算程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
         b=p->c;  
		 jy[count]=max(ii,jj);
         uyr[count]=-r;  
		 uyi[count]=-x;
         dyr[ii]+=r; 
		 dyi[ii]+=x+b;
         dyr[jj]+=r;  
		 dyi[jj]+=x+b;
         count++;
      }
      end=tran+num_tran;
      for(p=tran+1;p<=end;p++)
      {
	    ii=p->i;  
		jj=p->j;
        if(min(ii,jj)!=i) continue;
         r=p->a;  
		 x=p->b;  
		 b=r*r+x*x;
	     r/=b;   
		 x/=-b;  
		 b=p->c;
         dyr[ii]+=r;  
		 dyi[ii]+=x;
         jy[count]=max(ii,jj);
	      r/=b; 
		  x/=b;
         uyr[count]=-r;  
		 uyi[count]=-x;
         dyr[jj]+=r/b;   
		 dyi[jj]+=x/b;
         count++;
      }
   }
}

//     PQ 潮流    
void fdlf(int num_node,int num_line,int num_tran,int num_gene,int num_load,
     struct data *line,struct data *tran,struct data *gene,struct data *load,
     double **property,int *iy,int *jy,double *dyr,double *dyi,double *uyr,
     double *uyi,int iter_max,double error_max,int *nto,double *vm,
     double *va,double **pq_node,double **pq_load,int *conv)
{
   int nb,ct,i,j,k,nd,ne,iter,no_error,no_err,*type,*pol,*iuf,*juf,*ius,*jus;
   double error,err,*mis,*duf,*uuf,*dus,*uus;
   nd=num_node+1;  
   ne=nd+1;  
   nb=num_line+num_tran;
   type=(int *)calloc(nd,sizeof(int));
   if(type==NULL)  {  printf("\nno memory in type");   exit(0);  }
   pol=(int *)calloc(nd,sizeof(int));
   if(pol==NULL)  {  printf("\nno memory in pol");   exit(0);  }
   mis=(double *)calloc(nd,sizeof(double));
   if(mis==NULL)  {  printf("\nno memory in mis");   exit(0);  }
   duf=(double *)calloc(nd,sizeof(double));
   if(duf==NULL)   {  printf("\nno memory in duf");   exit(0);  }
   dus=(double *)calloc(nd,sizeof(double));
   if(dus==NULL)   {  printf("\nno memory in dus");   exit(0);  }
   iuf=(int *)calloc(ne,sizeof(int));
   if(iuf==NULL)   {  printf("\nno memory in iuf");   exit(0);  }
   ius=(int *)calloc(ne,sizeof(int));
   if(ius==NULL)   {  printf("\nno memory in ius");   exit(0);  }

   for(i=1;i<=num_gene;i++)
   {
      if(gene[i].j==0)  
	  { 
		  err=gene[i].a/sita; 
		  break;  
	  }
   }
   for(i=1;i<nd;i++)  
   {  
	   type[i]=1; 
	   va[i]=err; 
	   vm[i]=1.0e0; 
   }
   for(j=1;j<=num_gene;j++)
   {
      i=gene[j].i; 
	  k=gene[j].j; 
	  type[i]=k;
      if(k<=0)  vm[i]=gene[j].c;
   }
   for(j=1;j<=num_load;j++)
   {
      i=load[j].i;  
	  k=load[j].j;  
	  pol[i]=j;
      if(k>1)  type[i]=k;
   }
   ne=2*nb;  
   nb/=2;
loop:  ct=0;   printf("\nne=%d",ne);
   juf=(int *)calloc(ne,sizeof(int));
   if(juf==NULL)   {  printf("\nno memory in juf");   exit(0);  }
   uuf=(double *)calloc(ne,sizeof(double));
   if(uuf==NULL)   {  printf("\nno memory in uuf");   exit(0);  }
   fact(0,nd,num_line,num_tran,type,pol,property,line,tran,load,iy,jy,dyi,
 	    uyi,iuf,juf,duf,uuf,ne,&ct);
   if(ct==1) 
   {
	   ne+=nb;  
	   free(juf);  
	   free(uuf);  
	   zero(duf,1,nd);  
	   goto loop; 
   }
   jus=(int *)calloc(ne,sizeof(int));
   if(jus==NULL)   
   {  
	   printf("\nno memory in jus");  
  
	   exit(0); 
   }
   uus=(double *)calloc(ne,sizeof(double));
   if(uus==NULL)   
   {  
	   printf("\nno memory in uus");  
	   exit(0);  
   }
   fact(1,nd,num_line,num_tran,type,pol,property,line,tran,load,iy,jy,dyi,
	    uyi,ius,jus,dus,uus,ne,&ct);
//   开始迭代    
   iter=0;
   for(;;)
   {
      error=0.0e0;
      power_node(0,nd,pq_node,vm,va,iy,jy,dyr,dyi,uyr,uyi);
      mismach(0,nd,num_gene,num_load,property,pq_node,pq_load,gene,load,
              vm,mis,&err,&no_err);
      if(err>error)   { error=err; no_error=no_err; }
      if(err>error_max)  revise(nd,va,mis,iuf,juf,duf,uuf);
      power_node(1,nd,pq_node,vm,va,iy,jy,dyr,dyi,uyr,uyi);
      mismach(1,nd,num_gene,num_load,property,pq_node,pq_load,gene,load,
              vm,mis,&err,&no_err);
      if(err>error)   { error=err; no_error=no_err; }
      if(err>error_max)  revise(nd,vm,mis,ius,jus,dus,uus);
      printf("\niteration:  %5d    max error: %15.7e   at node: %5d",
            iter,error,nto[no_error]);
      iter++;
      if(error<=error_max)  {  *conv=1;  break;  }
      if(iter>iter_max)
      {
         *conv=-1;
	 printf("\n fast decoupled load flow is no convergence");
         break;
      }
   }
//   printf("\nthe top of the heap is: %ld bytes\n",(unsigned long) coreleft());
   free(iuf);  free(juf);  free(duf);  free(uuf);   free(ius);  free(jus);
   free(dus);  free(uus);  free(mis);  free(type);  free(pol);
}

//     形成因子表     
void fact(int kpq,int nd,int num_line,int num_tran,int *type,
     int *pol,double **property,struct data *line,struct data *tran,
     struct data *load,int *iy,int *jy,double *dyi,double *uyi,int *iu,
     int *ju,double *du,double *uu,int ne,int *ct)
{
   int tk,i,j,k,fa,ii,jj,kk;
   double *temp,x,a,b;
   struct data *p,*end;
   temp=(double *)calloc(nd,sizeof(double));
   if(temp==NULL)  {  printf("\nno memory in temp");   exit(0);  }
   for(fa=1,k=1;k<nd;k++)
   {
      tk=type[k];  
	  iu[k]=fa;  
	  zero(temp,k+1,nd);
      if(kpq==0)
      {
         for(end=line+num_line,p=line+1;p<=end;p++)
         {
	        ii=p->i;  
	 	    jj=p->j;
            if(min(ii,jj)!=k||ii==jj)  continue;
            x=1.0e0/p->b; 
			du[ii]-=x; 
			du[jj]-=x;
            kk=max(ii,jj); 
			if(type[kk]!=0)  temp[kk]=x;
         }
         for(end=tran+num_tran,p=tran+1;p<=end;p++)
         {
            ii=p->i; 
			jj=p->j;
            if(min(ii,jj)!=k)  continue;
            x=1.0e0/p->b; 
			du[ii]-=x;  
			du[jj]-=x;
            kk=max(ii,jj); 
			if(type[kk]!=0)  temp[kk]=x;
         }
         if(tk==0)  continue;
      }
      else
      {
         du[k]=dyi[k];
         if(tk<=0)  continue;
         if(tk>1)
		 {
            kk=pol[k]; 
			a=load[kk].c; 
			a*=a;  
			x=load[kk].b/a;
            du[k]=dyi[k]-x*(2.0e0*property[tk][3]+property[tk][4]);
         }
         for(kk=iy[k+1],j=iy[k];j<kk;j++)
         {
            i=jy[j];
            if(type[i]>0)  temp[i]=uyi[j];
         }
      }
      x=du[k];
      for(i=1;i<k;i++)
      {
         for(kk=0,j=iu[i+1],ii=iu[i];ii<j;ii++)
         {
	        jj=ju[ii];
            if(kk==0&&jj>k)  break;
            if(jj==k) 
			{  
				a=uu[ii];
				b=a*du[i]; 
				x-=a*b; 
				kk=1;  
				continue; 
			}
            if(kk==1)  temp[jj]-=b*uu[ii];
		 }
      }
      du[k]=x;
      for(j=k+1;j<nd;j++)
      {
         a=temp[j];  
		 if(a==0.0e0)  continue;
	     uu[fa]=a/x;  
		 ju[fa++]=j;
	    if(fa>=ne) 
		{ 
			*ct=1; 
			goto loop;  
		}
      }
   }
loop:   free(temp);
}

//      计算节点功率      
void power_node(int kpq,int nd,double **pq_node,double *vm,double *va,\
     int *iy,int *jy,double *dyr,double *dyi,double *uyr,double *uyi)
{
   int i,j,k,m,ip;
   double a,b,vi,vij,cij,si,co,aa;
   for(i=1;i<nd;i++) 
	   pq_node[i][kpq]=0.0e0;
   for(i=1;i<nd;i++)
   {
      vi=vm[i];
      if(kpq==0) 
		  a=dyr[i];
      else 
		  a=-dyi[i];
      pq_node[i][kpq]+=vi*vi*a;
      for(m=iy[i+1],k=iy[i];k<m;k++)
      {
         if(kpq==0)
		 {  
			 a=uyr[k];  
			 b=uyi[k];
		 }
         else  
		 { 
			 a=-uyi[k]; 
			 b=uyr[k];
		 }
         j=jy[k];  
		 vij=vi*vm[j]; 
		 cij=va[i]-va[j];
         aa=cij*cij; 
		 si=cij-cij*aa/6.0e0; 
		 co=1.0e0-0.5e0*aa+aa*aa/24.0e0;
         a=a*vij*co;  
		 b=b*vij*si;
         pq_node[i][kpq]+=a+b;   
		 pq_node[j][kpq]+=a-b;
      }
   }
}

//       计算节点功率误差      
void mismach(int kpq,int nd,int num_gene,int num_load,double **property,
     double **pq_node,double **pq_load,struct data *gene,struct data *load,
     double *vm,double *mis,double *err,int *no_err)
{
   int i,j;
   double v,a,b,c,pow;
   struct data *p,*end;
   for(i=1;i<nd;i++) 
	   mis[i]=-pq_node[i][kpq];
   for(end=load+num_load,p=load+1;p<=end;p++)
   {
      i=p->i;  j=p->j;
      if(kpq==0)  pow=p->a;
      else  pow=p->b;
      if(j>1)
      {
         v=vm[i]/p->c;
         if(kpq==0) { a=property[j][0];  b=property[j][1];  c=property[j][2]; }
         else       { a=property[j][3];  b=property[j][4];  c=property[j][5]; }
         pow*=c+v*(b+v*a);
      }
      pq_load[i][kpq]=pow;  mis[i]-=pow;
   }
   for(end=gene+num_gene,p=gene+1;p<=end;p++)
   {
      i=p->i;  j=p->j;
      if(kpq==0)
      {
         if(j==0)  mis[i]=0.0e0;
         else      mis[i]+=p->a;
      }
      else
      {
         if(j<=0)  mis[i]=0.0e0;
         else      mis[i]+=p->b;
      }
   }
   for(*err=0.0e0,i=1;i<nd;i++)
   {
      pow=mis[i];  mis[i]=pow/vm[i];  pow=fabs(pow);
      if(pow>*err)  { *err=pow;  *no_err=i;  }
   }
}

//      修正电压幅值和角度      
void revise(int nd,double *v,double *mis,int *iu,int *ju,double *du,
     double *uu)
{
   int i,j,k,m;
   for(i=1;i<nd;i++)
   {
      for(m=iu[i+1],j=iu[i];j<m;j++)  
	  { 
		  k=ju[j];  mis[k]-=uu[j]*mis[i]; 
	  }
      mis[i]/=du[i];
   }
   for(i=nd-2;i>0;i--)
   {
      for(m=iu[i+1],j=iu[i];j<m;j++)
      {
	 k=ju[j];  mis[i]-=uu[j]*mis[k];
      }
   }
   for(i=1;i<nd;i++)  v[i]-=mis[i];
}


//       求解线性方程组      
void eliminate(int m,double *x,double *s,int n,int *fa,int *iu,int *ju,
     double *uu)
{
   int i,j,k;
   double aa,bb;
   iu[m]=*fa;
   for(i=1;i<m;i++)
   {
      aa=x[i];  
	  if(aa==0.0e0)  continue;
      for(k=iu[i+1],j=iu[i];j<k;j++) 
		  x[ju[j]]-=aa*uu[j];
          s[m]-=aa*s[i];
   }
   aa=x[m];
   for(i=m+1;i<n;i++)
   {
      bb=x[i];  
	  if(bb==0.0e0)  continue;
      ju[*fa]=i;  
	  uu[*fa]=bb/aa; 
	  (*fa)++;
   }
   s[m]/=aa;
}

/*finding (i,j) element in addmittance matrix------------------------------*/
void czm(int i,int j,int *iy,int *jy,int *k)
{
   int m,ih,jh,ib;
   *k=0;  ih=i;  jh=j;
   if(ih>jh) {  m=ih;  ih=jh;  jh=m;  }
   for(ib=iy[ih+1],m=iy[ih];m<ib;m++)
   {
      if(jy[m]==jh)   {   *k=m;  break;  }
   }
}

/*array *a set up zero from start to end-----------------------------------*/
void zero(double *a,int start,int end)
{
   int i;
   for(i=start;i<end;i++)   a[i]=0.0e0;
}

//     计算支路功率      
void cbr(int num_line,int num_tran,struct data *line,struct data *tran,
	 int *nto,double *vm,double *va)
{
   int i,j,i2,j2;
   double r,x,t,b,d,cd,sd,ri,rj,xi,xj,vi,vj,vij,pij,qij,pji,qji,dpb,dqb,ph,qh;
   struct data *p,*end;
   fprintf(fou,"\nno.i  no.j     pij        qij        pji        qji        dph        dqh\n");
   ph=0.0e0;  qh=0.0e0;
   for(end=line+num_line,p=line+1;p<=end;p++)
   {
      i=p->i;  j=p->j;
      r=p->a;  x=p->b;  b=r*r+x*x;
      if(i==j)
      {
	 vi=vm[i];  b=vi*vi/b;
	 pij=r*b;  qij=x*b;  pji=0.0e0;  qji=0.0e0;
	 dpb=pij;  ph+=dpb;  dqb=qij;    qh+=dqb;
      }
      else
      {
	 r/=b;  x/=-b;  b=p->c;  d=va[i]-va[j];
	 vi=vm[i];  vj=vm[j];  vij=vi*vj;  vi*=vi;  vj*=vj;
	 cd=vij*cos(d);  sd=vij*sin(d);
	 pij=vi*r-r*cd-x*sd;  pji=vj*r-r*cd+x*sd;  dpb=pij+pji;  ph+=dpb;
	 qij=-vi*(b+x)+x*cd-r*sd;  qji=-vj*(b+x)+x*cd+r*sd;  dqb=qij+qji;  qh+=dqb;
      }
      fprintf(fou,"%4d%6d%10.4f%11.4f%11.4f%11.4f%11.4f%11.4f\n",
	      nto[i],nto[j],pij,qij,pji,qji,dpb,dqb);
   }
   for(end=tran+num_tran,p=tran+1;p<=end;p++)
   {
      i=p->i;  j=p->j;  r=p->a;  x=p->b;  t=p->c;
      b=t*(r*r+x*x);  r/=b;  x/=-b;
      b=t-1.0e0;  ri=r*b; xi=x*b;  rj=-ri/t;  xj=-xi/t;
      vi=vm[i];  vj=vm[j];  vij=vi*vj;  vi*=vi;  vj*=vj;
      d=va[i]-va[j];  cd=vij*cos(d);  sd=vij*sin(d);
      pij=vi*(ri+r)-r*cd-x*sd;  pji=vj*(rj+r)-r*cd+x*sd;  dpb=pij+pji;  ph+=dpb;
      qij=-vi*(xi+x)+x*cd-r*sd;  qji=-vj*(xj+x)+x*cd+r*sd;  dqb=qij+qji;  qh+=dqb;
      fprintf(fou,"%4d%6d%10.4f%11.4f%11.4f%11.4f%11.4f%11.4f\n",
	      nto[i],nto[j],pij,qij,pji,qji,dpb,dqb);
   }
   fprintf(fou,"\n\n 系统总损耗:");
   fprintf(fou,"\n    有功损耗= %f",ph);
   fprintf(fou,"\n    无功损耗= %f",qh);
}

⌨️ 快捷键说明

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