王子瑋,余景原,許國泰
(上海市信息網絡有限公司,上海 200081)
Matlab作為最常用的科學計算語言軟件之一,被廣泛應用于控制系統設計與分析、圖像處理、信號處理與通訊、金融建模和分析、電路設計與分析等眾多工程領域[1-5]。但眾所周知,Matlab是商業收費軟件,雖然對學校有較大優惠,但對于科研單位,特別是企業用戶,需要收取昂貴的使用授權費,給企業科研單位造成了沉重的經濟成本負擔。文章將介紹一個可替代Matlab的免費開源軟件GNU Octave[6-8]。該軟件擁有幾乎與Matlab相當的強大科學計算能力以及繪圖功能,并已在美國、歐洲等知名大學和科研機構被廣泛應用[8],特別是最近,該語言在斯坦福大學的AI課程中被推薦使用,這使該語言受到了更廣泛的關注。文章將重點介紹該軟件在電路分析仿真中的應用。
由于迄今為止Octave在國內應用較少,中文資料缺乏,為了便于讀者了解,文章首先對包括Octave的歷史發展在內的基本情況做概括性的說明,并通過與大家熟悉的Matlab比較來說明該軟件的特點。其次通過具體的電路分析實例,介紹該軟件符號強大、數值計算和繪圖等功能。另外,由于該軟件需要自行下載安裝,為了提供方便,將在下文中給出GNU Octave(+symbolic package)Window版的具體安裝步驟。
Octave是一種采用高級編程語言的科學計算軟件,主要用于解決線性和非線性的數值計算問題。Octave的語法與Matlab的語法非常接近,可以很容易地將Matlab程序移植到Octave。Octave為GNU項目下的開源免費軟件,在GNU通用公共許可證條款所規定的條件下可以自由地復制、流通與使用,作為Matlab的主要替代品之一,擁有和Matlab相似的功能。Octave可在大部分的類Unix操作系統中運行,亦可在Microsoft Windows,Mac OS X,BSD操作系統中運行。
Octave的開發始于1988年,最初目的是被用作一本名為《化學反應器設計》的大學本科課程教材的輔助軟件。該軟件的系統性開發則是由John W. Eaton在1992年接手后才開始的。第一個alpha測試版于1993年1月4日發布,1.0穩定版則是在1994年2月17日發布。當前的最新版本是5.2.0版,發布于2020年1月31日。該軟件的名字Octave則源于開發者John W. Eaton的指導教授、特別擅長復雜問題快速估算的元俄勒岡州立大學(Oregon State University)化工系教授奧克塔夫·列文斯比爾(Octave Levenspiel)之名。
Octave是使用C++語言及其標準模板庫編寫的軟件,從編程語言的分類屬性來講,屬于解釋性(直譯式)及面向過程的結構化編程語言,支持許多C語言風格的標準函數功能,同時可以使用UNIX系統調用以進行擴充增進功能,但不支持以引用的方式傳遞參數。在3.2以后的版本中,增加了對數據建構的支持以及面向對象編程的功能,但通常仍把它當作面向過程的程序設計語言來看待。Octave 4.0以后的版本,由于使用基于OpenGL的圖形處理引擎,所實現的繪圖功能可與Matlab媲美。新版本也開始支持基于OpenMP的單主機多核/多CPU并行計算,并且,4.0.0以后的版本除了提供傳統的命令行交互方式操作界面,也提供基于QT編寫的圖形用戶交互界面(Graphical User Interface,GUI),適合于習慣Windows界面的用戶。
Octave的核心由一組內置的(built-in)矩陣運算語言(如四則運算)和可加載函數(Loadable Function)組成(例如求矩陣逆inv),其余能在核心語言之上實現且性能開銷不會顯著增加的函數調用則一般以Octave腳本的形式存在(例如求解方程組的fsolve函數)。Octave解釋器會自動處理各種不同類型的調用。它的語法基本上與Matlab一致,嚴謹編寫的代碼應可同時在Matlab及Octave上運行。但若調用了Matlab工具包,則一般不能直接在Octave上運行,因為Octave附帶的工具包與Matlab并不兼容。表1給出了Octave和Matlab的主要性能比較,從中可以看出, Octave能實現Matlab的大部分基本功能,雖然在速度、外延工具包支持等方面還有一些差距,但Octave的最大優勢就是完全免費,可以自由復制安裝,因此該軟件作為Matlab的低成本替代軟件之一,為學校、企業和研究單位提供了一個高性價比的數學計算工具,具有良好的應用前景。

表1 Octave與Matlab的主要新能比較
文章給出兩個具體的電路分析仿真實例,第一個例子重點介紹Octave的符號計算功能,第二個例子則重點展示符號計算與數值計算的混合使用以及繪圖功能。為了方便讀者理解,首先寫出傳統的解析過程,再給出Octave的計算程序。


(1)
(2)
其中
(3)
根據歐姆定律,可以求出各阻抗中的電流。
(4)
I-5=0
(5)
上述的計算過程若用Octave的符號計算功能來實現則很簡單。以下給出計算程序并做出必要說明。

