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

📄 yangshuo.c

📁 故障分析 用c语言编程的 利用pq pv节点进行的潮流计算
💻 C
📖 第 1 页 / 共 2 页
字号:
	  
		
		else                                         /*求i=j时的H、N、J、L*/
	    { a=0;b=0;
	      for(k=1;k<=n;k++)
		  if(k!=i)
		    { k1=jiedian[k].num;
		      a=a+G[i1][k1]*jiedian[k].e-B[i1][k1]*jiedian[k].f;
		      b=b+G[i1][k1]*jiedian[k].f+B[i1][k1]*jiedian[k].e;
		     }
	      ykb[2*i-1][2*j-1]=2*G[i1][i1]*jiedian[i].f+b;      /*H*/
	      ykb[2*i][2*j]=-2*B[i1][i1]*jiedian[i].e-b;         /*L*/
	      ykb[2*i-1][2*i]=2*G[i1][i1]*jiedian[i].e+a;        /*N*/
	      ykb[2*i][2*i-1]=-2*B[i1][i1]*jiedian[i].f+a;       /*J*/
	    }
	  }


   for(i=pq+1;i<=pq+pv;i++)                                  /*形成pv节点子阵*/
      for(j=1;j<n;j++)
	 {  i1=jiedian[i].num;
	    j1=jiedian[j].num;
	    ei=jiedian[i].e;
	    ej=jiedian[j].e;
	    fi=jiedian[i].f;
	    fj=jiedian[j].f;
	  if(i!=j)                                           /*求i!=j时的H、N*/                                          
	    { ykb[2*i-1][2*j-1]=-B[i1][j1]*ei+G[i1][j1]*fi;     /*H*/
	      ykb[2*i-1][2*j]=G[i1][j1]*ei+B[i1][j1]*fi;        /*N*/
	     }/*省略R[i][j]=0及S[i][j]=0*/
	  
	  
	  else                                               /*求i=j时的H、N、R、S*/
	    { a=0;b=0;
	       for(k=1;k<=n;k++)
		  if(k!=i)
		    { k1=jiedian[k].num;
		      a+=G[i1][k1]*jiedian[k].e-B[i1][k1]*jiedian[k].f;
		      b+=G[i1][k1]*jiedian[k].f+B[i1][k1]*jiedian[k].e;
		     }
	       ykb[2*i-1][2*j-1]=2*G[i1][i1]*jiedian[i].f+b;    /*H*/
	       ykb[2*i-1][2*i]=2*G[i1][i1]*jiedian[i].e+a;      /*N*/
	       ykb[2*i][2*j-1]=2*fi;                            /*R*/
	       ykb[2*i][2*j]=2*ei;                              /*S*/
	      }
	 }

   for(i=1;i<=2*(pq+pv);i++)                          /*把函数残量矩阵编入修正方程*/
      ykb[i][2*(pq+pv)+1]=D[i];


  }
  


  void  print_ykb(int z)
  {int i,j;
  fprintf(fp,"\n===============================================================\n");
  fprintf(fp,"--------------------输出雅可比矩阵和迭代次数---------------------\n");
   fprintf(fp,"\n  迭代的次数为  %2d\n", z);
   printf("\n输出雅可比矩阵和迭代次数\n");
   printf("迭代的次数为  %2d\n", z);
  for(i=1;i<=2*(pq+pv);i++)
  {printf("\n");fprintf(fp,"\n");
   for(j=1;j<=2*(pq+pv);j++)
	  { printf("%7.5f     ",ykb[i][j]);
   fprintf(fp,"%8.5f     ",ykb[i][j]);}
  }
  fprintf(fp," \n=============================================================\n");
  }

 void solve()                                        /* 求解修正方程组 (用列主元消取法)*/
 { float d,t;
   k=1;
   do
    {
     d=ykb[k][k];
     l=k;
     i=k+1;
     do
      {
       if(fabs(ykb[i][k])>fabs(d))                  /*列选主元*/
	{ d=ykb[i][k];
	  l=i;
	 }
       i++;
       } while(i<=2*(pq+pv));
     if(l!=k)
       {  for(j=k;j<=2*(pq+pv)+1;j++)
	     { t=ykb[l][j];
	       ykb[l][j]=ykb[k][j];
	       ykb[k][j]=t;
	      }
	 }
    for(j=k+1;j<=2*(pq+pv)+1;j++)                    /*正消*/
       ykb[k][j]/=ykb[k][k];
    for(i=k+1;i<=2*(pq+pv);i++)
       for(j=k+1;j<=2*(pq+pv)+1;j++)
	  ykb[i][j]-=ykb[i][k]*ykb[k][j];
    k++;
    }  while(k<=2*(pq+pv));
    if(k!=1)
    {
     for(i=2*(pq+pv);i>=1;i--)                   /*回代*/
     { t=0;
       for(j=i+1;j<=2*(pq+pv);j++)
	  t+=ykb[i][j]*D[j];
       D[i]=ykb[i][2*(pq+pv)+1]-t;
       }
     }

  for(i=1;i<=(pq+pv);i++)
     { jiedian[i].e+=D[2*i];
       jiedian[i].f+=D[2*i-1];
      }
  max=fabs(D[1]);
  for(i=1;i<=2*(pq+pv);i++)
     if(fabs(D[i])>max)
	max=fabs(D[i]);

  }

   /*输出迭代过程中的电压值*/
   void  voltage()
   {int i,j;
    fprintf(fp,"\n=====================================================================\n");
   fprintf(fp,"\n--------------------------输出  df,de--------------------------------\n");
   for(i=1;i<=(pq+pv);i++)
   {fprintf(fp,"\n");
   fprintf(fp,"  节点为%2d  de+jdf=%7.5f+j%7.5f    \n",i,D[2*i],D[2*i-1]);}
   fprintf(fp,"\n---------------------------------------------------------------------\n");
   fprintf(fp,"\n----------------输出迭代过程中的电压值-------------------------------\n");
   for(i=1;i<=(pq+pv);i++)
   {fprintf(fp,"\n  节点为%2d    e+jf=%7.5f+j%7.5f     \n",i,jiedian[i].e,jiedian[i].f);}
     fprintf(fp,"\n=====================================================================\n");
   }

 float mul_Re(x1,y1,x2,y2)
 float x1,x2,y1,y2;
 { float x;
   x=x1*x2-y1*y2;
   return(x);
  }
 float mul_Im(x1,y1,x2,y2)
 float x1,x2,y1,y2;
 { float y;
   y=x1*y2+x2*y1;
   return(y);
  }



 void data2()                /* 潮流计算结果 */
 { float sp=0,sq=0,mo1,mo2,mo3,mo4,mo5,mo6,ff;
    int i1,j1;
    static float P[M][M],Q[M][M];
  fprintf(fp,"\n  ===================================================================\n");
    fprintf(fp,"\n\n  各节点电压为:");
    for(i=1;i<=n;i++)
       fprintf(fp,"\n  U[%d]=%7.5f + j %7.5f",
		       jiedian[i].num,jiedian[i].e,jiedian[i].f);
	 fprintf(fp,"\n  ===================================================================\n");
    fprintf(fp,"\n\n  平衡节点功率为:");
    for(i=1;i<=n;i++)
      { i1=jiedian[n].num;
	j1=jiedian[i].num;
	sp+=mul_Re(G[i1][j1],-B[i1][j1],jiedian[i].e,-jiedian[i].f);
	sq+=mul_Im(G[i1][j1],-B[i1][j1],jiedian[i].e,-jiedian[i].f);
       }
    jiedian[n].p=mul_Re(jiedian[n].e,jiedian[n].f,sp,sq);
    jiedian[n].q=mul_Im(jiedian[n].e,jiedian[n].f,sp,sq);
    fprintf(fp,"\n  S[%d]=%7.5f+j %7.5f",jiedian[n].num,jiedian[n].p,jiedian[n].q);
	 fprintf(fp,"\n  ===================================================================\n");
    fprintf(fp,"\n\n  线路功率如下:\n");
    for(k=1;k<=m;k++)
       { i1=zhilu[k].p1;
	 j1=zhilu[k].p2;
	 for(l=1;l<=n;l++)
	   { if(jiedian[l].num==i1)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
		i=l;
	     if(jiedian[l].num==j1)
		j=l;
	     }

	 sp=mul_Re(jiedian[i].e-jiedian[j].e,-jiedian[i].f+jiedian[j].f,
			-G[i1][j1],B[i1][j1]);
	 sq=mul_Im(jiedian[i].e-jiedian[j].e,-jiedian[i].f+jiedian[j].f,
			-G[i1][j1],B[i1][j1]);
	 P[i1][j1]=mul_Re(jiedian[i].e,jiedian[i].f,sp,sq);
	 Q[i1][j1]=mul_Im(jiedian[i].e,jiedian[i].f,sp,sq);
	 sp=mul_Re(jiedian[j].e-jiedian[i].e,-jiedian[j].f+jiedian[i].f,
			-G[j1][i1],B[j1][i1]);
	 sq=mul_Im(jiedian[j].e-jiedian[i].e,-jiedian[j].f+jiedian[i].f,
			-G[j1][i1],B[j1][i1]);
	 P[j1][i1]=mul_Re(jiedian[j].e,jiedian[j].f,sp,sq);
	 Q[j1][i1]=mul_Im(jiedian[j].e,jiedian[j].f,sp,sq);

	 fprintf(fp,"\n  线路%d-%d的功率:",i1,j1);
	 fprintf(fp," %7.5f + j %7.5f",P[i1][j1],Q[i1][j1]);
	 fprintf(fp,"\n  线路%d-%d的功率:",j1,i1);
	 fprintf(fp," %7.5f + j %7.5f",P[j1][i1],Q[j1][i1]);}
       for(i=1;i<=(m-dd);i++)                    /*求平行支路的功率分布(功率按导纳分布)*/
     {z=1;
     mo3=zhilu[i].r*zhilu[i].r+zhilu[i].x*zhilu[i].x;
       mo3=1/sqrt(mo3);
       for(j=i+1;j<=(m-dd);j++)
         {if((zhilu[i].p1==zhilu[j].p1)&&(zhilu[i].p2==zhilu[j].p2))
              {i1=zhilu[i].p1;
	          j1=zhilu[i].p2;
	          mo4=zhilu[j].r*zhilu[j].r+zhilu[j].x*zhilu[j].x;
              mo4=1/sqrt(mo4);
              mo3=mo3+mo4; 
                 z++;}}
       if(z>1)
         { fprintf(fp,"\n====================================================================\n");
            fprintf(fp,"节点%d-%d之间有%d条平行支路\n",zhilu[i].p1,zhilu[i].p2,z);
            fprintf(fp,"功率分布为:\n");

            for(k=i;k<z+i;k++)
              { mo5=zhilu[k].r*zhilu[k].r+zhilu[k].x*zhilu[k].x;
               mo6=1/sqrt(mo5);
               ff=mo6/mo3;
               fprintf(fp,"\n     导纳Y=%8.6f的支路",mo6); 
               fprintf(fp,"\n  支路%d-%d的功率:",zhilu[i].p1,zhilu[i].p2);
               fprintf(fp," %8.6f + j %8.6f",ff*P[i1][j1],ff*Q[i1][j1]);
               fprintf(fp,"\n  支路%d-%d的功率:",zhilu[i].p2,zhilu[i].p1);
               fprintf(fp," %8.6f + j %8.6f\n",ff*P[j1][i1],ff*Q[j1][i1]);
             }
                                
                i=i+z-1;           }
          }               
     fprintf(fp,"\n\n  线路上损耗的功率为:");
     for(k=1;k<=m;k++)
       { i=zhilu[k].p1;
         j=zhilu[k].p2;
	 fprintf(fp,"\n  线路%d-%d上的功率损耗:",i,j);
	 fprintf(fp,"  %7.5f + j %7.5f",fabs(P[i][j]+P[j][i]),
					 fabs(Q[i][j]+Q[j][i]));

	}
    fprintf(fp,"\n\n  网络总损耗:");
    sp=0;sq=0;
    for(i=1;i<=n;i++)
       for(j=1;j<=n;j++)
          { sp+=P[i][j];
            sq+=Q[i][j];
           }
    fprintf(fp,"  %7.5f + j %7.5f\n",sp,sq);
    fprintf(fp,"\n  ************************结束************************\n");
    fclose(fp);

  }

 void main()               /* 主函数 */
 { z=1;
  data1();
  form_y();
  do
   { form_ykb();
     print_ykb(z);
     solve();
	 voltage();
     z++;
   }
   while((z<N)&&(max>=eps));
  data2();
  printf(" \n!!计算结束,结果存放于输出文件中!!\n");
  }

⌨️ 快捷键说明

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