Octave:用于数学的免费高级语言

作者:Malcolm Murphy

对于数值计算,高级语言比 FORTRAN 或 C 等更传统的语言具有优势。内置的图形功能、自动变量类型和灵活的数据结构结合在一起,提供了一个易于开发您的想法的环境,而无需与语言本身作斗争。这并不是说 FORTRAN 和 C 没有用处,只是有时候您想要让生活更轻松一些。

Matlab 就是这样一种语言。它在许多平台(包括 Linux)上可用,并为操作矩阵以及其他数值函数提供了强大的功能。不幸的是,Matlab 是商业软件,直到最近(大约在过去的十二个月左右)才在 Linux 上可用。然而,还有其他免费的替代品,Octave 就是其中之一。

从表面上看,Octave 非常像 Matlab,其 LSM 条目中的描述是“GNU Matlab——一个数值矩阵数学程序。” 要开始使用,请在 shell 提示符下键入 octave,Octave 会以自己的提示符问候您。现在我们可以开始进行数学运算了。

矩阵运算

正如您可能期望的那样,输入和操作矩阵是 Octave 的优势之一。(为了区分 Octave 命令和输出,在下面的示例中,提示符 octave:命令编号 位于命令之前。)我们可以使用以下命令输入矩阵

octave:1 a=[1 2 ; 3 4]

然后 Octave 报告命令的结果,即

a =
        1  2
        3  4
要抑制输出,只需在命令后放置一个分号。请注意,我们不必担心声明矩阵 a 的大小或类型,我们只需键入它并开始使用它。例如,我们可以通过键入以下命令来获得 a 的转置:
octave:2 a'
      ans =
        1  3
        2  4
算术运算符(例如 +-*)充当矩阵运算符,除非它们前面有一个句点,在这种情况下,它们按元素方式运算。Octave 还提供了正斜杠和反斜杠运算符,用于执行矩阵右除和左除。同样,这些可以以元素方式使用。因此,给定另一个矩阵
octave:3 b=[1 0; 3 2]
b =
  1  0
  3  2
我们可以使用以下命令找到 ab 的矩阵乘积:
octave:4 a*b
ans =
   7   4
  15   8
或者定义乘积的 (i,j)th 项为 ab 中 (i,j) 项的乘积,命令如下:
octave:5 a.*b
ans =
  1  0
  9  8
矩阵元素可以很容易地通过索引选择,因此要获取 a 的 (1,1) 项,请键入
octave:6 a(1,1)
ans=1
我们可以使用冒号运算符选择行或列,就像在 Matlab 中一样。因此,要选择 a 的第一列,请键入命令
octave:7 a(:,1)
ans =
  1
  3
要选择 a 的第一行,请键入
octave:8 a(1,:)
ans =
  1  2
除了这些基本运算之外,Octave 还提供了执行更高级别运算的函数,例如通过使用以下命令来查找矩阵的特征值
octave:9 eig(a)
ans =
   5.37228
  -0.37228
或者,您可以通过给出以下命令来查找特征值和特征向量
octave:10 [v,d]=eig(a)
v =
   0.41597  -0.82456
   0.90938   0.56577
d =
   5.37228   0.00000
   0.00000  -0.37228
这演示了使用像 Octave 这样的高级语言的主要优势之一。编写 FORTRAN 或 C 程序来查找矩阵的特征值将比在 Octave 中花费更多的时间和精力。此外,Octave 例程通常基于著名的、高质量的算法,因此您可以对结果充满信心。

Octave 提供了许多其他矩阵例程,这些例程在手册和在线帮助系统中详细说明。

用户自定义函数

Octave 还允许用户通过 function 关键字定义自己的函数。函数定义如下所示

function [output values] = name (input values)
   sequence of commands
endfunction

输入值和输出值是可选的,因此可以编写一个不接受参数且不返回值的函数,例如

octave:11 function hello
   printf("hello\n")
endfunction
printf 语句将引号括起来的字符串打印到屏幕上,而 \n 被解释为换行符。通过键入其名称来调用该函数
octave:12 hello
   hello
显然,不接受参数或返回值的函数并不是很有用。要接受参数,请按以下方式在函数名称后列出它们
octave:13 function add(x,y)
   x+y
endfunction
octave:14 add(1,2)
   ans = 3
输出来自语句 x+y——如果我们以分号结束该行,则 add 命令将不会有任何输出。要将输出分配给变量,请按以下方式定义函数
octave:15 function sum=add(x,y)
   sum=x+y;
endfunction
现在,如果我们键入 add(1,2),我们将获得与之前完全相同的结果。但是,通过定义一个输出变量,我们可以通过以下方式将 add 函数的结果分配给一个变量
octave:16 fred=add(1,2)
   fred=3
