电力系统潮流计算方法
2007年01月03日 星期三 09:57 P.M.
电力系统潮流计算
——9结点算例-PQ法
原始数据录入data.txt文档:
标号,起始结点,终止结点,支路电阻参数,支路电抗参数,支路对地导纳参数 1,2,5,0.0,0.063,0.0,
2,5,9,0.019,0.072,0.075, 3,6,9,0.012,0.101,0.105, 4,3,6,0.0,0.059,0.0, 5,6,8,0.039,0.17,0.179,
6,4,8,0.017,0.092,0.079, 7,5,7,0.032,0.161,0.153, 8,4,7,0.01,0.085,0.088, 9,1,4,0.0,0.058,0.0, 潮流程序chaoliu.txt文档:
#include
#define N 9 /*总结点数*/ #define M 6 /*PQ结点数*/ #define K 9 /*线路数*/ #define eps 1e-4
void guass(int n,int m,float c[],float b[][N],float x[]) /*高斯函数*/ {
float a[N][N],y[N]; int i,j,k;
for(i=0;i y[i]=c[i]; for(j=0;j for(k=0;k for(i=k+1;i for(j=k+1;j for(i=m-1;i>=0;i--) { for(j=i+1;j struct line {int Lindex; int Headnode; int Endnode; float R; float X; float b; }line[K]; struct line *t; main() { float r[N]={0.0}; float u[N]={1.04,1.025,1.025,1.0,1.0,1.0,1.0,1.0,1.0}; float p[N]={1,1.63,0.85,0.0,0.0,0.0,-1.25,-0.9,-1.0}; float q[N]={1,1,1,0.0,0.0,0.0,-0.5,-0.3,-0.35}; float g[N][N]={0.0},b[N][N]={0.0}; float h[N][N]={0.0}; float B[N][N]={0.0}; float temp; float H[K][6]; float lr,lx,lb1,lg,lb; int i,j; int ku=0,kr=0,kp=1,kq=1; void val(float u[N],float g[N][N],float b[N][N],float r[N],int ku, int kr,float h[N][N]); /*函数申明*/ FILE *fp; fp=fopen(\ for(i=0;i for(j=0;j<6;j++) { fscanf(fp,\ H[i][j]=temp; } } fclose(fp); for(i=0;i line[i].Lindex=(int)H[i][0];line[i].Headnode=(int)H[i][1];line[i].Endnode=(int)H[i][2]; line[i].R=H[i][3];line[i].X=H[i][4];line[i].b=H[i][5];} for(t=line;t lb1=t->b; lg=lr/(lr*lr+lx*lx); lb=-lx/(lr*lr+lx*lx); g[i][i]+=lg; g[j][j]+=lg; b[i][i]+=lb+lb1; b[j][j]+=lb+lb1; h[i][j]=h[j][i]=-lb1; g[i][j]-=lg; g[j][i]-=lg; b[i][j]-=lb; b[j][i]-=lb; } getch(); printf(\ for(i=0;i for(j=0;j B[i][j]=b[i][j]; printf(\ } printf(\ } printf(\ getch(); printf(\ for(i=0;i printf(\,u[i],i+1,p[i],i+1,q[i]); printf(\ while(kp==1) { float ip,iq,max; float dp[N],dq[N],dr[N]; float dpu[N],dqu[N]; float y1[N-1],y2[M]; float x1[N-1],x2[M]; for(i=1;i ip=0; for(j=0;j ip=ip+u[j]*(g[i][j]*cos(r[i]-r[j])+b[i][j]*sin(r[i]-r[j])); dp[i]=p[i]-u[i]*ip; dpu[i]=dp[i]/u[i]; printf(\ printf(\ } getch(); max=fabs(dpu[1]); for(i=1;i if(fabs(dpu[i])>max) max=fabs(dpu[i]); } if (max>=eps) { for(i=0;i y1[i]=-dpu[i+1]; /*起值不同,为了对应,故加一*/ guass(1,N-1,y1,B,x1); for (i=1;i dr[i]=x1[i-1]/u[i]; r[i]=r[i]+dr[i]; } printf(\jiao chu zhi =====\\n\ for(i=1;i printf(\ getch(); printf(\ kr=kr+1;kq=1; top: for(i=N-M;i { iq=0; for(j=0;j iq=iq+u[j]*(g[i][j]*sin(r[i]-r[j])-b[i][j]*cos(r[i]-r[j])); dq[i]=q[i]-u[i]*iq; dqu[i]=dq[i]/u[i]; printf(\ printf(\ } max=fabs(dqu[N-M]); for (i=N-M;i { if(fabs(dqu[i])>max) max=fabs(dqu[i]); } if(max>=eps) { for(i=0;i y2[i]=-dqu[i+N-M]; /*同上,对应加N-M*/ guass(N-M,M,y2,B,x2); for(i=N-M;i u[i]=u[i]+x2[i-(N-M)]; printf(\zhi=====\\n\ for(i=N-M;i printf(\ printf(\ ku=ku+1;kp=1; } else { kq=0; if(kp==0) val(u,g,b,r,ku,kr,h); } } else { kp=0; if(kq==0) val(u,g,b,r,ku,kr,h); else goto top; } } } void val(float u[N],float g[N][N],float b[N][N],float r[N],int ku, int kr,float h[N][N]) { float ps=0,pv1=0,pv2=0; float qs=0,qv1=0,qv2=0; float p[N][N]={0}; float q[N][N]={0}; float s[N][N]; float dp[N][N]={0}; float dq[N][N]={0}; float ds[N][N]; float dSp=0,dSq=0; int i,j; FILE *fp1; printf(\ getch(); for(i=0;i ps=ps+u[0]*u[i]*(g[0][i]*cos(r[0]-r[i])+b[0][i]*sin(r[0]-r[i])); qs=qs+u[0]*u[i]*(g[0][i]*sin(r[0]-r[i])-b[0][i]*cos(r[0]-r[i])); } printf(\ printf(\ getch(); for(i=0;i pv1=pv1+u[1]*u[i]*(g[1][i]*cos(r[1]-r[i])+b[1][i]*sin(r[1]-r[i])); qv1=qv1+u[1]*u[i]*(g[1][i]*sin(r[1]-r[i])-b[1][i]*cos(r[1]-r[i])); } printf(\ for(i=0;i pv2=pv2+u[2]*u[i]*(g[2][i]*cos(r[2]-r[i])+b[2][i]*sin(r[2]-r[i])); qv2=qv2+u[2]*u[i]*(g[2][i]*sin(r[2]-r[i])-b[2][i]*cos(r[2]-r[i])); } printf(\ for(i=0;i p[i][j]=u[i]*u[i]*(-g[i][j])+u[i]*u[j]*(g[i][j]*cos(r[i]-r[j])+b[i][j]*sin(r[i]-r[j])); q[i][j]=u[i]*u[i]*(-h[i][j]+b[i][j])+u[i]*u[j]*(g[i][ j]*sin(r[i]-r[j])-b[i][j]*cos(r[i]-r[j])); dp[i][j]=u[i]*u[i]*(-g[i][j])+u[i]*u[j]*(g[i][j]*cos(r[i]-r[j])+b[i][j]*sin(r[i]-r[j])) +u[j]*u[j]*(-g[j][i])+u[j]*u[i]*(g[j][i]*cos(r[j]-r[i])+b[j][i]*sin(r[j]-r[i])); dq[i][j]=u[i]*u[i]*(-h[i][j]+b[i][j])+u[i]*u[j]*(g[i][j]*sin(r[i]-r[j])-b[i][j]*cos(r[i]-r[j])) +u[j]*u[j]*(-h[j][i]+b[j][i])+u[j]*u[i]*(g[j][i]*sin(r[j]-r[i])-b[j][i]*cos(r[j]-r[i])); } printf(\======\\n\ getch(); for(i=0;i printf(\r[%d]=?\\n\ printf(\ for(i=0;i getch(); { for(j=0;j { printf(\ printf(\ } printf(\ } } printf(\ printf(\ for(i=0;i getch(); { for(j=i+1;j { printf(\ printf(\ } printf(\ } } printf(\ printf(\ getch(); for(i=0;i for(j=i+1;j { dSp+=dp[i][j]; dSq+=dq[i][j]; } } printf(\ printf(\ printf(\ printf(\ printf(\ fp1=fopen(\ { fprintf(fp1,\ for(i=0;i for(j=0;j } fprintf(fp1,\ fprintf(fp1,\ for(i=0;i for(j=i+1;j fprintf(fp1,\j]); } fprintf(fp1,\ fprintf(fp1,\ fprintf(fp1,\ fprintf(fp1,\ fprintf(fp1,\ fprintf(fp1,\ fprintf(fp1,\ fprintf(fp1,\ fprintf(fp1,\ fprintf(fp1,\ fprintf(fp1,\ fprintf(fp1,\ for(i=0;i fprintf(fp1,\,r[i]); } printf(\ getch();fprintf(fp1,\ } 电力系统潮流计算程序 2007年05月11日 星期五 08:14 P.M. 电力系统潮流计算 注:这是一个基于N-R法的潮流计算通用程序,仅提供了子程序,需要做些处理才能成为一个可运行的计算程序!此程序非我原创,仅与大家共享!!! /******************************************************************* * 这里提供的是电力系统潮流计算机解法的五个子程序,采用的方法是 * * Newton_Raphson 法. * * 程序中所用的变量说明如 下: * * N:网络节点总数. M:网络的PQ节点数. * * L:网络的支路总数. N0:雅可比矩阵的行数. * * N1:N0+1 K:打印开关.K=1,则打印;否则,不打印.* * K1:子程序PLSC中判断输入电压的形式.K1=1,则为极座标形式.否则* * 为直角坐标形 式. * * D:有功及无功功率误差的最大值. * * G(I,J):Ybus的电导元素(实部). * * B(I,J):Ybus的电纳元素(虚部). * * G1(I) :第I支路的串联电导. B1(I):第I支路的串联电纳. * * C1(I) :第I支路的pie型对称接地电纳. * * C(I,J):第I节点J支路不对称接地电纳. * * CO(I) :第I节点的接地电 纳. * * S1(I) :第I节点的起始节点号. E1(I):第I节点的终止节点号. * * P(I) :第I节点的注入有功功率. Q(I):第I节点的注入无功功率.* * P0(I) :第I节点有功功率误差. Q0(I):第I节点无功功率误差. * * V0(I) :第I节点(PV节点)的电压误差(平方误差). * * V(I) :第I节点的电压误差幅值. * * E(I) :第I节点的电压的实部. F(I):第I节点的电压的虚部. * * JM(I,J):Jacoby矩阵的第I行J列元素. * * A(I,J):修正方程的增广矩阵,三角化矩阵的第I行J列元素,运算结 * * 束后A矩阵的最后一列存放修正的解. * * P1(I) :第I支路由S1(I)节点注入的有功功率. * * Q1(I) :第I支路由S1(I)节点注入的无功功率. * * P2(I) :第I支路由E1(I)节点注入的有功功率. * * Q2(I) :第I支路由E1(I)节点注入的无功功率. * * P3(I) :第I支路的有功功率损耗. * * Q3(I) :第I支路的无功功率损耗. * * ANGLE(I):第I节点电压的角 度. * *******************************************************************/ #include #define f1(i) (i-1) /* 把习惯的一阶矩阵的下标转化为C语言数组下标*/ #define f2(i,j,n) ((i-1)*(n)+j-1) /* 把习惯的二阶矩阵的下标转化为C语言数组下标*/ /**************************************************** * 本子程序根据所给的支路导纳及有关信息,形成结点 * * 导纳矩阵,如打印参数K=1,则输出电导矩阵G和电纳矩B * ****************************************************/ void ybus(int n,int l,int m,float *g,float *b,float *g1,float *b1,float *c1,\\ float *c,float *co,int k,int *s1,int *e1) { extern FILE *file4; FILE *fp; int i,j,io,i0; int pos1,pos2; int st,en; if(file4==NULL) { fp=stdout; } else { fp=file4; /* 输出到文件 */ } /* 初始化矩阵G,B */ for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { pos2=f2(i,j,n); g[pos2]=0;b[pos2]=0; } } /* 计算支路导纳 */ for(i=1;i<=l;i++) { /* 计算对角元 */ pos1=f1(i); st=s1[pos1];en=e1[pos1]; pos2=f2(st,st,n); g[pos2]+=g1[pos1]; b[pos2]+=b1[pos1]+c1[pos1]; pos2=f2(en,en,n); g[pos2]+=g1[pos1]; b[pos2]+=b1[pos1]+c1[pos1]; /* 计算非对角元 */ pos2=f2(st,en,n); g[pos2]-=g1[pos1]; b[pos2]-=b1[pos1]; g[f2(en,st,n)]=g[f2(st,en,n)]; b[f2(en,st,n)]=b[f2(st,en,n)]; } /* 计算接地支路导纳 */ for(i=1;i<=n;i++) { /* 对称部分 */ b[f2(i,i,n)]+=co[f1(i)]; /* 非对称部分 */ for(j=1;j<=l;j++) { b[f2(i,i,n)]+=c[f2(i,j,l)]; } } if(k!=1) { return; /* 如果K不为 1,则返回;否则,打印导纳矩阵 */ } fprintf(fp,\ fprintf(fp,\for(io=1;io<=n;io+=5) { i0=(io+4)>n?n:(io+4); fprintf(fp,\ for(j=io;j<=i0;j++) { fprintf(fp,\ } for(i=1;i<=n;i++) { fprintf(fp,\ for(j=io;j<=i0;j++) { fprintf(fp,\ } } fprintf(fp,\} fprintf(fp,\for(io=1;io<=n;io+=5) { i0=(io+4)>n?n:(io+4); fprintf(fp,\ for(j=io;j<=i0;j++) { fprintf(fp,\ } for(i=1;i<=n;i++) { fprintf(fp,\ for(j=io;j<=i0;j++) { fprintf(fp,\ } } fprintf(fp,\} fprintf(fp,\} /******************************************* * 本子程序根据所给的功率及电压等数据 * * 求出功率及电压误差量,并返回最大有功功率 * * 以用于与给定误差比较.如打印参数K=1,则输 * * 出P0,Q0(对PQ结点),V0(对PV结点). * *******************************************/ void dpqc(float *p,float *q,float *p0,float *q0,float *v,float *v0,int m,\\ int n,float *e,float *f,int k,float *g,float *b,float *dd) { extern FILE *file4; FILE *fp; int i,j,l; int pos1,pos2; float a1,a2,d1,d; if(file4==NULL) { fp=stdout; /* 输出到屏幕 */ } else { fp=file4; /* 输出到文件 */ } l=n-1; if(k==1) { fprintf(fp,\\ fprintf(fp,\} for(i=1;i<=l;i++) { a1=0;a2=0; pos1=f1(i); for(j=1;j<=n;j++) { /* a1,a2对应课本p185式(4-86)中括号内的式子 */ pos2=f2(i,j,n); a1+=g[pos2]*e[f1(j)]-b[pos2]*f[f1(j)]; a2+=g[pos2]*f[f1(j)]+b[pos2]*e[f1(j)]; } /* 计算式(4-86)(4-87)中的deltaPi */ p0[pos1]=p[pos1]-e[pos1]*a1-f[pos1]*a2; if(i <= m) { /* 计算PQ结点中的deltaQi */ q0[pos1]=q[pos1]-f[pos1]*a1+e[pos1]*a2; } else { /* 计算PV结点中的deltaVi平方 */ v0[pos1]=v[pos1]*v[pos1]-e[pos1]*e[pos1]-f[pos1]*f[pos1]; } /* 输出结果 */ if(k==1) { if(i fprintf(fp,\ } else if(i==m) { fprintf(fp,\ fprintf(fp,\ } else { fprintf(fp,\ } } } /* 找到deltaP和deltaQ中的最小者,作为收敛指标, 存在dd中 */ d=0; for(i=1;i<=l;i++) { pos1=f1(i); d1=p0[pos1]>0 ? p0[pos1] : -p0[pos1]; if(d d=d1; } if(i<=m) { d1=q0[pos1]>0?q0[pos1]:-q0[pos1]; if(d d=d1; } } } (*dd)=d; } /*************************************************** * 本子程序根据节点导纳及电压求Jacoby矩阵,用于求* * 电压修正量,如打印参数K=1,则输出Jacoby矩阵. * * 对应于课本P186式(4-89)(4-90) * ***************************************************/ void jmcc(int m,int n,int n0,float *e,float *f,float *g,float *b,float *jm,int k) { extern FILE *file4; FILE *fp; int i,j,i1,io,i0,ns; int pos1,pos2; if(file4==NULL) { fp=stdout; } else { fp=file4; } /* 初始化矩阵jm */ for(i=1;i<=n0;i++) { for(j=1;j<=n0;j++) { jm[f2(i,j,n0)]=0; } } ns=n-1; /* 去掉一个平衡结点 */ /* 计算式(4-89)(4-90) */ for(i=1;i<=ns;i++) { /* 计算式(4-90) */ for(i1=1;i1<=n;i1++) { /* pos1是式(4-90)中的j */ pos1=f1(i1); /* pos2是式(4-90)中的ij */ pos2=f2(i,i1,n); if(i<=m) /* i是PQ结点 */ { /* 计算式(4-90)中的Jii等式右侧第一部分 */ jm[f2(2*i-1,2*i-1,n0)]+=g[pos2]*f[pos1]+b[pos2]*e[pos1]; /* 计算式(4-90)中的Lii等式右侧第一部分 */ jm[f2(2*i-1,2*i,n0)]+=-g[pos2]*e[pos1]+b[pos2]*f[pos1]; } /* 计算式(4-90)中的Hii等式右侧第一部分 */ jm[f2(2*i,2*i-1,n0)]+=-g[pos2]*e[pos1]+b[pos2]*f[pos1]; /* 计算式(4-90)中的Nii等式右侧第一部分 */ jm[f2(2*i,2*i,n0)]+=-g[pos2]*f[pos1]-b[pos2]*e[pos1]; } /* pos2是式(4-90)中的ii */ pos2=f2(i,i,n); /* pos1是式(4-90)中的i */ pos1=f1(i); if(i<=m) /* i是PQ结点 */ { /* 计算式(4-90)中的Jii */ jm[f2(2*i-1,2*i-1,n0)]+=-g[pos2]*f[pos1]+b[pos2]*e[pos1]; /* 计算式(4-90)中的Lii */ jm[f2(2*i-1,2*i,n0)]+=g[pos2]*e[pos1]+b[pos2]*f[pos1]; } /* 计算式(4-90)中的Hii */ jm[f2(2*i,2*i-1,n0)]+=-g[pos2]*e[pos1]-b[pos2]*f[pos1]; /* 计算式(4-90)中的Jii */ jm[f2(2*i,2*i,n0)]+=-g[pos2]*f[pos1]+b[pos2]*e[pos1]; if(i>m) /* PV结点 */ { /* 计算式(4-90)中的Rii */ jm[f2(2*i-1,2*i-1,n0)]=-2*e[pos1]; /* 计算式(4-90)中的Sii */ jm[f2(2*i-1,2*i,n0)]=-2*f[pos1]; } /* 计算式(4-89) */ for(j=1;j<=ns;j++) { if(j!=i) { /* pos1是式(4-89)中的i */ pos1=f1(i); /* pos2是式(4-89)中的ij */ pos2=f2(i,j,n); /* 计算式(4-89)中的Nij */ jm[f2(2*i,2*j,n0)]=b[pos2]*e[pos1]-g[pos2]*f[pos1]; /* 计算式(4-89)中的Hij */ jm[f2(2*i,2*j-1,n0)]=-g[pos2]*e[pos1]-b[pos2]*f[pos1]; if(i<=m) /* i是PQ结点 */ { /* 计算式(4-89)中的Lij (=-Hij) */ jm[f2(2*i-1,2*j,n0)]=-jm[f2(2*i,2*j-1,n0)]; /* 计算式(4-89)中的Jij (=Nij) */ jm[f2(2*i-1,2*j-1,n0)]=jm[f2(2*i,2*j,n0)]; } else /* i是PV结点 */ { /* 计算式(4-89)中的Rij (=0) */ jm[f2(2*i-1,2*j-1,n0)]=0; /* 计算式(4-89)中的Sij (=0) */ jm[f2(2*i-1,2*j,n0)]=0; } } } } if(k!=1) { return; } /* 输出Jacoby矩阵 */ fprintf(fp,\for(io=1;io<=n0;io+=5) { i1=(io+4)>n0?n0:(io+4); fprintf(fp,\ for(j=io;j<=i1;j++) { fprintf(fp,\ } for(i=1;i<=n0;i++) { fprintf(fp,\ for(j=io;j<=i1;j++) { fprintf(fp,\ } } } fprintf(fp,\} /********************************************** * 本子程序用选列主元素的高斯消元法求解组 * * 性方程组求各结点电压修正量,如打印参数K=1,则* * 输出增广矩阵变换中的上三角及电压修正量.如果* * 无唯一解,则给出信息,并停止程序运行. * **********************************************/ void sevc ( float a[], int n0, int k, int n1) { extern FILE *file4; FILE *fp; int i,j,l,n2,n3,n4,i0,io,j1,i1; float t0,t,c; if(file4==NULL) fp=stdout; else fp=file4; for(i=1;i<=n0;i++) { l=i; for(j=i;j<=n0;j++) { if( fabs(a[f2(j,i,n1)]) > fabs(a[f2(l,i,n1)]) ) { l=j; /* 找到这行中的最大元 */ } } 十字链表在电力系统潮流计算中的应用 来源: 时间:2006-12-04 字体:[ 大 中 小 ] 投稿 摘要:通常电力系统的潮流计算过程中是使用压缩的数组来存储网络的拓扑结构信息,并将此数组直接应用于计算中。本文提出的方法可以动态形成十字链表,同时存储网络的拓扑结构信息和参数信息,适合于电力系统中运行方式变化及故障等情况下对网络结构的修改。 关键词:十字链表;潮流计算;电力系统 中图分类号:O24;TM744文献标识码:B文章编号:1006-6047(1999)06-0031-03 在上海电力局2020年规划设计中,要对多种运行方式及网架结构进行计算。在计算过程中发现:如果采用通常的压缩数组存储方法,需要进行大量的修改工作。因此本文提出十字链表方法,将网络的拓扑结构与数值信息存于十字链表中,使其独立于计算,能保证数据的可重用性和灵活性。这种方法适用于与拓扑相关密切的电力系统计算,本文就潮流计算作简单介绍。 1十字链表 1.1十字链表简介 稀疏矩阵的十字链表(orthogonallinkedlist)表示法是用多重链表来存储稀疏矩阵的。 稀疏矩阵中的每一个非零元素用一个结点来表示。一般结点由5个域组成。如图1(a)所示,其中行(row)、列(col)、值域(val)分别表示某非零元素所在行号、列号和数值。向下指针(down)用以链接同一列中表示下一个非零元素的结点,向右指针(right)用以链接同一行中表示下一个非零元素的结点。这样,表示每一行中非零元素的结点之间构成一个循环链表,表示每一列中的非零元素的结点之间也构成一个循环链表。同时,每行、每列的循环链接表都有一个表头结点,以利于结点的插入和删除等操作。表头结点的行号、列号以及数值域都没有用。为节约存储,可将这两组空表头结点合用。每一个表头结点的向下指针链接对应列的非零元素结点,向右指针用以链接相应行的非零元素结点。此外,借用数值域来作为将各个空表头结点也链接成一个链表的指针。整个表有一个总的空表头指针,在一般结点标以行号、列号处标以矩阵行数m、列数n。有一个指针(root)指向这个总表头结点。由于总表头结点链接着各行列的表头结点,所以由这个指向总表头结点的指针就可以逐步访问到此矩阵的所有非零元素。 图2结点结构 如果表头结点在表头结点链表中的位置为nCol,则此行链接的非零元素链表中的结点都是与第nCol结点相关联的。 图2(a)表示的是十字链表中表头结点的结构。表头结点中有两个非零元素结点的指针和一个表头结点指针。第一个非零元素结点指针mpRight指向本行链表中第一个非零元素,第二个非零元素结点指针mpCorner指向本行链表中与对应行具有相同行号的非零元素,即对角元。表头结点指针指向下一行的表头结点。 图2(b)表示的是十字链表中非零元素结点结构。结点有3个成员,指针mpRight指向下一个与本行表头结点相关联的结点,Data包含着与这种关联对应的数值或某种结构体。本文中包含导纳,mnCol则是此非零元素结点的结点号。 2十字链表潮流方法 2.1导纳矩阵的形成 在一般的潮流计算中,形成导纳矩阵的要预先在程序中开出足够大的数组。虽然采用了压缩存储技术,但是静态数组的缺点无法克服。程序无法确切知道所需内存空间的大小,只得开出比较大的数组。这样节点数比较小时,内存空间浪费了;节点数大时,程序无法处理。十字链表的优点在于,所有结点所需内存都是动态申请的,包括表头结点(其多少由节点数决定)和非零元素结点(其多少由支路数决定)。 在此矩阵中,对角元的Data为节点自导纳,非对角元的Data为该非零元素对应节点与其表头结点对应节点之间的互导。 读入节点数之后,程序即对表头结点链表初始化。表头结点数目比节点数大一,最后一个表头结点链接的链表存储节点对地导纳。随后每读入一个节点,就在对应的表头结点后插入一个对角元,并将对角元指针指向它;每读入一条支路,如果是一条新的支路,就在此支路的每一个节点对应的表头结点后都插入一个对应另一个节点的非零元素结点,然后修改这两个 节点的互导,否则直接修改互导。所有互导形成完后,就可计算每个节点的自导了。方法是累加本表头结点后的链表中的所有非零元素的Data值,然后乘以-1。节点的对地导纳可将这一部分计算在内。root指针指向总表头结点即表头结点链表中的第一个结点。这种链表的结构见图3所示。 这个导纳矩阵中包含了网架的拓扑结构和与此相关的数值。程序中这个矩阵是基本不变的。原始数据存储在这个矩阵中具有相对独立性。 如上所示,导纳矩阵输出时先输出对角元(访问对角元指针即可得),其后的数据是按照十字链表中的顺序输出的。 B2矩阵: B2最优排序后: 限于篇幅B1矩阵略。 4结论 通常的数组存储方法属于静态数据结构,必须在程序的说明部分给出其类型定义或变量说明。某些程序中使用malloc函数或new操作符动态申请数组,但其数组仍然是空间预留的一种实现,也就仍然存在静态数组的缺点。十字链表属于动态数据结构,它的规模大小在程序执行时是可以变化的。十字链表中结点的数目是在程序执行时动态增长的,导纳矩阵随着数据的输入逐步形成。使用十字链表的存储可使存储的分配较为灵活,更充分的利用内存。 对应于电力系统中节点、线路的增加或删除等的结点操作,利用十字链表法比静态数组实现起来要方便而且快速。十字链表法中导纳矩阵的形成本身就是结点的插入操作的结果。例如添加线路的方法与读入数据时添加线路的方法就是完全一样的。 来源:www.tede.cn 通常的处理方法是将拓扑结构与网架数据分开存储在两个数组里。再利用另一个数组作为索引来访问拓扑结构和数据。十字链表的存储方法将网架的拓扑结构与数据存储在一起。于是,潮流计算中系统分析方法与数学处理方法就能分离开来,各种数据的处理实现模块化。 如果在C++中封装十字链表,可以把对十字链表的访问变得如同访问一个二维数组一样方便。封装的十字链表将具有很强的可重用性,作为一种自定义的数据类型,可使程序具有很强的可读性,便于程序的编制和维护。 作者简介:尤钟晓(1965-),男,上海交通大学电力工程系工程师; 金勇(1975-),男,上海交通大学电力工程系助工。 作者单位:上海交通大学电力系,上海200240 参考文献 〔1〕陈珩.电力系统稳态分析[M].北京:中国电力出版社,1995 〔2〕潘道才.数据结构[M].成都:成都电讯工程学院出版社,1988 〔3〕上海交通大学电力系统教研组.潮流分布的计算机分析方法[Z].(自编讲义)1990 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库chaoliujisuanC++在线全文阅读。
相关推荐: