您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > 基于MatlabC_C_数学函数库的电力系统潮流计算
第33卷 第1期 2011-1(上) 【213】收稿日期:2010-12-03作者简介:黄东(1965-),女,广西岑溪人,副教授,研究方向为电工、电气自动化。0引言自从1984年MathWorks公司首次推出MatlabV1.0版本到目前为止推出的MatladR2007a版本以来,Matlab已发展成为国际上最为优秀的科技应用软件之一。其强大的科学计算,使得Matlab在许多科学领域成为计算机辅助设计与分析、算法研究和应用开发的基本工具和首选平台。作为一个科学计算软件,Matlab集成了强大的矩阵运算功能,如果能在程序开发中充分利用其这一功能,将大大缩短开发周期,而且又使程序具有很好的运行速度。潮流计算是电力系统中应用最广、最基本及最重要的一种计算,它的任务是对给定的运行条件确定系统的运行状态,如母线上的电压(幅值及相角)、网络中的功率分布及功率传输。其实质在数学上是求解多变量非线性代数方程组。为了提高计算的性能,到目前为止,所提出的解算方法和研究成果有:高斯—塞德尔法、牛顿-拉弗逊法、P-Q分解法等。其中,牛顿—拉弗逊法及其派生的P-Q分解法,在现代的电力系统计算中得到了广泛的应用[1,2]。随着现代调度中心的建立,为了对电力系统进行安全实时监控,电力调度中心需要根据实时采集到的系统数据判断电力系统当前的运行状态并预测可能出现的故障。于是,出现了在线潮流计算。可见,在线潮流计算系统的一个重要的特点就是反应快速。这就使得,如何使潮流计算程序具有快速的运行速度,成为了必要。将Matlab与其它语言混合编程用于电力系统潮流计算,可以充分利用两种语言的优点。本文在这里探讨了一个使用MatlabC/C++数学函数库与VisualC++混合编程实现快速潮流计算的方法。将潮流计算公式进行矢量化处理,即尽可能将循环运算转化为矩阵运算,充分利用Matlab的C/C++数学函数库强大的矩阵计算能力和稀疏解方程等常用算法,并利用AMD算法对节点进行优化处理,结合PQ分解法修正方程系数的特点,使用LDLT算法求解,可以使运算速度较普通高斯算法成倍提高[8-9]。充分利用两个开发工具的优点,可以快速实现界面友好,运算速度快并且可以脱离Matlab的潮流计算程序。1MatlabC/C++数学函数库MatlabC/C++数学函数库是Matlab扩展中的重要组成部分,共包含了大约400个的Matlab数学函数,分别用C语言和C++语言编写,用户只要按照一定的规则,就可以在C语言和C++语言编写的应用程序中轻松的调用它们。C数学函数库是建立在一个名为mxArray的结构体之上,通过操作mxArray可以实现对Matlab阵列(Array)的操作。而C++数学函数库则是建立在基础类mwArray之上。mwArray类是利用C++的类机制对结构体mxArray和一些相应基于MatlabC/C++数学函数库的电力系统潮流计算PowerflowcalculationbasedonmatlabC/C++mathematicfunctionlibrary黄东1,梁京章2HUANGDong1,LIANGJing-zhang2(1.广西工业职业技术学院电子与电气工程系,南宁530001;2.广西大学信息网络中心,南宁530003)摘 要: 介绍了MATLABC/C++数学函数库的一些特点及其在VisualC++中的调用方法。推导了完整的电力系统潮流计算公式的矢量化表达。结合MATLABC/C++数学库提供的矩阵运算机制,编写出简洁、直观且高效的C++程序代码。潮流计算修正方程的求解采用了AMD排序加LDLT分解的方法,有效减少注入元数量,提高了计算速度。对IEEE118至1000等4个系统进行的仿真结果表明,该方法在电力系统复杂计算中运用的具有可行性。关键词: 电力系统;潮流计算;MatlabC/C++数学函数库;矢量化中图分类号:TP391文献标识码:B文章编号:1009-0134(2011)1(上)-0213-03Doi:10.3969/j.issn.1009-0134.2011.1(上).68【214】 第33卷 第1期 2011-1(上)的函数进行封装。由于C++类具有继承、重载的特性,C++数学函数库直接支持大部分的Matlab运算符号和所有的Matlab数学函数,使得通过其写出来的程序与直接用Matlab写的M程序具有相当的形式,如同在纸上进行公式演算一般。但有一些Matlab运算符号,如\、./、.\、.*、.^、’、.’等。这主要是这些符号,在C++语法中,是非法的标识符,不过在C++数学函数库中则提供了相应功能的函数,见下表:Matlab运算符C++数学函数库功能\mldivide矩阵左除./rdivide阵列右除.*times阵列乘法.^power阵列乘方’ctranspose复数共轭转置.’transpose非复数的转置:colon创建系列索引^mpower矩阵乘方同样,虽然MATLABC/C++数学函数库中的大多数函数的调用方法与Matlab之中的一样,但它们之间还是存在有一些区别:1)在使用多值返回函数时,由于C++只允许有一个返回值,想返回多个值则需要使用指针传递。2)在C/C++中使用矩阵变量时,必须要先进行变量声明。同时,如果使用的是MatlabC数学函数库的mxArray结构体变量,在变量使用结束后,需要调用函数mxDestroyArray()进行销毁,否则将有可能引起内存泄露。MATLABC/C++数学函数库,除了封装大量高效率、高精度、高可靠性的数组、矩阵运算函数及数值分析的方法之外,还支持稀疏矩阵(sparsearray)类型,并提供了完善的创建和操作稀疏矩阵的库函数。这使得原本复杂烦琐的稀疏技术变得简单。用户只需遵循其创建和操作的原则[3~5],即可实现稀疏技术的运用。2数学函数库在VisualC++6.0中的运用MatlabC/C++数学函数库在VisualC++6.0中的调用方法很简单。首先,在includefiles、libraryfiles的路径中添加如下路径:Matlab\extern\include;Matlab\extern\include\cpp;Matlab\extern\lib\win32;Matlab\extern\lib\win32\microsoft\msvc60。其次,在工程Setting中作一些简单的设置,详情请参见文献[7]。再次,在工程中包含相应的头文件。如果只使用C数学函数库,则需包含头文件“matlab.h”;如果使用的是C++数学函数库,则只需包含头文件“matlab.hpp”。3潮流计算矢量化MATLAB的核心是矩阵运算,如果能将潮流计算转化成为矩阵运算,将使编写的潮流程序变得高效、快速。下面我们将进行潮流公式的矢量化。3.1节点功率方程设电力系统导纳矩阵Y已知,则系统节点方程为:I=YV(1)或写成:(2)节点功率与节点电流有如下的关系:(3)因而由(2)式,即可得到:(4)那么,将(4)式写成矩阵形式,可得到:(5)其中为复数形式的节点电压向量,符号.×表示将矩阵的对应元素相乘。3.2雅克比矩阵的形成电力系统潮流计算的方程式为:(6)第33卷 第1期 2011-1(上) 【215】由方程组(6)可得到雅克比矩阵J:其中以为例,当i≠j时,Hij=-ViVj(Gijsindij-Bijcosdij)当i=j时,Hij=Vi2Bij+Qi)。如果令,其中为对角矩阵,则(7)由此可得,故雅克比矩阵又可以写成:(8)式中,Re(·)表示复数矩阵的实部;Im(·)表示复数矩阵的虚部;diag(·)表示将矢量转成对角矩阵。3.3C/C++数学函数库的代码形式上述的(5)、(7)、(8)式子,均为矢量化的潮流计算的数学表达式。可以利用C/C++数学函数库,将它们写成C++的代码。式(5)、(7)、(8)的C++代码如下:mwArrayS,S1,Y,J;mwArrayHij,Nij,Kij,Lij;mwArrayV;%——V为复数形式……S=times(V,conj(Y)*conj(Y));S1=diag(V)*conj(Y)*diag(ctranspose(V));Hij=-imag(S1)+diag(imag(S));Nij=-real(S1)-diag(real(S));Kij=real(S1)-diag(real(S));Lij=-imag(S1)-diag(imag(S));%---J=[Hij,Nij;Kij,Lij]------J=vertcat(horzcat(Hij,Nij),horzcat(Kij,Lij));其中,PV节点和平衡节点按潮流计算的计算原则进行相应的处理。可见,原本复杂繁琐的计算过程,只要进行适当的矢量化再利用C/C++数学函数库提供的矩阵运算机制,便可在几句代码之内编写完成。这样编写的代码,既简洁高效,又可提高编写高质量潮流计算程序的效率。4算例说明及分析本文选择IEEE118系统、IEEE300系统、某700节点系统、某1000节点系统作为算例,并分别使用牛顿-拉弗逊法和PQ分解法实现。所用计算机为IBMPC兼容机,CPU为P42.8G,512M内存,C/C++数学函数库由Matlab6.5提供。程序在VisualC++6.0中测试通过。算例采用了两种计算方法:牛顿—拉弗逊法、PQ分解法。其中PQ分解法采用的是改进后的算法:在B’中去掉那些对有功功率及电压向量角度无关或影响较小的因素,在B”中去掉那些对无功功率及电压幅值影响较小的因素,并且在P-q迭代过程中使用系统平均电压V0,即DP/V=BDqV0。算例程序的运行结果见下表:PQ分解法牛拉法高斯消去法AMD-LDLT分解算例系统迭代次数迭代时间(s)迭代次数迭代时间(s)迭代次数迭代时间(s)IEEE11870.03270.01530.031IEEE30070.06270.03140.078700130.219130.06340.172100080.21980.09340.281【216】 第33卷 第1期 2011-1(上)各算法的计算结果均相同,各节点的电压和功率均无越限现象,各系统都能正常收敛。由运行结果可见,程序计算的速度很快,1000个节点的系统使用牛顿拉弗逊法只需0.281秒。而使用AMD[8]进行节点最优排序并结合LDLT[9]分解算法的PQ分解法,只需0.093秒,比高斯分解法节省了大量的CPU时间。下图为PQ分解法的收敛曲线:图1PQ分解法的收敛特性下图为牛顿法的收敛曲线:图2牛顿法的收敛特性5结论MATLAB是目前国内外十分流行的科学计算软件,被广泛运用于信号处理、图像处理、小波分析、优化理论等现代工程技术领域。但由于其本身存在循环执行速度慢的缺点,在国内还很少将其直接运用于电力系统之中。本文以MATLABC/C++数学函数库为工具,探索了其在VisualC++中的使用方法。利用此方法,可以充分发挥MATLAB强大的矩阵、数组运算功能,不仅可以大大提高计算的速度,而且还可以降低算法实现的难度,缩短程序的开发周期。通过计算IEEE118、IEEE300、700、1000等系统,证明其计算速度快,可达到在线潮流计算的要求。同时,也说明MATLAB在电力系统的其他方面也有广阔的应用前景。参考文献:[1]西安交通大学,等.电力系统计算[M].水利电力出版社1978.[2]何仰赞,温增银.电力系统分析(第三版)[M].华中科技大学出版社,2002.[3]刘志俭,潘县飞,连军想.MATLAB外部程序接口(6.x)[M].科学出版社,2002.[4]MATLABCMathLibraryUser’sGuide.2000.MathWorksInc.[5]MATLABC++MathLibraryUser’sGuide.2000.MathWorksInc.[6]MATLABCompilerUser’sGuide.2000.MathWorksInc.[7]刘维.精通MATLAB与C/C
本文标题:基于MatlabC_C_数学函数库的电力系统潮流计算
链接地址:https://www.777doc.com/doc-9295109 .html