pq_decouple.C
上传用户:wxl722722
上传日期:2022-07-11
资源大小:10k
文件大小:21k
开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. void Datain(int Nb,int Nl,int Ng,FILE *fp,struct Branch_Type *Branch,struct Load_Type *Load,struct Generator_Type *Generator,struct PVNode_Type *PVNode,int *Npv);  /*从初始数据文件中读入数据*/
  6. 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);  /*形成导纳矩阵函数*/
  7. void AdmittanceMatrixAdd(int Nb,struct Yii_Type *Yii,struct Yii_Type *Yiil,struct Yij_Type *Yij,struct Yij_Type *Yijl,struct Branch_Type *Branch);  /*形成导纳矩阵追加接地支路函数*/
  8. 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);  /*形成因子表函数*/
  9. void NodePower(int flag,int N,struct NodalVol *NodeVol,struct NodalPow *NodePow,struct Yii_Type *Yii,struct Yij_Type *Yij,int *NYseq);  /*节点功率计算函数*/
  10. void Iteration(int flag,struct Generator_Type *Generator,struct Load_Type *Load,struct PVNode_Type *PVNode,struct NodalVol *NodeVol,struct NodalPow *NodePow,struct GeneratorPower *GenPower,int N,double *DI,double *MaxError,int *ErrNode);  /*迭代计算函数*/
  11. void FormulaSolution(int flag,struct U_Type *U,double *D,int *NUsum,double *DI,int N,struct NodalVol *NodeVol,double V0);  /*线性方程组求解函数*/
  12. void NodeDataOutput(FILE *fp,struct NodalVol *NodeVol,struct Generator_Type *Generator,int N,struct GeneratorPower *GenPower,struct NodalPow *NodePow,struct Load_Type *Load,int Nl);  /*节点数据输出函数*/
  13. void BranchDataOutput(FILE *fp,int Nb,struct Branch_Type *Branch,struct NodalVol *NodeVol);  /*支路数据输出函数*/
  14.   struct Branch_Type
  15.   {
  16.    int i,j;
  17.    double R,X,YK;
  18.   }; 
  19.   
  20.   struct Generator_Type
  21.   {
  22.    int i;
  23.    double P,Q;
  24.    double V;
  25.   };
  26.   
  27.   struct Load_Type
  28.   {
  29.    int i;
  30.    double P,Q;
  31.    double V;
  32.   };
  33.   
  34.   struct PVNode_Type
  35.   {
  36.    int i;
  37.    double V;
  38.   };
  39.   
  40.   struct Yii_Type
  41.   {
  42.    double G,B;
  43.   };
  44.   
  45.   struct Yij_Type
  46.   {
  47.    double G,B;
  48.    int j;
  49.   };
  50.   
  51.   struct NodalPow
  52.   {
  53.    double P,Q;
  54.   };
  55.   
  56.   struct NodalVol
  57.   {
  58.     double V,theta;
  59.   };
  60.   
  61.   struct GeneratorPower
  62.   {
  63.      double P,Q;
  64.   };
  65.   
  66.   struct U_Type
  67.   {
  68.      double value;
  69.      int j;
  70.   };
  71.   
  72. main()
  73. {
  74.   int N;                             /*系统节点总数*/
  75.   int Nb;                            /*系统中支路数*/
  76.   int Ng;                            /*发电机节点总数,不包括平衡机*/
  77.   int Nl;                            /*负荷节点总数*/
  78.   double V0;                         /*系统标称电压*/
  79.   double epsilon;                    /*迭代收敛所要求的精确度*/
  80.   struct Branch_Type *Branch;        /*支路数据数组*/
  81.   struct Generator_Type *Generator;  /*发电机数据数组*/
  82.   struct Load_Type *Load;            /*负荷数据数组*/
  83.   struct PVNode_Type *PVNode;        /*PV节点数据数组*/
  84.   int Npv=0;                         /*PV节点个数*/                             
  85.   struct Yii_Type *Yii,*Yiil;        /*导纳对角矩阵数组*/
  86.   struct Yij_Type *Yij,*Yijl;        /*导纳非对角矩阵数组*/
  87.   int *NYseq;                        /*矩阵非对角元素记录数组*/
  88.   struct NodalPow *NodePow;          /*节点功率数组*/
  89.   struct NodalVol *NodeVol;          /*节点电压数组*/
  90.   struct GeneratorPower *GenPower;   /*发电机功率数组*/
  91.   double *DI1,*DI2;                  /*存放误差项的数组*/
  92.   double MaxError=0.0;               /*每次迭代过程中最大误差项*/
  93.   int ErrNode;                       /*最大误差项所在节点*/
  94.   int Kp=1,Kq=1;                     /*有功迭代和无功迭代的标记*/
  95.   int n,k,count;                     /*K为迭代次数*/
  96.   int i;                          
  97.   struct U_Type *U1,*U2;             /*存放因子表非对角元素的数组*/
  98.   double *D1,*D2;                    /*存放因子表对角元素的数组*/
  99.   int *NUsum1,*NUsum2;               /*矩阵非对角元素记录数组*/ 
  100.   char FILENAME[20];
  101.   FILE *fp;                          
  102.   /****************打开初始数据原文件*****************/
  103.   printf("Please Enter The Filename of The System:");
  104.   gets(FILENAME);
  105.   if((fp=fopen(FILENAME,"r"))==NULL)
  106.   {
  107.     printf("Cannot Find The File:%sn",FILENAME);
  108.     printf("Press ENTER to Escape!");
  109.     exit(0);
  110.   }
  111.   /********************读系统基本数据信息*********************/
  112.   fscanf(fp,"%d,%d,%d,%d,%lf,%lf",&N,&Nb,&Ng,&Nl,&V0,&epsilon);
  113.   /*************给支路、发电机、负荷、PV节点分配内存**********/
  114.   Branch=malloc((Nb+1)*sizeof(struct Branch_Type));
  115.   Generator=malloc((Ng+1)*sizeof(struct Generator_Type));
  116.   Load=malloc((Nl+1)*sizeof(struct Load_Type));
  117.   PVNode=malloc(N*sizeof(struct PVNode_Type));
  118.   Datain(Nb,Nl,Ng,fp,Branch,Load,Generator,PVNode,&Npv);  /*从初始文件中读入数据*/
  119.   for(n=0;1;n++)  /*建立计算结果输出文件*/
  120.   {
  121.     if(FILENAME[n]=='.')
  122.     {
  123.         FILENAME[n]='';
  124.         strcat(FILENAME,"out.dat");
  125.         break;
  126.     }
  127.   }
  128.   if((fp=fopen(FILENAME,"w"))==NULL)  /*打开计算结果输出文件*/
  129.   {
  130.     printf("Cannot Find The File:%sn",FILENAME);
  131.     printf("Press ENTER to Escape!");
  132.     exit(0);
  133.   }
  134.   
  135.   /***********为导纳矩阵分配内存并形成导纳矩阵***************/
  136.   Yii=malloc((N+1)*sizeof(struct Yii_Type));
  137.   Yiil=malloc((N+1)*sizeof(struct Yii_Type));
  138.   Yij=malloc((N+1)*sizeof(struct Yij_Type));
  139.   Yijl=malloc((N+1)*sizeof(struct Yij_Type));
  140.   NYseq=malloc((N+1)*sizeof(int));
  141.   
  142.   AdmittanceMatrix(N,Nb,Yii,Yiil,Yij,Yijl,Branch,NYseq);  /*导纳矩阵形成函数*/
  143.   /*****形成因子表,采用BX方案(B'中忽略充电电容和非标准变比,B"中忽略电阻)*****/
  144.   U1=malloc((N-1)*(N-2)/2*sizeof(struct U_Type));
  145.   U2=malloc((N-1)*(N-2)/2*sizeof(struct U_Type));
  146.   D1=malloc(N*sizeof(double));
  147.   D2=malloc(N*sizeof(double));
  148.   NUsum1=malloc(N*sizeof(int));
  149.   NUsum2=malloc(N*sizeof(int));
  150.   Factorial(1,N,Npv,PVNode,NUsum1,Yii,Yij,NYseq,D1,U1);  /*形成因子表B'*/
  151.   AdmittanceMatrixAdd(Nb,Yii,Yiil,Yij,Yijl,Branch);  /*导纳矩阵追加接地支路函数*/
  152.   Factorial(2,N,Npv,PVNode,NUsum2,Yiil,Yijl,NYseq,D2,U2);  /*形成因子表B"*/
  153.   /****************下面利用所求得的因子表进行迭代求解******************/
  154.   DI1=malloc(N*sizeof(double));
  155.   DI2=malloc(N*sizeof(double));
  156.   NodePow=malloc((N+1)*sizeof(struct NodalPow));
  157.   NodeVol=malloc((N+1)*sizeof(struct NodalVol));
  158.   /********************先送电压初值***********************/
  159.   for(i=1;i<=N;i++)
  160.   {
  161.     NodeVol[i].V=V0;
  162.     NodeVol[i].theta=0.0;
  163.   }
  164.   for(n=1;n<=Npv;n++)
  165.   {
  166.     i=PVNode[n].i;
  167.     NodeVol[i].V=PVNode[n].V;
  168.   }
  169.     
  170.   GenPower=malloc((N+1)*sizeof(struct GeneratorPower));  
  171.    
  172.   fprintf(fp,"ttt系统潮流计算结果 n(1)迭代过程纪录:n迭代次数t    t有功迭代tt无功迭代ntt   ΔPmaxtP-Nodet ΔQmaxttQ-Noden");
  173.   
  174.   for(k=0;1;k++)
  175.   {
  176.     fprintf(fp,"  %2d:t",k);
  177.     if(Kp==1)
  178.     {
  179.         NodePower(1,N,NodeVol,NodePow,Yii,Yij,NYseq);  /*节点功率计算函数*/
  180.         Iteration(1,Generator,Load,PVNode,NodeVol,NodePow,GenPower,N,DI1,&MaxError,&ErrNode);  /*迭代计算函数*/
  181.         fprintf(fp,"t%10.7lft %dt",MaxError,ErrNode);
  182.         if(MaxError>=epsilon)
  183.             FormulaSolution(1,U1,D1,NUsum1,DI1,N,NodeVol,V0);  /*线性方程组求解函数*/
  184.         else
  185.             Kp=0;
  186.     }
  187.     else
  188.         fprintf(fp,"tttt");
  189.     if(Kq==1)
  190.     {
  191.         NodePower(2,N,NodeVol,NodePow,Yii,Yij,NYseq);  /*节点功率计算函数*/
  192.         Iteration(2,Generator,Load,PVNode,NodeVol,NodePow,GenPower,N,DI2,&MaxError,&ErrNode);  /*迭代计算函数*/
  193.         fprintf(fp,"%10.7lft %dn",MaxError,ErrNode);
  194.         if(MaxError>=epsilon)
  195.             FormulaSolution(2,U2,D2,NUsum2,DI2,N,NodeVol,V0);  /*线性方程组求解函数*/
  196.         else
  197.             Kq=0;
  198.     }
  199.     else
  200.         fprintf(fp,"n");
  201.     if(Kp==0&&Kq==0)
  202.         break;
  203.     if(k>1000)
  204.     {
  205.         fprintf(fp,"n迭代次数超过1000次,系统不收敛!n");
  206.     }
  207.     printf("...");
  208.   }
  209.   fprintf(fp,"n总迭代次数为: %d 次!nn",k+1);
  210.   fprintf(fp,"(2)潮流计算结果(节点电压):n NodettVttθttPttQn");
  211.   NodeDataOutput(fp,NodeVol,Generator,N,GenPower,NodePow,Load,Nl);
  212.   fprintf(fp,"n(3)潮流计算结果(支路功率):n    BranchttPttQn");
  213.   BranchDataOutput(fp,Nb,Branch,NodeVol);
  214.   fprintf(fp,"nnn");
  215.   fclose(fp);
  216.   free(Branch);
  217.   free(Generator);
  218.   free(Load);
  219.   free(PVNode);
  220.   free(Yii);
  221.   free(Yiil);
  222.   free(Yij);
  223.   free(Yijl);
  224.   free(NYseq);
  225.   free(U1);
  226.   free(U2);
  227.   free(D1);
  228.   free(D2);
  229.   free(NUsum1);
  230.   free(NUsum2);
  231.   free(DI1);
  232.   free(DI2);
  233.   free(NodePow);
  234.   free(NodeVol);
  235.   free(GenPower);
  236. }
  237. void Datain(int Nb,int Nl,int Ng,FILE *fp,struct Branch_Type *Branch,struct Load_Type *Load,struct Generator_Type *Generator,struct PVNode_Type *PVNode,int *Npv)
  238. {
  239.   int n;
  240.   /*********************从初始数据文件中读取支路、发电机、负荷数据************************/
  241.   for(n=1;n<=Nb;n++)
  242.   {
  243.     fscanf(fp,"%d,%d,%lf,%lf,%lf",&(Branch[n].i),&(Branch[n].j),&(Branch[n].R),&(Branch[n].X),&(Branch[n].YK));
  244.   }
  245.   for(n=1;n<=Ng;n++)
  246.   {
  247.     fscanf(fp,"%d,%lf,%lf,%lf",&(Generator[n].i),&(Generator[n].P),&(Generator[n].Q),&(Generator[n].V));
  248.     if((Generator[n].V)<0)
  249.     {
  250.         (*Npv)++;
  251.         PVNode[(*Npv)].i=Generator[n].i;
  252.         PVNode[(*Npv)].V=-(Generator[n].V);
  253.     }
  254.   }
  255.   for(n=1;n<=Nl;n++)
  256.   {
  257.     fscanf(fp,"%d,%lf,%lf,%lf",&(Load[n].i),&(Load[n].P),&(Load[n].Q),&(Load[n].V));
  258.     if((Load[n].V)<0)
  259.     {
  260.         (*Npv)++;
  261.         PVNode[(*Npv)].i=Load[n].i;
  262.         PVNode[(*Npv)].V=-(Load[n].V);
  263.     }
  264.   }
  265.   fclose(fp);            
  266. }
  267. 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)
  268. {
  269.   /*****************不考虑接地支路时,形成节点导纳矩阵******************/
  270.   int i,n;
  271.   int *NYsum=malloc((N+1)*sizeof(int));
  272.   int *NYseq=malloc((N+1)*sizeof(int));
  273.   for(i=1;i<=N;i++)
  274.   {
  275.     Yii[i].G=0.0;
  276.     Yii[i].B=0.0;
  277.     Yiil[i].G=0.0;
  278.     Yiil[i].B=0.0;
  279.     NYsum[i]=0;
  280.   }
  281.   for(n=1;n<=Nb;n++)
  282.   {
  283.     int i=abs(Branch[n].i);
  284.     int j=abs(Branch[n].j);
  285.     double R=(Branch[n].R);
  286.     double X=(Branch[n].X);
  287.     double YK=(Branch[n].YK);
  288.     double Zmag2=R*R+X*X;
  289.     double Gij=R/Zmag2;
  290.     double Bij=-X/Zmag2;
  291.     double b_ij=-1.0/X;
  292.     if((Branch[n].i<0)||(Branch[n].j<0))
  293.     {
  294.         Yij[n].G=-Gij/YK;
  295.         Yij[n].B=-Bij/YK;
  296.         Yijl[n].G=0.0;
  297.         Yijl[n].B=-b_ij/YK;
  298.     }
  299.     else
  300.     {
  301.         Yij[n].G=-Gij;
  302.         Yij[n].B=-Bij;
  303.         Yijl[n].G=0.0;
  304.         Yijl[n].B=-b_ij;
  305.     }
  306.     Yij[n].j=j;
  307.     Yijl[n].j=j;
  308.     if((Branch[n].i<0)||(Branch[n].j<0))
  309.     {
  310.         Yii[i].G=Yii[i].G+Gij/YK;
  311.         Yii[i].B=Yii[i].B+Bij/YK;
  312.         Yii[j].G=Yii[j].G+Gij/YK;
  313.         Yii[j].B=Yii[j].B+Bij/YK;
  314.         Yiil[i].B=Yiil[i].B+b_ij/YK;
  315.         Yiil[j].B=Yiil[j].B+b_ij/YK;
  316.     }
  317.     else
  318.     {
  319.         Yii[i].G=Yii[i].G+Gij;
  320.         Yii[i].B=Yii[i].B+Bij;
  321.         Yii[j].G=Yii[j].G+Gij;
  322.         Yii[j].B=Yii[j].B+Bij;
  323.         Yiil[i].B=Yiil[i].B+b_ij;
  324.         Yiil[j].B=Yiil[j].B+b_ij;
  325.     }
  326.     NYsum[i]+=1;
  327.   }
  328.   NYseq[1]=1;
  329.   for(i=1;i<=N-1;i++)
  330.   {
  331.     NYseq[i+1]=NYseq[i]+NYsum[i];
  332.   }
  333.   for(n=1;n<=N;n++)
  334.   {
  335.     NYseq1[n]=NYseq[n];
  336.   }
  337. }
  338. void AdmittanceMatrixAdd(int Nb,struct Yii_Type *Yii,struct Yii_Type *Yiil,struct Yij_Type *Yij,struct Yij_Type *Yijl,struct Branch_Type *Branch)
  339. {
  340.   int n;
  341.   /***********************在导纳矩阵中追加接地支路************************/
  342.   for(n=1;n<=Nb;n++)
  343.   {
  344.     int i=Branch[n].i;
  345.     int j=Branch[n].j;
  346.     double YK=Branch[n].YK;
  347.     if(!(i<0||j<0))
  348.     {
  349.         double Bij=YK/2.0;
  350.         double b_ij=YK/2.0;
  351.         Yii[i].B=Yii[i].B+Bij;
  352.         Yii[j].B=Yii[j].B+Bij;
  353.         Yiil[i].B=Yiil[i].B+b_ij;
  354.         Yiil[j].B=Yiil[j].B+b_ij;
  355.     }
  356.     else
  357.     {
  358.         double Gij;
  359.         double Bij;
  360.         double b_ij;
  361.         if(i<0)
  362.         {
  363.             i=abs(i);
  364.             Gij=Yij[n].G;
  365.             Bij=Yij[n].B;
  366.             b_ij=Yijl[n].B;
  367.             Yii[i].G=Yii[i].G+(1.0-1.0/YK)*Gij;
  368.             Yii[i].B=Yii[i].B+(1.0-1.0/YK)*Bij;
  369.             Yiil[i].B=Yiil[i].B+(1.0-1.0/YK)*b_ij;
  370.             Yii[j].G=Yii[j].G+(1.0-YK)*Gij;
  371.             Yii[j].B=Yii[j].B+(1.0-YK)*Bij;
  372.             Yiil[j].B=Yiil[j].B+(1.0-YK)*b_ij;
  373.         }
  374.         else
  375.         {
  376.             j=abs(j);
  377.             Gij=Yij[n].G;
  378.             Bij=Yij[n].B;
  379.             b_ij=Yijl[n].B;
  380.             Yii[j].G=Yii[j].G+(1.0-1.0/YK)*Gij;
  381.             Yii[j].B=Yii[j].B+(1.0-1.0/YK)*Bij;
  382.             Yiil[j].B=Yiil[j].B+(1.0-1.0/YK)*b_ij;
  383.             Yii[i].G=Yii[i].G+(1.0-YK)*Gij;
  384.             Yii[i].B=Yii[i].B+(1.0-YK)*Bij;
  385.             Yiil[i].B=Yiil[i].B+(1.0-YK)*b_ij;
  386.         }
  387.     }
  388.   }
  389. }
  390. 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)
  391. {
  392.   /**************************因子表形成函数***************************/
  393.   int n_pv,i_pv,j,n_u,i_above;
  394.   int i,count;
  395.   double *B=malloc((N+1)*sizeof(double));
  396.   double Btemp;
  397.   n_pv=1;
  398.   i_pv=PVNode[1].i;
  399.   
  400.   for(i=1;i<N;i++)
  401.   {
  402.     if((flag==2)&&(i==i_pv))
  403.     {
  404.         n_pv++;
  405.         i_pv=PVNode[n_pv].i;
  406.         NUsum[i]=0;
  407.         D[i]=0.0;
  408.         continue;
  409.     }
  410.     else
  411.     {
  412.         for(count=i+1;count<N;count++)
  413.             B[count]=0.0;
  414.         
  415.         B[i]=Yii[i].B;
  416.         
  417.         for(count=NYseq[i];count<NYseq[i+1];count++)
  418.         {
  419.             j=Yij[count].j;
  420.             B[j]=Yij[count].B;
  421.         }
  422.         
  423.         if(flag==2)
  424.         {
  425.             for(count=1;count<=Npv;count++)
  426.             {
  427.                 j=PVNode[count].i;
  428.                 B[j]=0.0;
  429.             }
  430.             
  431.         }
  432.         
  433.         n_u=1;
  434.         i_above=1;
  435.         
  436.         while(i_above<=(i-1))
  437.         {
  438.             count=1;
  439.             
  440.             while(count<=NUsum[i_above])
  441.             {
  442.                 if(U[n_u].j==i)
  443.                 {   
  444.                     
  445.                     Btemp=U[n_u].value/D[i_above];
  446.                     while(count<=NUsum[i_above])
  447.                     {
  448.                         j=U[n_u].j;
  449.                         B[j]=B[j]-Btemp*U[n_u].value;
  450.                         count++;
  451.                         n_u++;
  452.                     }
  453.                     break;
  454.                 }
  455.                 count++;
  456.                 n_u++;
  457.             }
  458.             i_above++;
  459.         }
  460.         
  461.         Btemp=1.0/B[i];        
  462.         D[i]=Btemp;
  463.         count=0;
  464.         for(j=i+1;j<N;j++)
  465.         {
  466.             if(B[j]!=0.0)
  467.             {   
  468.                 U[n_u].value=B[j]*Btemp;
  469.                 U[n_u].j=j;
  470.                 count++;
  471.                 n_u++;
  472.             }
  473.         }
  474.         NUsum[i]=count;
  475.     }
  476.   }
  477.  free(B);
  478. }
  479. void NodePower(int flag,int N,struct NodalVol *NodeVol,struct NodalPow *NodePow,struct Yii_Type *Yii,struct Yij_Type *Yij,int *NYseq)
  480. {
  481. /*********************计算各节点功率函数**********************/
  482.   double A,B,Vi;
  483.   int i,n,j;
  484.   double VV,theta;
  485.   for(i=1;i<=N;i++)
  486.   {
  487.     if(flag==1)
  488.         NodePow[i].P=0.0;
  489.     else
  490.         NodePow[i].Q=0.0;
  491.   }
  492.   for(i=1;i<=N;i++)
  493.   {
  494.     Vi=NodeVol[i].V;
  495.     if(flag==1)
  496.     {
  497.         A=Yii[i].G;
  498.     }
  499.     else
  500.     {
  501.         A=-Yii[i].B;
  502.     }
  503.         
  504.     if(flag==1)
  505.         NodePow[i].P+=Vi*Vi*A;
  506.     else
  507.         {NodePow[i].Q+=Vi*Vi*A;}
  508.         
  509.     if(i==N)
  510.     {
  511.         break;
  512.     }
  513.     else
  514.     {
  515.         for(n=NYseq[i];n<=NYseq[i+1]-1;n++)
  516.         {
  517.             if(flag==1)
  518.             {
  519.                 A=Yij[n].G;
  520.                 B=Yij[n].B;
  521.             }
  522.             else
  523.             {
  524.                 A=-Yij[n].B;
  525.                 B=Yij[n].G;
  526.             }
  527.             j=Yij[n].j;
  528.             VV=Vi*NodeVol[j].V;
  529.             theta=NodeVol[i].theta-NodeVol[j].theta;
  530.             A=A*VV*cos(theta);
  531.             B=B*VV*sin(theta);
  532.             if(flag==1)
  533.             {
  534.                 NodePow[i].P+=(A+B);
  535.                 NodePow[j].P+=(A-B);
  536.             }
  537.             else
  538.             {
  539.                 NodePow[i].Q+=(A+B);
  540.                 NodePow[j].Q+=(A-B);
  541.             }
  542.         }
  543.     }
  544.   }
  545. }
  546. void Iteration(int flag,struct Generator_Type *Generator,struct Load_Type *Load,struct PVNode_Type *PVNode,struct NodalVol *NodeVol,struct NodalPow *NodePow,struct GeneratorPower *GenPower,int N,double *DI,double *MaxError,int *ErrNode)
  547. {
  548.   /*****************迭代计算函数*****************/
  549.   int i=1,n_g=1,n_l=1,n_pv=1,i_g=Generator[1].i,i_l=Load[1].i,i_pv=PVNode[1].i;
  550.   double Vi,Wi,Wtemp;
  551.   (*MaxError)=0.0;
  552.     
  553.  do
  554.   {
  555.     Vi=NodeVol[i].V;
  556.     if(i==i_l)      
  557.     {
  558.         if(flag==1)
  559.         {
  560.             Wi=Load[n_l].P;
  561.         }
  562.         else
  563.         {
  564.             Wi=Load[n_l].Q;
  565.         }
  566.         n_l+=1;
  567.         i_l=Load[n_l].i;
  568.     }
  569.     else
  570.     {
  571.         Wi=0.0;
  572.     }
  573.     Wtemp=Wi;
  574.     if(flag==1)
  575.         Wi=Wi-NodePow[i].P;
  576.     else
  577.         Wi=Wi-NodePow[i].Q;
  578.     if(i==i_g)
  579.     {
  580.         if(flag==1)
  581.         {
  582.             NodePow[i].P=Wtemp;
  583.             GenPower[i_g].P=-Wi;
  584.         }
  585.         else
  586.         {
  587.             NodePow[i].Q=Wtemp;
  588.             GenPower[i_g].Q=-Wi;
  589.         }
  590.         if(flag==1)
  591.         {
  592.             Wi+=Generator[n_g].P;
  593.         }
  594.         else
  595.         {
  596.             Wi+=Generator[n_g].Q;
  597.         }
  598.         n_g+=1;
  599.         i_g=Generator[n_g].i;
  600.     }
  601.     if(i==N)
  602.     {
  603.         break;                 
  604.     }
  605.     else
  606.     {
  607.         if(flag==2&&i==i_pv)
  608.         {
  609.             n_pv+=1;
  610.             i_pv=PVNode[n_pv].i;
  611.             DI[i]=0.0;
  612.         }
  613.         else
  614.         {
  615.             if(fabs(Wi)>(*MaxError))
  616.             {
  617.                 (*MaxError)=fabs(Wi);
  618.                 (*ErrNode)=i;
  619.             }
  620.                 
  621.             DI[i]=Wi/Vi;
  622.         }
  623.     }
  624.     i+=1;
  625.   }while(1);
  626. }
  627. void FormulaSolution(int flag,struct U_Type *U,double *D,int *NUsum,double *DI,int N,struct NodalVol *NodeVol,double V0)
  628. {
  629.   /******************进行线性方程组的求解********************/
  630.   int n_u;
  631.   int i,count;
  632.   int j;
  633.   double DItemp,Dtheta,DV;
  634.   n_u=1;
  635.     
  636.   for(i=1;i<=N-1;i++)
  637.   {
  638.     DItemp=DI[i];
  639.     for(count=1;count<=NUsum[i];count++)
  640.     {
  641.         j=U[n_u].j;
  642.         DI[j]=DI[j]-DItemp*U[n_u].value;
  643.         n_u++;
  644.     }
  645.     DI[i]=DItemp*D[i];
  646.   }
  647.   for(i=N-1;i>=1;i--)
  648.   {
  649.     DItemp=DI[i];
  650.     for(count=1;count<=NUsum[i];count++)
  651.     {
  652.         n_u-=1;
  653.         j=U[n_u].j;
  654.         DItemp=DItemp-DI[j]*U[n_u].value;
  655.     }
  656.     DI[i]=DItemp;
  657.   }
  658.   for(i=1;i<=N-1;i++)
  659.   {
  660.     if(flag==1)
  661.     {
  662.         Dtheta=DI[i]/V0;
  663.         NodeVol[i].theta=NodeVol[i].theta-Dtheta;
  664.     }
  665.     else
  666.     {
  667.         DV=DI[i];
  668.         NodeVol[i].V-=DV;
  669.     }
  670.   }
  671. }
  672. void NodeDataOutput(FILE *fp,struct NodalVol *NodeVol,struct Generator_Type *Generator,int N,struct GeneratorPower *GenPower,struct NodalPow *NodePow,struct Load_Type *Load,int Nl)
  673. {
  674.   /***************节点数据输出**********************/
  675.   double Vmin=NodeVol[1].V;
  676.   double V,theta,P,Q;
  677.   int i_g=Generator[1].i;
  678.   int VminNode=1;
  679.   int n_g=1;
  680.   int i;
  681.     
  682.   for(i=1;i<=N;i++)
  683.   {
  684.     theta=NodeVol[i].theta/3.14159*180;
  685.     V=NodeVol[i].V;
  686.     if(V<Vmin)
  687.     {
  688.         Vmin=V;
  689.         VminNode=i;
  690.     }
  691.     if(i==i_g)
  692.     {
  693.         P=GenPower[i].P;
  694.         Q=GenPower[i].Q;
  695.         n_g+=1;
  696.         i_g=Generator[n_g].i;
  697.     }
  698.     else
  699.     {
  700.         P=0.0;
  701.         Q=0.0;
  702.     }
  703.     if(i!=N)
  704.         fprintf(fp,"  %dt   %10.7lft   %10.7lft  %10.7lft  %10.7lfn",i,V,theta,P,Q);
  705.     else
  706.         fprintf(fp,"  %dt   %10.7lft   %10.7lft  %10.7lft  %10.7lfn",i,V,theta,NodePow[i].P-Load[Nl].P,NodePow[i].Q-Load[Nl].Q);
  707.   }
  708.     fprintf(fp,"系统最低电压=%10.7lf,节点=%dn",Vmin,VminNode);
  709. }
  710. void BranchDataOutput(FILE *fp,int Nb,struct Branch_Type *Branch,struct NodalVol *NodeVol)
  711. {
  712.   /***************支路数据输出***************/
  713.   double PLoss=0.0,QLoss=0.0;
  714.   int n;
  715.   int i,j;
  716.   double R,X,YK,Y,theta,Ei,Ej,Fi,Fj,Vi,Vj,DE,DF;
  717.   double Zmag2,Ir,Ii;
  718.   double Pij,Qij,Pji,Qji;
  719.   for(n=1;n<=Nb;n++)
  720.   {
  721.     i=abs(Branch[n].i);
  722.     j=abs(Branch[n].j);
  723.     R=Branch[n].R;
  724.     X=Branch[n].X;
  725.     YK=Branch[n].YK;
  726.     Vi=NodeVol[i].V;
  727.     theta=NodeVol[i].theta;
  728.     Ei=Vi*cos(theta);
  729.     Fi=Vi*sin(theta);
  730.     Vj=NodeVol[j].V;
  731.     theta=NodeVol[j].theta;
  732.     Ej=Vj*cos(theta);
  733.     Fj=Vj*sin(theta);
  734.             
  735.     if(Branch[n].i<0||Branch[n].j<0)
  736.     {
  737.         if(Branch[n].i<0)
  738.         {
  739.             Ei=Ei/YK;
  740.             Fi=Fi/YK;
  741.         }
  742.         else
  743.         {
  744.             Ej=Ej/YK;
  745.             Fj=Fj/YK;
  746.         }
  747.         YK=0.0;
  748.     }
  749.             
  750.     DE=Ei-Ej;
  751.     DF=Fi-Fj;
  752.     Zmag2=R*R+X*X;
  753.     Ir=(DE*R+DF*X)/Zmag2;
  754.     Ii=(DF*R-DE*X)/Zmag2;
  755.             
  756.     Pij=Ir*Ei+Ii*Fi;
  757.     Qij=Ir*Fi-Ii*Ei;
  758.             
  759.     Pji=-(Ir*Ej+Ii*Fj);
  760.     Qji=-(Ir*Fj-Ii*Ej);
  761.             
  762.     Qij-=(Vi*Vi*YK/2.0);
  763.     Qji-=(Vj*Vj*YK/2.0);
  764.             
  765.     PLoss=PLoss+Pij+Pji;
  766.     QLoss=QLoss+Qij+Qji;
  767.             
  768.     fprintf(fp,"  %3d->%3dt   %10.7lft   %10.7lfn  %3d->%3dt   %10.7lft   %10.7lfn",i,j,Pij,Qij,j,i,Pji,Qji);
  769.   }
  770.   fprintf(fp,"     损耗t   %10.7lft   %10.7lfn",PLoss,QLoss);
  771. }