王子玮,余景原,许国泰
(上海市信息网络有限公司,上海 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程序代码短小高效,可以大大提高解析电路问题的效率,特别是因为其拥有免费、可自由复制的优点,在重视知识产权和成本的今天特别适合在学校、科研机构以及企业中推广应用。