孫英云,董 雷,劉寶柱,艾 欣
(華北電力大學電氣與電子工程學院,北京 102206)
“電力系統潮流上機計算”是我校精品課程“電力系統分析基礎”的實踐課程,也是我校電氣工程及其自動化專業學生的必修課程。由于本專業C語言課程安排在大學一年級,而本課程安排在大三春季學期末,中間近兩年多的時間缺乏編程訓練,多數學生還不具有獨立編程能力。同時,學生在理論課的學習中對計算機潮流計算的理解也不夠深刻,還需要在本門實踐課程中加以深化。
我校“電力系統潮流上機計算”實踐課程要使學生理解電力系統的計算機潮流算法和原理,初步掌握利用計算機語言實現潮流計算軟件開發的基本方法[1]。
近年來軟件工程領域涌現出了諸多新成果,由Kent Beck在1996年提出的極限編程是一種新型輕量級的軟件工程方法[2]。該方法成為商業軟件開發的指導原則,其核心理念包括測試優先開發和雙人結對編程等。
我們將極限編程XP(Extreme Programming)思想的兩個核心理念引入到“電力系統潮流上機計算”課程教學當中,取得了較好的教學效果。
測試優先是極限編程方法中的一條重要原則,即在編寫正式代碼前先編寫好測試代碼。測試優先的編程思路非常符合面向對象的編程技術原則:即面向接口而不是面向實現。這一方面可以幫助學生分析具體函數的輸入與輸出,實現通過接口設計將復雜程序進行解耦;另一方面也可幫助學生對程序邏輯錯誤進行定位,而這種程序邏輯錯誤在傳統編程方法中通常難于發現。
結對編程是極限編程的另外一條重要原則,即兩位程序員坐在同一臺電腦前合作完成同一段代碼或同一組測試。與兩位程序員各自獨立工作相比,結對編程的好處是通過相互討論,加深程序員對問題的理解,提高代碼的可讀性和質量,同時也可提高編程效率。
由于本專業全部學生都要完成潮流上機實踐課程,機房中的計算機數量不足。同時考慮參與上機實踐的學生計算機水平良莠不齊,我們要求計算機水平較高的學生和水平較低的學生結對,在答辯時問題主要由水平較低的學生回答。兩人結對編程,在碰到困難時通過兩人討論來克服,有效避免了單人編程時由于畏難情緒而消極等待的情況。
此一步驟向學生講述VC6中工程的建立,幫助學生回憶C語言課程中編程、調試和運行程序的基本過程。
計算機潮流計算需要準備數據,本例即是幫助學生完成潮流計算中的數據準備工作。學生應當從IEEE標準算例中讀取母線和線路數據,存入相應的結構數組當中,并通過輸出至屏幕和文件兩種方式驗證讀入數據程序的正確性。
教師首先給出讀入母線數據的示例程序,學生則根據示例程序完成讀入線路數據,并輸出到屏幕和文件的工作。在此步驟完成之后,絕大多數學生均基本掌握了C語言中數組和循環語句的用法,為下一步工作打好了基礎。
在數據準備完畢之后,即可進行節點導納矩陣的生成工作。教師在本教學步驟中,指導學生利用已有的線路和母線數組建立節點導納陣。
在節點電壓、相角和節點導納陣已知的情況下,即可進行節點不平衡功率的計算。此例的主要難度在于節點不平衡功率中節點的排列順序和數據文件中給定的節點順序不一致。我們決定引入測試優先的編程思路:教師先行給出平啟動下節點不平衡功率的結果(一個一維數組),學生可利用測試代碼將自己的計算結果和所給結果進行對比,發現不一致結果出現的位置后進行相應的處理。
Jacobi矩陣的生成是潮流計算中最困難的部分之一。其困難之處在于利用二維數組表示矩陣以及矩陣元素在矩陣中所處的位置問題。由于在前兩個示例中,學生已學會數組調用及如何處理數組元素排列順序的方法,因此可較順利的完成Jacobi矩陣的生成。
由于在電力系統穩態分析的教學中,對線性方程組的計算機求解不做要求,因此教師提供了線性方程組的求解程序及其示例代碼。學生可根據示例程序直接調用該程序即可得出結果。對于部分編程能力較強,進度較快的學生可根據自己的實際情況選做這部分內容。這樣既保證了大多數學生的進度,也可使部分優秀學生有充分發揮其潛力的空間。
教學實踐中發現,在順利完成上述6個步驟的基礎上,絕大多數學生均可順利完成潮流上機實踐,并完成最終的報告。最終答辯時發現學生對潮流計算的理解及計算機能力均有了明顯的提高[3,4]。
在潮流上機實踐中,節點導納陣、節點不平衡功率的計算以及Jacobi矩陣的生成是主要難點。為此,我們采用了測試優先開發原則。下面以節點導納矩陣的生成為例進行說明。具體到潮流上機實踐中,我們提供了如下具體程序結果。
(1)給出節點排列順序,即可給出節點導納陣;
(2)給出節點電壓初值、潮流方程類型(極坐標或直角坐標)和方程排列順序情況下第一次功率不平衡量結果(一維數組);
(3)給出節點電壓初值、方程排列順序、潮流方程類型及變量排列順序后的Jacobi矩陣元素的值(二維數組);
先將節點導納陣、給定節點電壓初值(平啟動)的第一次Jacobi矩陣和節點不平衡功率,以文本文件的方式提供給上機學生。學生在編寫正式程序之前先編寫測試程序,只有當程序計算結果和所給結果一致(絕對值誤差小于1e-5)時測試才能通過。
在實際上機操作時發現,學生在實踐中所出問題主要可分為兩類,其一是公式寫錯,其二是矩陣或數組的索引寫錯。而不論是何種錯誤,測試優先的編程原則都可以幫助學生迅速定位錯誤,顯著提高了編程效率。
下面我們以節點導納陣的編寫為例,具體說明測試優先方法的實施過程。經過對現有單元測試工具的綜合比較之后,我們選用了Cppunit作為本教學實踐中單元測試的工具。Cppunit是開源和跨平臺的用于C++的單元測試工具[5],具有易于使用等、手冊翔實和例程豐富等優點。
在正式使用之前,需要教師在集成開發環境(IDE)中完成Cppunit的安裝。現以VC6為例,采用如下步驟。
1)首先從網站上下載Cppunit,并按照其說明進行編譯,也可直接下載相應操作系統下已編譯好的靜態或動態鏈接庫(lib或dll文件);
2)在VC6中將CppUnit的頭文件和庫文件引入到潮流計算工程當中,如圖1和圖2所示。
圖1和圖2的下方列表框中最后一行分別是Cppunit的頭文件和類庫所在目錄。點擊OK按鈕即可將其添加到VC6的工作目錄當中,這樣學生就可直接在自己的程序中調用Cppunit的類和方法。
3)學生在正式編程之前,需要完成測試代碼的編寫工作,測試代碼主要是判斷所生成節點導納矩陣的元素值和教師所給出的相應結果的誤差值是否小于1e-5。只有節點導納矩陣所有元素均滿足上述條件時才能通過測試。

