《十字链表在电力系统潮流计算中的应用.docx》由会员分享,可在线阅读,更多相关《十字链表在电力系统潮流计算中的应用.docx(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、十字链表在电力系统潮流计算中的应用hanjuan导语:假如在C+中封装十字链表,可以把对十字链表的访问变得如同访问一个二维数组一样方便。在上海电力局2020年规划设计中,要对多种运行方式及网架构造进展计算。在计算经过中发现:假如采用通常的压缩数组存储方法,需要进展大量的修改工作。因此本文提出十字链表方法,将网络的拓扑构造与数值信息存于十字链表中,使其独立于计算,能保证数据的可重用性和灵敏性。这种方法适用于与拓扑相关亲密的电力系统计算,本文就潮流计算作简单介绍。1十字链表1.1十字链表简介稀疏矩阵的十字链表orthogonallinkedlist表示法是用多重链表来存储稀疏矩阵的。稀疏矩阵中的每
2、一个非零元素用一个结点来表示。一般结点由5个域组成。如图1a所示,其中行row、列col、值域val分别表示某非零元素所在行号、列号和数值。向下指针down用以链接同一列中表示下一个非零元素的结点,向右指针right用以链接同一行中表示下一个非零元素的结点。这样,表示每一行中非零元素的结点之间构成一个循环链表,表示每一列中的非零元素的结点之间也构成一个循环链表。同时,每行、每列的循环链接表都有一个表头结点,以利于结点的插入和删除等操纵。表头结点的行号、列号以及数值域都没有用。为节约存储,可将这两组空表头结点合用。每一个表头结点的向下指针链接对应列的非零元素结点,向右指针用以链接相应行的非零元素
3、结点。此外,借用数值域来作为将各个空表头结点也链接成一个链表的指针。整个表有一个总的空表头指针,在一般结点标以行号、列号处标以矩阵行数m、列数n。有一个指针root指向这个总表头结点。由于总表头结点链接着各行列的表头结点,所以由这个指向总表头结点的指针就可以逐步访问到此矩阵的所有非零元素。1.2潮流中十字链表的形成在潮流计算中,考虑到电力系统的特殊性,对十字链表进展了局部简化。1每个链表为单向链表,链表中的非零元素按其行号大小排序。2非零元素省略其向下指针及行值,省略列表头结点。3行表头结点省略其行、列及值域,增加对角元指针指向矩阵对角元,总表头结点就是行表头结点链表的表头。假如表头结点在表头
4、结点链表中的位置为nCol,那么此行链接的非零元素链表中的结点都是与第nCol结点相关联的。表头结点中有两个非零元素结点的指针和一个表头结点指针。第一个非零元素结点指针mpRight指向本行链表中第一个非零元素,第二个非零元素结点指针mpCorner指向本行链表中与对应行具有一样行号的非零元素,即对角元。表头结点指针指向下一行的表头结点。结点有3个成员,指针mpRight指向下一个与本行表头结点相关联的结点,Data包含着与这种关联对应的数值或者某种构造体。本文中包含导纳,mnCol那么是此非零元素结点的结点号。2十字链表潮流方法2.1导纳矩阵的形成在一般的潮流计算中,形成导纳矩阵的要预先在程
5、序中开出足够大的数组。固然采用了压缩存储技术,但是静态数组的缺点无法克制。程序无法确切知道所需内存空间的大小,只得开出比拟大的数组。这样节点数比拟小时,内存空间浪费了;节点数大时,程序无法处理。十字链表的优点在于,所有结点所需内存都是动态申请的,包括表头结点其多少由节点数决定和非零元素结点其多少由支路数决定。在此矩阵中,对角元的Data为节点自导纳,非对角元的Data为该非零元素对应节点与其表头结点对应节点之间的互导。读入节点数之后,程序即对表头结点链表初始化。表头结点数目比节点数大一,最后一个表头结点链接的链表存储节点对地导纳。随后每读入一个节点,就在对应的表头结点后插入一个对角元,并将对角
6、元指针指向它;每读入一条支路,假如是一条新的支路,就在此支路的每一个节点对应的表头结点后都插入一个对应另一个节点的非零元素结点,然后修改这两个节点的互导,否那么直接修改互导。所有互导形成完后,就可计算每个节点的自导了。方法是累加本表头结点后的链表中的所有非零元素的Data值,然后乘以-1。节点的对地导纳可将这一局部计算在内。root指针指向总表头结点即表头结点链表中的第一个结点。这个导纳矩阵中包含了网架的拓扑构造和与此相关的数值。程序中这个矩阵是根本不变的。原始数据存储在这个矩阵中具有相对独立性。2.2B1,B2的形成本文中潮流计算采用PQ分解法。矩阵B1是原导纳矩阵去掉松弛节点形成的矩阵,B
7、1矩阵的所有数据均取自原导纳矩阵,所不同的是节点的行号。导纳矩阵中节点的行号是原有节点的节点号,而B1矩阵中节点的行号是导纳矩阵中去掉松弛节点后重新排成的节点号。程序必须记录这种节点号的对应关系。矩阵B2是原导纳矩阵去掉松弛节点和PQ节点后形成的矩阵。同理,程序也必须记录B2矩阵的节点号与原导纳矩阵节点号的对应。假设考虑节点的对地导纳,只需访问表头结点链表中对地导纳对应的链表,按行号搜寻即可得到相应的对地导纳。PQ分解法中B1,B2矩阵每次只需形成一次。实际上假如使用牛顿法,每次都需要形成雅可比矩阵,这时导纳矩阵的相对独立性就显得较有上风。十字链表法把网架拓扑构造与相关数值一起存储,其存储构造
8、提供了将数学上的解方程方法与网络分析相别离的基矗以下几个步骤就是纯数学问题了。2.3最优排序及其它一些问题最优排序与其它存储构造的方法原理是一致的,但注入元的处理方法不一样。静态数组的压缩存储对注入元的处理方法是每行末尾预留空间,其缺陷也在于预留空间大小的设定。在十字链表方法中,注入元的处理就特别方便了。假如排序时产生了注入元,只需在对应行各插入一个新的结点就可以了。这样对注入元的处理只需在排序时考虑,而无需在形成矩阵或者在系统分析时考虑了。当B1,B2矩阵形成并排过序后,就需要解方程了。主要是因子表的形成与消元和回代。可以采用LU分解法求因子表。原理一样,只需留意十字链表的存储构造。形成了因
9、子表并消元回代之后,方程解出了。然后按照流程,进展反复迭代。功率偏向量小于收敛精度时,就可完毕计算了。根据IEEE14节点模型计算的导纳矩阵只列出局部,导纳矩阵实部略,原始数据中没有计入第9号节点的对地导纳。如上所示,导纳矩阵输出时先输出对角元访问对角元指针即可得,其后的数据是按照十字链表中的顺序输出的。通常的数组存储方法属于静态数据构造,必须在程序的讲明局部给出其类型定义或者变量讲明。某些程序中使用malloc函数或者new操纵符动态申请数组,但其数组仍然是空间预留的一种实现,也就仍然存在静态数组的缺点。十字链表属于动态数据构造,它的规模大小在程序执行时是可以变化的。十字链表中结点的数目是在
10、程序执行时动态增长的,导纳矩阵随着数据的输入逐步形成。使用十字链表的存储可使存储的分配较为灵敏,更充分的利用内存。对应于电力系统中节点、线路的增加或者删除等的结点操纵,利用十字链表法比静态数组实现起来要方便而且快速。十字链表法中导纳矩阵的形本钱身就是结点的插入操纵的结果。例如添加线路的方法与读入数据时添加线路的方法就是完全一样的。通常的处理方法是将拓扑构造与网架数据分开存储在两个数组里。再利用另一个数组作为索引来访问拓扑构造和数据。十字链表的存储方法将网架的拓扑构造与数据存储在一起。于是,潮流计算中系统分析方法与数学处理方法就能别离开来,各种数据的处理实现模块化。假如在C+中封装十字链表,可以把对十字链表的访问变得如同访问一个二维数组一样方便。封装的十字链表将具有很强的可重用性,作为一种自定义的数据类型,可使程序具有很强的可读性,便于程序的编制和维护。0