当前位置:首页 > chaoliujisuanC++
fprintf(fp,\i],q[i]); }
fprintf(fp,\for(i=1;i<=l;i++) {
pos1=f1(i); st=s1[pos1]; en=e1[pos1];
x1=e[f1(st)]*e[f1(st)]+f[f1(st)]*f[f1(st)]; x2=e[f1(en)]*e[f1(en)]+f[f1(en)]*f[f1(en)]; y1=e[f1(st)]*e[f1(en)]+f[f1(st)]*f[f1(en)]; y2=f[f1(st)]*e[f1(en)]-e[f1(st)]*f[f1(en)]; p1[pos1]=(x1-y1)*g1[pos1]-y2*b1[pos1];
q1[pos1]=-x1*(c1[pos1]+b1[pos1])+y1*b1[pos1]-y2*g1[pos1]; p2[pos1]=(x2-y1)*g1[pos1]+y2*b1[pos1];
q2[pos1]=-x2*(c1[pos1]+b1[pos1])+y1*b1[pos1]+y2*g1[pos1]; for(j=1;j<=n;j++) {
cm=c[f2(j,i,l)]; if(cm!=0.0) {
km=1; if(en==j) {
km=2; }
if(km==1) {
q1[pos1]-=(e[f1(j)]*e[f1(j)]+f[f1(j)]*f[f1(j)])*cm; } else {
q2[pos1]-=(e[f1(j)]*e[f1(j)]+f[f1(j)]*f[f1(j)])*cm; } } }
p3[pos1]=p1[pos1]+p2[pos1] ; q3[pos1]=q1[pos1]+q2[pos1] ;
fprintf(fp,\13.6e\
i,s1[pos1],e1[pos1],p1[pos1],q1[pos1],p3[pos1],q3[pos1],\\ e1[pos1],s1[pos1],p2[pos1],q2[pos1]); }
}
十字链表在电力系统潮流计算中的应用
来源: 时间: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
共分享92篇相关文档