圖1 Cppunit頭文件配置圖

圖2 Cppunit庫文件配置圖
4)學生在完成測試代碼后,方可進行節點導納矩陣生成代碼的編制工作。當編寫完成且編譯通過后,即可利用測試程序進行測試。如果沒有通過測試,學生可根據Cppunit提供的信息對節點導納矩陣中出錯的元素進行定位,進而對代碼進行檢查并修改,以通過測試。測試通過則說明學生編寫的節點導納矩陣生成程序是正確且可用的。
和傳統的潮流上機教學方法相比,測試優先的編程思路的優勢主要體現在兩個方面:①可以將復雜的潮流程序劃分成相對較小的模塊,每個模塊均可單獨測試,降低了問題的復雜度;②通過測試的代碼不但沒有編譯錯誤,同時也最大限度降低了邏輯錯誤發生的可能性,而后者往往是初學者常犯且難于定位的錯誤。
電力系統潮流上機實踐的順利開展對于學生掌握計算機潮流計算流程,加深對穩態分析課程的理解極有幫助。筆者將軟件工程領域的最新理論—極限編程相關理念引入到課程教學當中,進行了有益的探索和嘗試。通過課程結束對所有上課學生的調查發現,不但所有學生都圓滿完成了潮流計算程序,而且90%多的學生都表示這門課程收獲很大,有60%多的學生表示有興趣進行更高難度的編程嘗試。這說明本教學探索在圓滿實現預定的課程目標的同時,也激發了學生動手實踐的興趣。
[1]沈才梁,宋雯霏,高職計算機類課程上機實踐環節教學研究,宜昌:三峽大學學報(人文社會科學版),2005,(27):272-273
[2]Kent Berk,Cynthia Andres.Extreme Programming Explained:Embrace Change(2nd Edition)[M].Addison-Wesley Professional,2004
[3]陳珩.電力系統穩態分析(第三版)[M].北京:中國電力出版社,2007
[4]王錫凡,現代電力系統分析,北京:科學出版社,2003
[5]CppUnit,http://sourceforge.net/projects/cppunit/[EB/OL]