王子瑋,余景原,許國泰
(上海市信息網(wǎng)絡(luò)有限公司,上海 200081)
Matlab作為最常用的科學(xué)計(jì)算語言軟件之一,被廣泛應(yīng)用于控制系統(tǒng)設(shè)計(jì)與分析、圖像處理、信號(hào)處理與通訊、金融建模和分析、電路設(shè)計(jì)與分析等眾多工程領(lǐng)域[1-5]。但眾所周知,Matlab是商業(yè)收費(fèi)軟件,雖然對(duì)學(xué)校有較大優(yōu)惠,但對(duì)于科研單位,特別是企業(yè)用戶,需要收取昂貴的使用授權(quán)費(fèi),給企業(yè)科研單位造成了沉重的經(jīng)濟(jì)成本負(fù)擔(dān)。文章將介紹一個(gè)可替代Matlab的免費(fèi)開源軟件GNU Octave[6-8]。該軟件擁有幾乎與Matlab相當(dāng)?shù)膹?qiáng)大科學(xué)計(jì)算能力以及繪圖功能,并已在美國、歐洲等知名大學(xué)和科研機(jī)構(gòu)被廣泛應(yīng)用[8],特別是最近,該語言在斯坦福大學(xué)的AI課程中被推薦使用,這使該語言受到了更廣泛的關(guān)注。文章將重點(diǎn)介紹該軟件在電路分析仿真中的應(yīng)用。
由于迄今為止Octave在國內(nèi)應(yīng)用較少,中文資料缺乏,為了便于讀者了解,文章首先對(duì)包括Octave的歷史發(fā)展在內(nèi)的基本情況做概括性的說明,并通過與大家熟悉的Matlab比較來說明該軟件的特點(diǎn)。其次通過具體的電路分析實(shí)例,介紹該軟件符號(hào)強(qiáng)大、數(shù)值計(jì)算和繪圖等功能。另外,由于該軟件需要自行下載安裝,為了提供方便,將在下文中給出GNU Octave(+symbolic package)Window版的具體安裝步驟。
Octave是一種采用高級(jí)編程語言的科學(xué)計(jì)算軟件,主要用于解決線性和非線性的數(shù)值計(jì)算問題。Octave的語法與Matlab的語法非常接近,可以很容易地將Matlab程序移植到Octave。Octave為GNU項(xiàng)目下的開源免費(fèi)軟件,在GNU通用公共許可證條款所規(guī)定的條件下可以自由地復(fù)制、流通與使用,作為Matlab的主要替代品之一,擁有和Matlab相似的功能。Octave可在大部分的類Unix操作系統(tǒng)中運(yùn)行,亦可在Microsoft Windows,Mac OS X,BSD操作系統(tǒng)中運(yùn)行。
Octave的開發(fā)始于1988年,最初目的是被用作一本名為《化學(xué)反應(yīng)器設(shè)計(jì)》的大學(xué)本科課程教材的輔助軟件。該軟件的系統(tǒng)性開發(fā)則是由John W. Eaton在1992年接手后才開始的。第一個(gè)alpha測(cè)試版于1993年1月4日發(fā)布,1.0穩(wěn)定版則是在1994年2月17日發(fā)布。當(dāng)前的最新版本是5.2.0版,發(fā)布于2020年1月31日。該軟件的名字Octave則源于開發(fā)者John W. Eaton的指導(dǎo)教授、特別擅長復(fù)雜問題快速估算的元俄勒岡州立大學(xué)(Oregon State University)化工系教授奧克塔夫·列文斯比爾(Octave Levenspiel)之名。
Octave是使用C++語言及其標(biāo)準(zhǔn)模板庫編寫的軟件,從編程語言的分類屬性來講,屬于解釋性(直譯式)及面向過程的結(jié)構(gòu)化編程語言,支持許多C語言風(fēng)格的標(biāo)準(zhǔn)函數(shù)功能,同時(shí)可以使用UNIX系統(tǒng)調(diào)用以進(jìn)行擴(kuò)充增進(jìn)功能,但不支持以引用的方式傳遞參數(shù)。在3.2以后的版本中,增加了對(duì)數(shù)據(jù)建構(gòu)的支持以及面向?qū)ο缶幊痰墓δ?,但通常仍把它?dāng)作面向過程的程序設(shè)計(jì)語言來看待。Octave 4.0以后的版本,由于使用基于OpenGL的圖形處理引擎,所實(shí)現(xiàn)的繪圖功能可與Matlab媲美。新版本也開始支持基于OpenMP的單主機(jī)多核/多CPU并行計(jì)算,并且,4.0.0以后的版本除了提供傳統(tǒng)的命令行交互方式操作界面,也提供基于QT編寫的圖形用戶交互界面(Graphical User Interface,GUI),適合于習(xí)慣Windows界面的用戶。
Octave的核心由一組內(nèi)置的(built-in)矩陣運(yùn)算語言(如四則運(yùn)算)和可加載函數(shù)(Loadable Function)組成(例如求矩陣逆inv),其余能在核心語言之上實(shí)現(xiàn)且性能開銷不會(huì)顯著增加的函數(shù)調(diào)用則一般以O(shè)ctave腳本的形式存在(例如求解方程組的fsolve函數(shù))。Octave解釋器會(huì)自動(dòng)處理各種不同類型的調(diào)用。它的語法基本上與Matlab一致,嚴(yán)謹(jǐn)編寫的代碼應(yīng)可同時(shí)在Matlab及Octave上運(yùn)行。但若調(diào)用了Matlab工具包,則一般不能直接在Octave上運(yùn)行,因?yàn)镺ctave附帶的工具包與Matlab并不兼容。表1給出了Octave和Matlab的主要性能比較,從中可以看出, Octave能實(shí)現(xiàn)Matlab的大部分基本功能,雖然在速度、外延工具包支持等方面還有一些差距,但Octave的最大優(yōu)勢(shì)就是完全免費(fèi),可以自由復(fù)制安裝,因此該軟件作為Matlab的低成本替代軟件之一,為學(xué)校、企業(yè)和研究單位提供了一個(gè)高性價(jià)比的數(shù)學(xué)計(jì)算工具,具有良好的應(yīng)用前景。
表1 Octave與Matlab的主要新能比較
文章給出兩個(gè)具體的電路分析仿真實(shí)例,第一個(gè)例子重點(diǎn)介紹Octave的符號(hào)計(jì)算功能,第二個(gè)例子則重點(diǎn)展示符號(hào)計(jì)算與數(shù)值計(jì)算的混合使用以及繪圖功能。為了方便讀者理解,首先寫出傳統(tǒng)的解析過程,再給出Octave的計(jì)算程序。
(1)
(2)
其中
(3)
根據(jù)歐姆定律,可以求出各阻抗中的電流。
(4)
I-5=0
(5)
上述的計(jì)算過程若用Octave的符號(hào)計(jì)算功能來實(shí)現(xiàn)則很簡(jiǎn)單。以下給出計(jì)算程序并做出必要說明。
圖1 惠斯通電橋電路
% Octave以及symbolic模塊的安裝過程參見附錄
pkg load symbolic %調(diào)用符號(hào)運(yùn)算模塊
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; %定義電源及各節(jié)點(diǎn)電壓
Es=[E/Z0; 0; 0] %定義電源電壓矩陣
Eu=simplify(UZ^(-1)*Es) %求解方程(1),并簡(jiǎn)化結(jié)果
Ea=Eu(1) %把求得結(jié)果賦值給Ea
Eb=Eu(2) %把求得結(jié)果賦值給Eb
Ed=Eu(3) %把求得結(jié)果賦值給Ec
syms I1 I2 I3 I4 I5; %定義電流變量
I0=simplify((E-Ea)/Z0) %計(jì)算式(4)
I1=simplify((Ea-Eb)/Z1) %計(jì)算式(4)
I2=simplify((Ea-Ed)/Z2) %計(jì)算式(4)
I3=simplify(Eb/Z3) %計(jì)算式(4)
I4=simplify(Ed/Z4) %計(jì)算式(4)
I5=simplify((Eb-Ed)/Z2) %計(jì)算式(4)
solve(I5==0, Z1) %求解方程(5)獲得電橋平衡條件
圖2給出一個(gè)帶開關(guān)的串聯(lián)RL電路,電路中接入交流正弦電壓源e(t)=Emsint。求解把處于打開狀態(tài)的開關(guān)閉合后的動(dòng)態(tài)電流i(t),并在=1 000 rad/s,R=100,Em=10 V,L=1 H條件下求出電流隨時(shí)間變化的曲線[9]。
根據(jù)基爾霍夫電壓定律和歐姆定律可獲得開關(guān)關(guān)閉狀態(tài)下的電路方程(6)。
(6)
對(duì)方程(6)的兩邊進(jìn)行拉普拉斯變換可得到
(7)
其中
(8)
圖2 正弦交流RL動(dòng)態(tài)電路
整理(7)可求得以下I(s):
(9)
對(duì)(9)進(jìn)行拉普拉斯反變換,可獲得所要求取得的時(shí)域動(dòng)態(tài)電流i(t)。這里由于篇幅原因,省略拉普拉斯反變換的具體計(jì)算過程,僅給出結(jié)果。
(10)
以下是Octave的符號(hào)計(jì)算程序以及必要說明,可以看出Octave的程序非常短小。
pkg load symbolic %加載符號(hào)運(yùn)算模塊
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))
進(jìn)一步使用Octave的數(shù)值計(jì)算功能求取問題中給出條件下的電流隨時(shí)間的變化曲線,Octave的程序如下。利用Octave的作圖功能所做的圖形在圖3中給出。
itt=function_handle(it) %把符號(hào)公式轉(zhuǎn)換成標(biāo)準(zhǔn)函數(shù)
tt=0:0.0001:0.05; %產(chǎn)生0到0.05s的離散時(shí)間序列
y=itt(10,1,100, tt, 1000); % 代入Em,L,R,的值
plot(tt,y) %繪制電流的時(shí)間變化曲線
axis([0 0.0501 -0.0201 0.0201]); %x,y軸的范圍設(shè)定
title(′RL circuit′); %添加圖像標(biāo)題
xlabel(′time(s)′); %添加x軸標(biāo)題
ylabel(′i(t)(A)′); %添加y軸標(biāo)題
set(gca, "fontsize", 20) %設(shè)置字體大小
圖3 Octave求得并給出的圖2中RL電路中的動(dòng)態(tài)電流
GNU Octave支持包括GNU/Linux,macOS,BSD,Windows在內(nèi)的多種操作系統(tǒng),由于論文長度的限制,在此僅介紹Octave在Windows操作系統(tǒng)中的安裝過程。
(1)GNU Octave需要Java SE Runtime Environment環(huán)境,對(duì)于未安裝的用戶可從以下網(wǎng)頁鏈接下載。
(2)從GNU Octave主頁下載Octave的最新版安裝程序,并安裝(當(dāng)前的最新版為Octave-5.2.0_1)。
(3)安裝符號(hào)運(yùn)算模塊「Symbolic package」。
(1)下載symbolic-win-py-bundle-2.8.0.tar.gz至工作目錄。
(2)啟動(dòng)Octave,確認(rèn)當(dāng)前目錄為工作目錄,然后在界面中輸入以下內(nèi)容:
pkg install symbolic-win-py-bundle-2.8.0.tar.gz
pkg load symbolic %調(diào)用模塊。
(3)syms a %定義a為符號(hào)變量。
(4)若未出現(xiàn)錯(cuò)誤提示,表明符號(hào)運(yùn)算模塊安裝成功。
(1)從Python的主頁下載最新版本(python-3.8.1)并安裝。
(2)下載Anaconda3-2019.10-Windows-x86_64并安裝。
(3)啟動(dòng)Octave,確認(rèn)當(dāng)前目錄為工作目錄,然后在界面中輸入以下內(nèi)容:
pkg install symbolic-win-py-bundle-2.8.0.tar.gz
pkg install-forge symbolic
setenv PYTHON/a·naconda3/bin/python/
pkg load symbolic %調(diào)用模塊。
(4)syms a %定義a為符號(hào)變量。
(5)若未出現(xiàn)錯(cuò)誤提示,表明符號(hào)運(yùn)算模塊安裝成功。
文章介紹了一個(gè)與Matlab具有相似功能的免費(fèi)開源科學(xué)計(jì)算軟件Octave。通過其在電路分析中的應(yīng)用實(shí)例展示了Octave的強(qiáng)大符號(hào)運(yùn)算、數(shù)值運(yùn)算以及繪圖功能,也證明了其可被作為電路分析的有效輔助工具。Octave程序代碼短小高效,可以大大提高解析電路問題的效率,特別是因?yàn)槠鋼碛忻赓M(fèi)、可自由復(fù)制的優(yōu)點(diǎn),在重視知識(shí)產(chǎn)權(quán)和成本的今天特別適合在學(xué)校、科研機(jī)構(gòu)以及企業(yè)中推廣應(yīng)用。