康 顥, 沈 瑤, 王博文, 趙彥珍
(西安交通大學電氣工程學院,西安 710049)
線性動態(tài)電路是電路理論中的重要內容。對線性動態(tài)電路進行暫態(tài)分析,通常需要列寫并求解線性微分方程,隨著電路階數的逐漸增高,手工求解的難度也會急速增大[1]。隨著計算機技術的飛速發(fā)展,功能強大的科學計算軟件如Matlab提供了新的解決方案,例如文獻[2]中利用拉氏變換手工列寫電路方程,借助Matlab進行輔助計算和繪制響應曲線;文獻[3]中采用系統法手工列寫電路的狀態(tài)方程,借助Matlab的符號運算功能進行求解。這些研究為解決線性動態(tài)電路問題提供了很好的思路,本文將在這些研究的基礎上,使用Python設計并實現一個可視化電路分析軟件,實現對存在換路過程的任意階線性動態(tài)電路的自動分析。
Python作為一種解釋型的高級語言,具有良好的可擴展性和可移植性,擁有豐富的第3方庫,其中不乏各種優(yōu)秀的科學計算庫[4-5]。本文所設計實現的軟件,其主要功能包括:①利用基爾霍夫電流定律(Kirchhoff’s Current Law,KCL)和支路電壓電流關系(Voltage Current Relation,VCR),自動求解任意階線性動態(tài)電路在穩(wěn)態(tài)下的結點電壓和支路電流;②利用狀態(tài)方程和龍格庫塔法,自動計算任意階線性動態(tài)電路中任一電壓或電流的時域數值解;③借助圖形化的用戶界面,進行電路原理圖的交互式繪制及計算結果的可視化顯示等。
以圖1為例介紹動態(tài)電路的分析方法。
圖1 示例動態(tài)電路
在t=0-時刻,電路處于穩(wěn)態(tài),可將電容元件視為開路,電感元件視為短路,開關根據其類型視為相應的開路或短路。圖1所示電路在t=0-時刻的穩(wěn)態(tài)電路如圖2所示。
圖2 t=0-時刻的穩(wěn)態(tài)電路
設此時電路中結點數量為n,元件數量為b。設電路中結點電壓uk(k=1,2,…,n-1)和元件支路電流ik(k=1,2,…,b)為未知量。為簡便起見,將每個元件視作一條支路,且元件電壓和電流取關聯參考方向。
對除去0號參考結點之外的n-1個結點列寫出共n-1個獨立KCL方程:
式中:bj為與結點j關聯的元件個數;ijk為與結點j關聯的元件上電流的代數值,流出取正,流入取負。
根據元件的VCR,對b個元件可列寫出共b個方程。以圖1所示電路為例,電阻、電壓源和電流控制電壓源(Current Controlled Voltage Source,CCVS)的VCR方程分別為:
其中:Ri為電阻阻值;upos、uneg分別為元件兩端的結點電壓;r為CCVS的控制系數;icid為CCVS的控制電流。
未知量數與獨立代數方程數均為n-1+b。根據線性代數理論可知,解此方程組即可得到電路在t=0-穩(wěn)態(tài)下的各結點電壓和支路電流。得到在t=0-時刻的各電容電壓u Cj(0-)和電感電流iLj(0-)。
圖1所示電路中,t=0時刻開關S1閉合,S2斷開。設換路后的電路結點數量為n′,元件數量為b′,其中包含p個電容和q個電感,其狀態(tài)方程的標準形式為:
與電路的穩(wěn)態(tài)求解類似,對于除參考結點外的n′-1個結點列寫n′-1個KCL方程,對于所有非動態(tài)元件列寫b′-p-q個VCR方程。對于每個電容元件,需要列寫兩個方程:
式(6)為電容兩端電壓,式(7)為流過電容的電流;對于每個電感元件,需列寫方程:
式(8)為流過電感的電流,式(9)為電感兩端電壓。
至此,共列寫了n′-1+b′+p+q個獨立方程,而此時未知量共有n′-1+b′+2p+2q個,包括n′-1個結點電壓uk、b′個支路電流、p個電容電壓uCj及其p個導數個電感電流iLj及其q個導數由于未知量數恰比獨立方程數多p+q,根據線性代數理論可知,若將p個電容電壓uCj和q個電感電流iLj視為參量后解方程組,可關于狀態(tài)向量的函數,且各函數均為uCj,iLj的線性組合加一常數項的形式:
根據換路定則,在換路前后電容電流和電感電壓為有限值的條件下,由1.1節(jié)計算的穩(wěn)態(tài)解,可得到狀態(tài)變量的初始值,即uCj(0+)=uCj(0-),iLj(0+)=iLj(0-)。
根據狀態(tài)方程及狀態(tài)變量的初值,利用龍格庫塔法即可得到各狀態(tài)變量在時域內的數值解,進而可求出電路中任一電壓或電流的解。
軟件共分為4大部分:電路分析(SOLVER)、用戶界面(UI)、電路計算流程(CORE)和啟動器(STARTER)模塊。其中,SOLVER模塊用于對處理后的電路進行最基本的穩(wěn)態(tài)或動態(tài)分析;UI模塊負責與用戶進行交互式操作;CORE模塊是對SOLVER和UI模塊的整合運用,同時負責兩個模塊之間的數據轉換與傳遞;STARTER是整個程序的入口,負責UI和CORE模塊的初始化及啟動。程序各部分間的關系結構如圖3所示。
圖3 程序架構
電路分析模塊由3部分組成:分析器(ANALYZER)、電路元件模塊(ELEMENT)和公用模塊(COMMON)。其中,分析器包含穩(wěn)態(tài)分析器(STEADY)和動態(tài)分析器(DYNAMIC),穩(wěn)態(tài)分析器用于對穩(wěn)態(tài)的電阻電路進行結點電壓和支路電流的求解,動態(tài)分析器用于在給定動態(tài)電路初始條件的前提下對其進行暫態(tài)分析;電路元件模塊包含一系列理想電路元件類,每種元件類都包含相應的元件參數和附加VCR方程作為類的屬性;公用模塊包含一些常用的工具類或方法。模塊結構如圖4所示。
圖4 電路分析模塊結構
2.1.1 線性代數方程組的求解
在電路穩(wěn)態(tài)和動態(tài)求解中,分別需要對不含符號參數和含符號參數的線性代數方程組進行求解。對于這兩種計算情境,可使用SymPy這一用于符號計算的第3方庫。具體實現為調用sympy.solvers.solvers.solve函數對方程組進行求解,其內部會將線性方程組先轉化為標準的矩陣形式Ax=b,再使用高斯消元法求解[7]。
2.1.2 非齊次線性微分方程組的數值求解
用戶界面一方面用于輸入電路結構參數,另一方面用于圖形結果顯示。軟件采用了第3方Pygame庫進行用戶界面的開發(fā),其優(yōu)勢在于繪圖函數豐富全面、開發(fā)靈活度較高。
用戶界面模塊的結構如圖5所示,主要由7個子模塊構成:渲染器(RENDERER)、電路繪制面板(BOARD)、命令輸入欄(PROMPT)、狀態(tài)欄(STATUSBAR)、結果顯示欄(RESULTBAR)、管理器(MANAGER)和圖像繪制器(PLOTTER)。其中渲染器負責各窗體控件的繪制與渲染;管理器負責對用戶發(fā)出的鼠標操作或輸入的命令進行解釋和執(zhí)行,并對各控件進行數據更新,起到管理全局的作用。
圖5 用戶界面模塊結構
用戶界面的運行流程如圖6所示,在程序主循環(huán)中,對事件隊列進行遍歷,根據事件的類型進行相應操作;直至事件隊列為空,繪制各控件并更新窗口畫面,開始新一輪的循環(huán)過程。
圖6 用戶界面運行流程
本文開發(fā)的用戶界面如圖7所示,用戶可通過鼠標操作或在命令輸入欄中輸入命令的方式,在電路繪制面板上繪制待分析的電路原理圖,并進行電路自動分析及結果顯示。本軟件涉及的各項命令見表1。
表1 各命令行的名稱及功能
圖7 用戶界面布局
2.2.1 電路結構參數輸入
對于只包含二端元件的電路,可以將其抽象成一個有向圖G=(V,E),其中點集V與電路中各結點對應,邊集E與各元件對應。本軟件采用鄰接表存儲有向圖[10],其優(yōu)勢在于時空復雜度一般較低,且編碼難度低,使用Python中的嵌套列表即可實現。
針對電路結點編號,軟件采用了并查集這一用于處理若干不交集的合并與查詢問題的數據結構進行處理[11]。對于一個僅含有b個二端元件的電路,若忽略其導線,則該電路對應的有向圖初始包含2b個頂點,每個頂點單獨成一集合。連接導線的過程可視為使用并查集合并點集的過程。當所有合并操作完成后,統計每個點集的代表元素,再重新分配連續(xù)編號即可。
2.2.2 繪制響應曲線
繪制響應曲線采用了第3方繪圖庫Matplotlib[12],其提供了功能齊全的圖像可視化操作界面。借助該操作界面,用戶可對結果圖像進行各種高級操作,如選定區(qū)域放大、設置光標及導出圖像等。
電路計算流程模塊在整合運用SOLVER和UI模塊的基礎上,實現了一系列的電路計算流程函數,起到了在SOLVER和UI兩模塊之間進行數據處理與傳輸的作用。
以該模塊中的電路暫態(tài)分析流程為例:CORE模塊首先從UI模塊中獲取原始電路數據,再參考1.1節(jié)的方法得到原始動態(tài)電路對應的t=0-時刻的穩(wěn)態(tài)電路,將其傳遞至SOLVER模塊進行穩(wěn)態(tài)求解,因此得到狀態(tài)變量的初始值。將初始值以及處理后的動態(tài)電路數據傳遞至SOLVER模塊進行動態(tài)求解,得到原電路的時域數值解。最終該模塊會將數值解傳遞至UI模塊進行響應曲線的繪制。
當啟動器作為程序入口時,它會對CORE、UI模塊進行初始化,并調用UI模塊的啟動函數,達到啟動程序的作用。
在圖1所示電路中,US=4V,R1=R2=2Ω,R3=R4=R5=1Ω,L1=L2=2 H,L3=4 H,C1=C2=1 F,r=0.5Ω,在t=0時刻,開關S1閉合,S2斷開。使用本軟件對圖1電路進行暫態(tài)分析,得到u1,u2,i1,i2的響應曲線如圖8所示。為驗證正確性,本文借助Simulink對圖1電路進行仿真,原理圖如圖9所示,仿真結果如圖10所示。為比對結果,計算本軟件得到的結果和Simulink仿真結果的絕對誤差Δu1,Δu2,Δi1,Δi2,得到圖11所示曲線,誤差數量級為10-3,說明本軟件對線性動態(tài)電路的暫態(tài)分析是準確的。
圖8 使用本軟件得到的響應圖像
圖9 Simulink仿真原理圖
圖10 Simulink仿真結果
圖11 絕對誤差曲線
本文針對求解線性動態(tài)電路響應時域數值解,使用Python語言設計并實現了一個線性動態(tài)電路可視化自動分析軟件。該軟件的優(yōu)點有:①擁有交互式的圖形化用戶界面,操作簡單直觀;②采用狀態(tài)方程和龍格庫塔法的分析方法,精度高,且適用于任意階的線性動態(tài)電路,實用性和普適性強;③采用Python語言編寫,可擴展性和可移植性強,易于進行二次開發(fā),便于集成到其他系統。該軟件的設計與實現,為線性動態(tài)電路暫態(tài)分析的仿真計算提供了便捷、高效且實用的工具。實踐表明,在計算機專業(yè)學生中開展此類課程設計項目對激發(fā)學生學習興趣是非常有益的,既加深了對電路理論知識的學習,又鍛煉了借助計算機手段解決實際電路問題的能力,對培養(yǎng)新工科人才起到了積極作用。