鄭艷 永城職業(yè)學(xué)院
C#與MATLAB混合編程的潮流計(jì)算可視化窗體
鄭艷 永城職業(yè)學(xué)院
潮流計(jì)算是電力系統(tǒng)領(lǐng)域內(nèi)非常重要的數(shù)學(xué)計(jì)算之一,本文在研究了幾種潮流計(jì)算計(jì)算機(jī)算法的基礎(chǔ)上,通過(guò)整合MATLAB的科學(xué)計(jì)算能力和C#.NET的界面設(shè)計(jì)功能,通過(guò)混和編程的技術(shù),將兩者的優(yōu)點(diǎn)整合到一起?;炀幒竽繕?biāo)機(jī)上只需安裝MATLAB的MCRInstaller.exe組件即可運(yùn)行,極大地減少了軟件正常運(yùn)行所需要的內(nèi)存占用。系統(tǒng)操作簡(jiǎn)潔,上手簡(jiǎn)單,對(duì)科學(xué)計(jì)算窗體化具有實(shí)際意義。
MATLAB C# 混合編程 潮流計(jì)算 可視化窗體
1.1 潮流算法的選擇
在潮流計(jì)算中比較基礎(chǔ)的電力系統(tǒng)計(jì)算機(jī)潮流計(jì)算算法有高斯-塞德?tīng)柕?、牛頓-拉夫遜迭代法和PQ分解法(快速解耦法)。高斯-塞德?tīng)柕▽?duì)初值的選取不敏感,占用內(nèi)存不大,但缺點(diǎn)是收斂緩慢,運(yùn)行效率不高。牛頓-拉夫遜迭代法具有平方收斂特性,收斂速度很快,但是缺點(diǎn)是對(duì)初值選取敏感,很容易出現(xiàn)不收斂的情況,并且每次迭代都需要更新Jacobian矩陣,占用大量運(yùn)算內(nèi)存。一般可以用高斯-塞德?tīng)柗ǖ粌刹胶笥门nD-拉夫遜法迭代,可以互相彌補(bǔ)對(duì)方的缺點(diǎn)。PQ分解法(快速解耦法)是對(duì)牛頓-拉夫遜法的改進(jìn),該法只考慮電壓相角對(duì)有功的影響和電壓幅值對(duì)無(wú)功的影響,常數(shù)化Jacobian矩陣。該法具有直線收斂特性,收斂快,占用內(nèi)存小,但缺點(diǎn)是在配電網(wǎng)中電阻部分往往不能忽略,故本文不討論該法,本文僅以全極坐標(biāo)下的牛頓-拉夫遜迭代法為例。
1.2 牛頓-拉夫遜潮流算法
1.2.1 帶變壓器支路的處理
牛頓-拉夫遜潮流算法是基于節(jié)點(diǎn)電壓方程的一種算法,首先需要生成節(jié)點(diǎn)導(dǎo)納矩陣,普通的線路可以轉(zhuǎn)換成與線路阻抗和電納等值的π型模型,若一條線路首端連變壓器,變比為首端:末端=k:1,串聯(lián)導(dǎo)納為Y,那么等值后的π型模型為:串聯(lián)導(dǎo)納為Y/k,首端對(duì)地電納為((1-k)/)*Y,末端對(duì)地電納為((1-k)/k)*Y。經(jīng)過(guò)處理后,變壓器支路也可以等效轉(zhuǎn)換成普通線路。
1.2.2 修正方程
在全極坐標(biāo)下,牛頓-拉夫遜潮流算法將PV節(jié)點(diǎn)和平衡節(jié)點(diǎn)全部看作是PQ節(jié)點(diǎn)進(jìn)行處理,故雅可比矩陣有2*n階并且在每次迭代中,不斷利用更新的電壓幅值相角獲得新的功率不平衡量和更新雅可比矩陣,并通過(guò)修正方程求得下一次的電壓幅值相角,最終使不平衡量達(dá)到目標(biāo)精度以內(nèi)即完成收斂。
2.1 MATLAB與C#混合編程方式選擇
由于MATLAB和C#語(yǔ)言都是基于C語(yǔ)言的高級(jí)語(yǔ)言,所以目前有多種方式可以實(shí)現(xiàn)MATLAB和C#的混合編程:
(1)MATLAB的函數(shù)文件是.m文件,可以用MATLAB的mcc編譯器生成C共享庫(kù),再調(diào)用。
(2)C#調(diào)用MATLAB工作區(qū)計(jì)算并返回結(jié)果。
(3)C#使用MATLAB的DeployTool函數(shù)生成COM組件再由C#調(diào)用。
(4)C#使用MATLAB的DeployTool函數(shù)生成.NET組件再由C#調(diào)用。
2.2 MATLAB的環(huán)境設(shè)置和.dll文件的生成
本文所用的MATLAB的版本是自帶mcc編譯器的2014a,C#是使用的VS2013。由于潮流程序較復(fù)雜,函數(shù)過(guò)多。本文以簡(jiǎn)單具有代表性的自加一函數(shù)為例。文件名為add1.m,函數(shù)為:f(x)=x+1。寫好函數(shù)后,須設(shè)置MATLAB的編譯環(huán)境,在命令行中輸入mbuild-setup指令選用適當(dāng)編譯器編譯。隨后在命令行中輸入deploytool命令,在彈出的窗口中選擇第二項(xiàng)LibraryCompiler命令會(huì)彈出設(shè)置窗口。在類選項(xiàng)中選擇.NET Assembly類,點(diǎn)擊加號(hào)添加剛剛生成的add1.m文件,在名字文本框中,輸入fun_add1作為組件名,Settings用于設(shè)置文件保存路徑,完成后點(diǎn)擊Package打包。打包文件中的fun_add1.dll將會(huì)在C#中被引用。
2.3 在C#中調(diào)用組件
在添加fun_add1.dll前找到MATLAB目錄下的MWArray.dll文件,將其和fun_add1.dll一起添加到一個(gè)文件夾中,并將這個(gè)文件夾用于存放C#工程。接著在VS2013中新建Windows窗體應(yīng)用程序項(xiàng)目,選擇.NET Framwork4的環(huán)境。項(xiàng)目生成后在引用欄中添加MWArray.dll和fun_add1. dl并在代碼區(qū)命名空間中添加命名空間:usingMathWorks. MATLAB.NET.Utility、usingMathWorks.MATLAB.NET. Arrays和usingfun_add1;
2.4 MATLAB與C#間的運(yùn)算轉(zhuǎn)換
若要在C#中生成矩陣傳值到MATLAB中運(yùn)算并返回C#,必然不能缺少中間類,我們可以通過(guò)MWNumericArray強(qiáng)制轉(zhuǎn)換到需要的類型,而這個(gè)中間類既可以轉(zhuǎn)換至MWArray格式,也轉(zhuǎn)換至int,double,float等格式。矩陣可以使用數(shù)組生成,只需要輸入代碼:MWNumericArray矩陣名=newMWNumericArray(MWArrayComplexity.Real,a,b);就可以生成一個(gè)a行b列的實(shí)數(shù)矩陣,而將.Real換成.Complex可生成復(fù)矩陣。我們輸入如下代碼檢驗(yàn)可行性:
針對(duì)本文編寫的應(yīng)用軟件可通過(guò)串口進(jìn)行通信,獲取并發(fā)送數(shù)據(jù),大致?lián)碛衅胀ù谥值墓δ?。C#的通信功能提供了軟件與硬件之間溝通的橋梁,可通過(guò)人為設(shè)置標(biāo)準(zhǔn)實(shí)現(xiàn)下位機(jī)動(dòng)作,也可以作為電力系統(tǒng)通信的橋梁。
[1]肖偉,劉忠,曾新勇等.MATLAB程序設(shè)計(jì)與應(yīng)用[M].北京:清華大學(xué)出版社,2005
[2]姚光強(qiáng),陳立平.基于COM技術(shù)的C#與Matlab混合編程[J].計(jì)算機(jī)工程,2008,34(14)