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

📄 floor.c

📁 学校上机编写的PQ分解法潮流计算 满足精度就自动停止 计算的输入输出为txt文件 有参考
💻 C
📖 第 1 页 / 共 2 页
字号:
 #include <stdio.h>
 #include <math.h>
 #define  M 50              /*矩阵阶数*/
 int i,j,k,l,z;              /* 循环变量 */
 int n,                      /* 节点数 */
     m,                      /* 支路数 */
     dd,                     /*对地支路数*/
     pq,                     /* PQ节点数 */
     pv,                     /* PV节点数 */
     byqn,                   /* 变压器数*/ 
     number,
     ii,
	 ll=1,
	 li=1;
	 float eps,	                 /* 精度 */
       max1,max2;

 static float G[M][M],B[M][M],
	 D1[M],D2[M],yue[M][M],xing[M][M];

 struct jiedian                    /* 节点结构体 */
      {  int num,s;                /* num为节点号,s为节点类型*/
	     float p,q,e,f,v;
      } jiedian[M];

 struct zhilu                      /* 支路结构体 */
      {  int num;
	 int p1,p2;                /*支路的两个节点*/
	 float r,x;                /*支路的电阻与电抗*/
      } zhilu[M];

 struct byq
 
 { int num,
      p1,
      p2;
  float r,x,s,k;
 }byq[M];

 FILE *fp1,*fp2;