圖1 惠斯通電橋電路
% Octave以及symbolic模塊的安裝過程參見附錄
pkg load symbolic %調用符號運算模塊
syms Z0 Z1 Z2 Z3 Z4 Z5; %定義阻抗變量
UZ=[ 1/Z0+1/Z1+1/Z2-1/Z1-1/Z2;
-1/Z11/Z1+1/Z3+1/Z5-1/Z5;
-1/Z2-1/Z5 1/Z2+1/Z5+1/Z4] %定義阻抗矩陣
syms E EaEb Ed; %定義電源及各節點電壓
Es=[E/Z0; 0; 0] %定義電源電壓矩陣
Eu=simplify(UZ^(-1)*Es) %求解方程(1),并簡化結果
Ea=Eu(1) %把求得結果賦值給Ea
Eb=Eu(2) %把求得結果賦值給Eb
Ed=Eu(3) %把求得結果賦值給Ec
syms I1 I2 I3 I4 I5; %定義電流變量
I0=simplify((E-Ea)/Z0) %計算式(4)
I1=simplify((Ea-Eb)/Z1) %計算式(4)
I2=simplify((Ea-Ed)/Z2) %計算式(4)
I3=simplify(Eb/Z3) %計算式(4)
I4=simplify(Ed/Z4) %計算式(4)
I5=simplify((Eb-Ed)/Z2) %計算式(4)
solve(I5==0, Z1) %求解方程(5)獲得電橋平衡條件
圖2給出一個帶開關的串聯RL電路,電路中接入交流正弦電壓源e(t)=Emsint。求解把處于打開狀態的開關閉合后的動態電流i(t),并在=1 000 rad/s,R=100,Em=10 V,L=1 H條件下求出電流隨時間變化的曲線[9]。
根據基爾霍夫電壓定律和歐姆定律可獲得開關關閉狀態下的電路方程(6)。
(6)
對方程(6)的兩邊進行拉普拉斯變換可得到
(7)
其中
(8)

圖2 正弦交流RL動態電路
整理(7)可求得以下I(s):
(9)
對(9)進行拉普拉斯反變換,可獲得所要求取得的時域動態電流i(t)。這里由于篇幅原因,省略拉普拉斯反變換的具體計算過程,僅給出結果。
(10)
以下是Octave的符號計算程序以及必要說明,可以看出Octave的程序非常短小。
pkg load symbolic %加載符號運算模塊
syms s t Is R w Em L positive %定義變量為正
Eq1=R*Is+s*L*Is-w*Em/(s^2+w^2); %電路方程(7)
Iss=solve(Eq1, Is) %求解電流I(s) (方程(9))
it=ilaplace(Iss, s, t) %拉普拉斯反變換求i(t)(方程(10))
進一步使用Octave的數值計算功能求取問題中給出條件下的電流隨時間的變化曲線,Octave的程序如下。利用Octave的作圖功能所做的圖形在圖3中給出。
itt=function_handle(it) %把符號公式轉換成標準函數
tt=0:0.0001:0.05; %產生0到0.05s的離散時間序列
y=itt(10,1,100, tt, 1000); % 代入Em,L,R,的值
plot(tt,y) %繪制電流的時間變化曲線
axis([0 0.0501 -0.0201 0.0201]); %x,y軸的范圍設定
title(′RL circuit′); %添加圖像標題
xlabel(′time(s)′); %添加x軸標題
ylabel(′i(t)(A)′); %添加y軸標題
set(gca, "fontsize", 20) %設置字體大小

圖3 Octave求得并給出的圖2中RL電路中的動態電流
GNU Octave支持包括GNU/Linux,macOS,BSD,Windows在內的多種操作系統,由于論文長度的限制,在此僅介紹Octave在Windows操作系統中的安裝過程。
(1)GNU Octave需要Java SE Runtime Environment環境,對于未安裝的用戶可從以下網頁鏈接下載。
(2)從GNU Octave主頁下載Octave的最新版安裝程序,并安裝(當前的最新版為Octave-5.2.0_1)。
(3)安裝符號運算模塊「Symbolic package」。
(1)下載symbolic-win-py-bundle-2.8.0.tar.gz至工作目錄。
(2)啟動Octave,確認當前目錄為工作目錄,然后在界面中輸入以下內容:
pkg install symbolic-win-py-bundle-2.8.0.tar.gz
pkg load symbolic %調用模塊。
(3)syms a %定義a為符號變量。
(4)若未出現錯誤提示,表明符號運算模塊安裝成功。
(1)從Python的主頁下載最新版本(python-3.8.1)并安裝。
(2)下載Anaconda3-2019.10-Windows-x86_64并安裝。
(3)啟動Octave,確認當前目錄為工作目錄,然后在界面中輸入以下內容:
pkg install symbolic-win-py-bundle-2.8.0.tar.gz
pkg install-forge symbolic
setenv PYTHON/a·naconda3/bin/python/
pkg load symbolic %調用模塊。
(4)syms a %定義a為符號變量。
(5)若未出現錯誤提示,表明符號運算模塊安裝成功。
文章介紹了一個與Matlab具有相似功能的免費開源科學計算軟件Octave。通過其在電路分析中的應用實例展示了Octave的強大符號運算、數值運算以及繪圖功能,也證明了其可被作為電路分析的有效輔助工具。Octave程序代碼短小高效,可以大大提高解析電路問題的效率,特別是因為其擁有免費、可自由復制的優點,在重視知識產權和成本的今天特別適合在學校、科研機構以及企業中推廣應用。