Octave 的一个非常强大的功能是能够从函数返回多个值。此功能在 Matlab 中存在,但在 FORTRAN 中不存在。例如,以下函数
octave:17 function [sum,diff]=sumdiff(x,y)
   sum=x+y;
   diff=x-y;
endfunction
在调用时返回多个值,如下所示
octave:18 ns,d]=sumdiff(1,2)
   s = 3
   d = -1
函数可以在键盘上定义(如我们在这些示例中所做的那样),也可以存储在文件中并再次使用。这使您可以构建一套例程来完成您想要的任何任务。您所要做的就是将文件(以 .m 后缀标识)放在 Octave 可以找到它们的地方。内置变量 LOADPATH 指定 Octave 应该在何处查找 .m 文件。Octave 的许多标准函数都在 .m 文件中定义。您还可以在 Octave 中访问用户提供的 C++ 例程,尽管此功能尚未完全开发。

Octave 还提供了完整的编程语言,具有流程控制和循环结构,以及广泛的输入输出功能。可以使用 Octave 编写相当复杂的程序,并且开发时间比您使用 FORTRAN 或 C 预期的要短得多。

其他功能

虽然 Octave 具有非常强大的矩阵功能,但它也具有许多其他功能。例如,它具有操作多项式的例程。多项式作为系数向量输入;因此,例如,多项式 x3+3x2+2x-1 可以用向量表示

octave:19 mypoly=[1 3 2 -1]
   mypoly =
     1   3   2  -1

然后我们可以使用以下命令区分 mypoly

octave:20 polyderiv(mypoly)
   ans =
     3  6  2
或通过以下方式积分它
octave:21 polyinteg(mypoly)
  ans =
  0.25000   1.00000   1.00000  -1.00000   0.00000
请注意,Octave 使用零作为积分常数。我们还可以在给定值处评估多项式;因此,要查找 mypoly(2) 的值,请使用命令
octave:22 polyval(mypoly,2)
   ans = 23
如果我们想要多项式的根,请使用
octave:23 roots(mypoly)
   ans =
     -1.66236 + 0.56228i
     -1.66236 - 0.56228i
      0.32472 + 0.00000i
请注意,Octave 非常乐于处理复数,即使我给出的所有示例都是实数。还有一些例程可以卷积和反卷积多项式、形成伴随矩阵和特征多项式,以及形成两个矩阵的商的部分分式表示。

其他功能包括求解非线性方程组、求解微分方程和微分代数方程、执行正交和配置,以及统计、控制理论、信号处理、图像处理和优化例程。该手册指出了开发人员希望扩展 Octave 功能的领域。

图形

Octave 通过 Gnuplot 程序提供图形功能,该程序必须单独获取。这样做的好处是 Octave 支持 Gnuplot 支持的所有输出设备,包括 Linux 终端,如果您有低内存系统,这可能会引起您的兴趣。

Octave 提供了两个低级图形函数 gplotgsplot,它们的行为几乎与 Gnuplot 函数 plotsplot 完全相同,并且还提供了几个基于 Matlab 3.5 中图形函数的高级绘图函数。二维和三维绘图命令也可用。

如果您熟悉 Gnuplot,那么您可能会欣赏访问 Gnuplot 命令所提供的灵活性。但是,Octave 提供的高级命令非常易于使用,您可能会发现您根本不必使用 Gnuplot 命令。

结论

Octave 是一种灵活、强大、易于使用的高级语言,专为数值计算而设计。它附带一本非常易读的 200 多页用户手册,以及一个基于 GNU info 系统的帮助系统。高级语言相对于 FORTRAN 等语言的主要优势在于,使用高级语言通常可以大大缩短开发时间。这允许轻松进行原型设计和实验。

虽然文档没有声称 Octave 旨在成为 Matlab 克隆或与 Matlab 兼容,但 Octave 可能是免费提供的高级语言中最像 Matlab 的语言。它并不完全相同,但我能够非常轻松地将一套执行 Navier-Stokes 方程的有限元分析的 Matlab m 文件转换为 Octave。

Octave 具有比我在此处描述的更多的功能,但我提供了其主要优势的概述。如果您正在寻找用于数值工作的语言,Octave 肯定是一个选择。我不认为您可以直接将 Octave 与 RLaB、SciLab 和 Yorick 等语言进行比较——它们都做不同的事情,而您选择哪种语言取决于您想做什么以及个人偏好。我的偏好是 Octave。

Octave: A Free, High-Level Language for Mathematics
Malcolm Murphy 仍然希望他在年轻时放弃单簧管课程之前就发现了爵士乐。他认为自己太老(或太懒)而无法重新开始,所以他改弹吉他。如果您有不可抑制的冲动想给他发送电子邮件,他的地址是 Malcolm.Murphy@bristol.ac.uk。
加载 Disqus 评论