void data1()                 /* 读取数据 */
 { int h,numb;
   fp1=fopen("d:\\input.txt","r");
      if(fp1==NULL)
     { printf(" can not open file !\n");
      printf(" 在D盘创建一个文件,并命名为 input.txt. 文件输入内容的格式如下:.\n");
       printf("\n  ==============================================================\n");
       printf(" 第一行:节点数, 支路数, 对地支路数,变压器数,PQ节点数,PV节点数,精度,\n");
	 printf("换行后输入:第几个节点,节点类型,有功功率,无功功率,电压值,电压角度\n");
	 printf("(若是PQ节点则类型是1,电压是自己预置的值;\n");
	 printf("PV节点类型是2,不用输入无功功率,电压是题目给定的值;\n");
	 printf("平衡节点类型是3,只需输入电压及其角度。)\n");
	 printf("注意每次输入一个节点应该换行。\n");
      printf("\n继续换行输入:第几条支路,支路类型,支路连接的第一个节点号,支路连接的第二个节点号,支路电阻,支路电抗\n ");  
       printf("注意:支路没有变压器类型是1,有是2。若有变压器则还需要输入其变比和容量\n");
    	 printf("\n  ==============================================================\n");
	   exit(0);
     }
   fscanf(fp1,"%d,%d,%d,%d,%d,%d,%f\n",&n,&m,&dd,&byqn,&pq,&pv,&eps);  /*输入节点数,支路数,对地支路数,PQ节点数PV节点数和精度*/
   j=1;k=pq+1;


   for(i=1;i<=n;i++)                                        /*输入节点类型的输入功率和节电电压初值*/
      {
	fscanf(fp1,"%d,%d",&numb,&h);
	if(h==1)                                                /*类型h=1是PQ节点*/
	  { fscanf(fp1,",%f,%f,%f,%f\n",&jiedian[j].p,&jiedian[j].q,
				       &jiedian[j].e,&jiedian[j].f);
	    jiedian[j].num=numb;
	    jiedian[j].s=h;
	    j++;
	   }
	if(h==2)                                                 /*类型h=2是pv节点*/
	  { fscanf(fp1,",%f,%f,%f\n",&jiedian[k].p,&jiedian[k].v,
				       &jiedian[k].f);
	    jiedian[k].num=numb;
        jiedian[k].e=jiedian[k].v;
	    jiedian[k].s=h;
	    k++;
	   }
	if(h==3)                                                 /*类型h=3是平衡节点*/
	  { fscanf(fp1,",%f,%f\n",&jiedian[n].e,&jiedian[n].f);
	    jiedian[n].num=numb;
	    jiedian[n].s=h;
	   }
       }


   for(i=1;i<=m+byqn;i++)                                         /*输入支路阻抗*/
     {fscanf(fp1,"%d,%d",&number,&ii);
     if(ii==1)      
	 {fscanf(fp1,",%d,%d,%f,%f\n", &zhilu[ll].p1,
   &zhilu[ll].p2,   &zhilu[ll].r,  &zhilu[ll].x);
     zhilu[ll].num=ll;ll++;}
	 if(ii==2)                                    /*变压器编号num,所连节点p1,p2,阻抗r,x,变比k,容量s*/
	 { fscanf(fp1,",%d,%d,%f,%f,%f,%f\n",&byq[li].p1,
   &byq[li].p2,&byq[li].r,&byq[li].x,&byq[li].k,&byq[li].s);
     byq[li].num=li;li++;}
   }

   fclose(fp1);
   if((fp2=fopen("d:\\out.txt","w"))==NULL)
     { printf("  can not open file!\n");
        exit(0);
       }

  
  fprintf(fp2,"\n   ************** 原始数据 **************\n");
  fprintf(fp2,"  ===================================================================\n");
  fprintf(fp2,"    节点数:%2d  支路数:%2d  对地支路数:%2d 变压器数:%2d   PQ节点数:%2d PV节点数:%2d   精度:%.5f\n",
								 n,m,dd,byqn,pq,pv,eps);
  fprintf(fp2,"  -------------------------------------------------------------------\n");
  for(i=1;i<=pq;i++)
  fprintf(fp2,"   PQ节点      节点%2d       P[%d]=%f    Q[%d]=%f\n",
	       jiedian[i].num,jiedian[i].num,jiedian[i].p,jiedian[i].num,jiedian[i].q);
  for(i=pq+1;i<=pq+pv;i++)
  fprintf(fp2,"   PV节点      节点%2d       P[%d]=%f     V[%d]=%f\n",
	       jiedian[i].num,jiedian[i].num,jiedian[i].p,jiedian[i].num,jiedian[i].v);
  fprintf(fp2,"  平衡节点     节点%2d       e[%d]=%f     f[%d]=%f\n",
	       jiedian[n].num,jiedian[n].num,jiedian[n].e,jiedian[n].num,jiedian[n].f);
  fprintf(fp2,"  -------------------------------------------------------------------\n");
  for(i=1;i<=m;i++)
  fprintf(fp2,"    支路%2d     相关节点:%2d,%2d   R=%f  X=%f\n",
		      i,zhilu[i].p1,zhilu[i].p2,zhilu[i].r,zhilu[i].x);
  for(i=1;i<=byqn;i++)
  fprintf(fp2,"   变压器编号%2d    相关节点:%2d,%2d   R=%f  X=%f  变比K=%f\n",byq[i].num,
	  byq[i].p1,byq[i].p2,byq[i].r,byq[i].x,byq[i].k);
  fprintf(fp2,"  ===================================================================\n");

 }
void form_y()                    /* 形成节点导纳矩阵 */
 {int bn;
  float S,g,b,g1,b1,g2,b2;
   for(i=1;i<=m;i++) 
	for(i=1;i<=m;i++) 
	                                                     /*对地导纳*/
  if((zhilu[i].p1==0)||(zhilu[i].p2==0))
    {S=zhilu[i].r*zhilu[i].r+zhilu[i].x*zhilu[i].x;
     if(S==0) {G[zhilu[i].p1][zhilu[i].p2]=B[zhilu[i].p1][zhilu[i].p2]=G[zhilu[i].p2][zhilu[i].p1]=B[zhilu[i].p2][zhilu[i].p1]=0;continue;}
     if(zhilu[i].p1==0)
	   {G[zhilu[i].p1][zhilu[i].p2]+=zhilu[i].r/S;
        B[zhilu[i].p1][zhilu[i].p2]+=-zhilu[i].x/S;
        G[zhilu[i].p2][zhilu[i].p1]=G[zhilu[i].p1][zhilu[i].p2];
        B[zhilu[i].p2][zhilu[i].p1]=B[zhilu[i].p1][zhilu[i].p2];
	   }
	 if(zhilu[i].p2==0)
         {G[zhilu[i].p2][zhilu[i].p1]+=zhilu[i].r/S;
        B[zhilu[i].p2][zhilu[i].p1]+=-zhilu[i].x/S;
        G[zhilu[i].p1][zhilu[i].p2]=G[zhilu[i].p2][zhilu[i].p1];
        B[zhilu[i].p1][zhilu[i].p2]=B[zhilu[i].p2][zhilu[i].p1];
	   }
  } 	                                                        
                     
 for(i=1;i<=m;i++)               /*节点导纳矩阵的主对角线上的导纳*/
      for(j=1;j<=n;j++)
	 if((zhilu[i].p1==j)||(zhilu[i].p2==j))
	   { S=zhilu[i].r*zhilu[i].r+zhilu[i].x*zhilu[i].x;
	 if(S==0)  continue;
	     G[j][j]+=zhilu[i].r/S;
	     B[j][j]+=-zhilu[i].x/S;
	   }

  
    for(j=1;j<=n;j++)
    for(bn=1;bn<=byqn;bn++)
	   {if(byq[bn].p1==j)
		{ S=byq[bn].r*byq[bn].r+byq[bn].x*byq[bn].x;
		 g=byq[bn].r/S;
		 b=-byq[bn].x/S;
		 g2=g/byq[bn].k;
		 b2=b/byq[bn].k;
		 g1=g*((1-byq[bn].k)/(byq[bn].k*byq[bn].k));
		 b1=b*((1-byq[bn].k)/(byq[bn].k*byq[bn].k));
		 G[j][j]=G[j][j]+g2+g1;
		 B[j][j]=B[j][j]+b2+b1;}
		 if(byq[bn].p2==j)
		 {S=byq[bn].r*byq[bn].r+byq[bn].x*byq[bn].x;
		 g=byq[bn].r/S;
		 b=-byq[bn].x/S;
		 g2=g/byq[bn].k;
		 b2=b/byq[bn].k;
		 g1=g*(byq[bn].k-1)/byq[bn].k;
		 b1=b*(byq[bn].k-1)/byq[bn].k;
		 G[j][j]=G[j][j]+g2+g1;
		 B[j][j]=B[j][j]+b2+b1;}
}
  for(k=1;k<=m;k++)              /*节点导纳矩阵非主对角线上的导纳*/
      { i=zhilu[k].p1;
	j=zhilu[k].p2;
	S=zhilu[k].r*zhilu[k].r+zhilu[k].x*zhilu[k].x;
	if(S==0)  continue;
	G[i][j]+=-zhilu[k].r/S;
	B[i][j]+=zhilu[k].x/S;
	G[j][i]=G[i][j];
	B[j][i]=B[i][j];
	} 
   for(bn=1;bn<=byqn;bn++)
      {i=byq[bn].p1;j=byq[bn].p2;
       S=byq[bn].r*byq[bn].r+byq[bn].x*byq[bn].x;
        G[i][j]+=-(byq[bn].r/S)/byq[bn].k;
        B[i][j]+=(byq[bn].x/S)/byq[bn].k;
        G[j][i]=G[i][j];
        B[j][i]=B[i][j];}
                         /*输出节点导纳矩阵*/
  fprintf(fp2,"\n\n             ********* 计算结果 *********\n");
  fprintf(fp2,"\n  节点导纳矩阵为:");
  for(i=1;i<=n;i++)
     { fprintf(fp2,"\n     ");
       for(j=1;j<=n;j++)
	   fprintf(fp2,"%8.5f+j%8.5f   ",G[i][j],B[i][j]);
          }
    fprintf(fp2,"\n  ==============================================================\n");
  fprintf(fp2,"\n  B'矩阵为:");
  for(i=1;i<=n-1;i++)
     { fprintf(fp2,"\n     ");
       for(j=1;j<=n-1;j++)
	   fprintf(fp2,"%8.5f   ",B[i][j]);
  }
    fprintf(fp2,"\n  ==============================================================\n");
  fprintf(fp2,"\n  B''矩阵为:");
  for(i=1;i<=pq;i++)
     { fprintf(fp2,"\n     ");
       for(j=1;j<=pq;j++)
	   fprintf(fp2,"%8.5f   ",B[i][j]);
  }
    fprintf(fp2,"\n  ==============================================================\n");
 }


 void yueyue()
 { 
	 int a ,b;
	 for(a=1;a<=M;a++)
	 { for (b=1;b<=M;b++)
	 {yue[a][b]=0;xing[a][b]=0;}
	 }
	 for(i=1;i<=pq;i++)
	 {for (j=1;j<=pq;j++)
	   xing[i][j]=B[i][j];
	  	 }
	 for(i=1;i<=pq+pv;i++)
	 {for(j=1;j<=pq+pv;j++)
	  yue[i][j]=B[i][j];
	 }
 }
 void xingxing()                      /* 形成矩阵方程 */
 { float ei,ej,fi,fj;
   int i1,j1;
   float dP[M];

   
   for(i=1;i<=pq+pv;i++)           /*初始化矩阵*/
      { dP[i]=0;
	    
		D1[i]=0;
	
	      }
     
    for(i=1;i<=pq;i++)                   /*PQ节点函数残量*/
      {  ei=jiedian[i].e;
	     fi=jiedian[i].f;
	 for(j=1;j<=n;j++)
	  { i1=jiedian[i].num;
	    j1=jiedian[j].num;
	    ej=jiedian[j].e;
          fj=jiedian[j].f;
           dP[i]+=ej*(G[i1][j1]*cos(fi-fj)+B[i1][j1]*sin(fi-fj));
		  
			    }
	 dP[i]=jiedian[i].p-dP[i]*ei; 
	 
	
	}
 

   for(i=pq+1;i<=pq+pv;i++)                /*PV节点函数残量*/
	{  ei=jiedian[i].e;
	   fi=jiedian[i].f;
	   for(j=1;j<=n;j++)
	    { i1=jiedian[i].num;
	      j1=jiedian[j].num;
	      ej=jiedian[j].e;
	      fj=jiedian[j].f;
	      dP[i]+=ej*(G[i1][j1]*cos(fi-fj)+B[i1][j1]*sin(fi-fj));
        }  
           dP[i]=jiedian[i].p-dP[i]*ei;
	   	}

   for(i=1;i<=pq+pv;i++)                                   /*形成函数残量矩阵D[M]*/
       D1[i]=dP[i]/jiedian[i].e;                          /*形成^P */
     max1=D1[1];
     for(i=2;i<=pq+pv;i++)
  if(fabs(D1[i])>fabs(max1))
	max1=D1[i];
   max1=fabs(max1);
     fprintf(fp2,"\n%8.5f\n",max1);
      }

void xingxing1()                      /* 形成矩阵方程 */
 { float ei,ej,fi,fj;
   int i1,j1;
   float dQ[M];

   
   for(i=1;i<=pq+pv;i++)           /*初始化矩阵*/
      { 
	    dQ[i]=0;
		D2[i]=0;
	      }
      
    for(i=1;i<=pq;i++)                   /*PQ节点函数残量*/
      {  ei=jiedian[i].e;
	     fi=jiedian[i].f;
	 for(j=1;j<=n;j++)
	  { i1=jiedian[i].num;
	    j1=jiedian[j].num;
	    ej=jiedian[j].e;
          fj=jiedian[j].f;
           	  dQ[i]+=ej*(G[i1][j1]*sin(fi-fj)-B[i1][j1]*cos(fi-fj));
			    }
	 dQ[i]=jiedian[i].q-dQ[i]*ei;
	}
 
      
   for(i=1;i<=pq;i++)
      D2[i]=dQ[i]/jiedian[i].e;                     /*形成^Q */
      max2=D2[1];
    for(i=2;i<=pq;i++)
     if(fabs(D2[i])>fabs(max2))
	 max2=D2[i];
	 max2=fabs(max2);

⌨️ 快捷键说明

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