Octave 入门
莫及
2011 年 1 月
目录
1 简介
1.1 Octave 是什么? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Octave 不是什么? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Octave 的适用对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4 与常见的高级语言 (如 C++) 的区别 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 简单计算
2.1 启动 Octave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Octave 简单计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 内建函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
4
4
4
4
4
4
5
5
3 Octave 环境
7
7
3.1 变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
3.2 数值及其格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
3.3 数值的表示和精度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
3.4 载入和保存数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5 重复之前命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
3.6 获得帮助 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.7 取消一个命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.8 分号和隐藏结果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4 数组和向量
11
4.1 构造向量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.2 冒号表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.3 大矩阵或矩阵的显示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.4 向量构造函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.5 向量中的元素操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.6 向量的计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
liuqiang@coer.zju.edu.cn
1
目录
2
5 画图
15
5.1 改进该图形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.2 Multiple graphs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.3 Multiple figures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.4 保存和打印图片 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6 Octave 编程 I:脚本文件
18
6.1 Path 问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6.2 创建和编辑脚本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
6.3 记住之前脚本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
7 控制语句
20
if...else 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
7.1
switch 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
7.2
for 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
7.3
7.4 while 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
8 Octave 编程 II:函数
23
8.1 实例 1: 角度制正弦函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
8.2 创建并使用函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
8.3 实例 2: 单位阶跃函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
9 矩阵和向量
26
9.1 矩阵乘法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
9.2 转置算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
9.3 矩阵创建函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
9.4 创建复合矩阵 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
9.5 提取矩阵元 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
10 基本矩阵函数
11 解决 Ax = b 类问题
31
33
12 画图进阶
33
12.1 子图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
12.2 3D 画图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
12.3 调整视角 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
12.4 绘制曲面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
13 本征向量和奇异值分解
35
14 复数
35
14.1 绘制复数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
14.2 多项式求根 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
目录
15 Octave 可执行程序
A 更多参考资料
B 声明
3
37
40
40
1 简介
4
1.1 Octave 是什么?
1 简介
Octave 是一款用于数值计算和绘图的开源软件。和 Matlab 一样,Octave 尤其精于矩阵运算:求解联立
方程组、计算矩阵特征值和特征向量等等。在许多的工程实际问题中,数据都可以用矩阵或向量表示出来而
问题转化为对这类矩阵的求解。另外,Octave 能够通过多种形式将数据可视化,并且 Octave 本身也是一门
编程语言而易于扩展。因此我们可以称 Octave 是一款非常强大的可编程可视化计算程序。Octave 让解决很
大范围内的数值问题变得简单,给使用者更多的时间来进行实验和考虑问题。
Octave 最初被开发时只是一款用于本科生化学课程的辅助程序。当前 Octave 项目的开发由 J.W.Eation
博士领导并遵循 GNU General Public Licence 发布。Octave 与科研和工程中普遍使用的 Matlab 基本兼容,
因此其易用性也越来越好。
1.2 Octave 不是什么?
Octave 是用于数值地解决数学问题的,即在计算机内存内处理相应的数值。因此 Octave 和 Mathemat-
ica、Maple 这类通过数学推导给出问题符号解的程序不同,它不能给出问题的精确解。这无所谓好或者坏
——不同软件处理不同的问题罢了。而且,很多实际的数学问题 (尤其是工程问题) 都没有解析解。
1.3 Octave 的适用对象
Octave 和 Maltab 被工程人员和科研人员广泛使用来进行各种工业和学术上的数值计算和仿真。例
如,NASA 使用它来开发飞行器的对接系统; Jaguar Racing 使用它来可视化和分析从 F1 赛车传来的数
据;Sheffield 大学用它来开发用于识别癌细胞的软件。Octave 这样的软件让编写数值处理程序变得简单,并
提供数据可视化的多种方式。
1.4 与常见的高级语言 (如 C++) 的区别
C++ 以及其他的常用的编程语言更多得用来编写具有特定功能的软件。然而,使用 C++ 来处理数值方
面的问题过于复杂费时,而且这样的编程语言不原生的支持一些数学概念或者生成图形。Octave 是专为解决
这类问题而设计的。即使人们最终使用 C++ 这样的语言来编写软件,他们很多时候都用 Octave 来编写软
件的原型或者数学部分,因为这样能够很快的检验其算法。
2 简单计算
2.1 启动 Octave
Octave 在 UNIX 环境下通过在终端中输入 octave 来启动,在启动 octave 之后,程序一般会显现如下这
样的信息:
GNU Octave, version 3.2.4
Copyright (C) 2009 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.
For details, type `warranty'.
2 简单计算
5
Octave was configured for "i486-pc-linux-gnu".
Additional information about Octave is available at http://www.octave.org.
Please contribute if you find this software useful.
For more information, visit http://www.octave.org/help-wanted.html
Report bugs to (but first, please read
http://www.octave.org/bugs.html to learn how to write a helpful report).
For information about changes from previous versions, type `news'.
Octave:1>
这表明你已经进入了 Octave 环境,其中 Octave:>1 为 Octave 命令提示符。
如果你要退出 Octave,只需要在命令提示符下输入 quit 或者 exit 即可。
2.2 Octave 简单计算
Octave 最简单的使用方式就是像使用一个计算器一样在命令提示符下输入相应的计算式。Octave 能识
别通常的计算表达式。例如,在终端输入
octave:##>2+2
并按回车键, 你将得到以下的结果
ans=4
各种计算符号的优先级与常规的一致,比如括号有最大优先级,其次为乘方,其次为乘除运算,最后为加减
运算。
2.3 内建函数
除了一些基本的计算符,Octave 还提供了一系列的常用数学函数,其中的一部分函数如表 1 所示。像
C++ 中调用函数一样,Octave 通过输入函数名和括号中的输入参数来调用函数,例如:
octave:##> exp(1)
ans=2.71813
又如另一个更长的表达式:计算 1:2 sin(40
+ ln(2:42)), 输入
octave:##>1.2*sin(40*pi/180+log(2.4^2))
ans=0.76618
在刚才的例子中,有以下的注意事项:
1. 在计算表达式中一个明确的乘号是必不可少的,比如在 1.2 和 sin 之间必须要的乘号。
2 简单计算
6
cos
sin
tan
exp
log
log10
sinh
tanh
cosh
acos
acosh
asin
asinh
atan
atan2
atanh
abs
sign
round
floor
ceil
fix
rem
表 1: 基本数学函数
余弦函数 (弧度制)
正弦函数 (弧度制)
正切函数 (弧度制)
指数函数 (ex)
以 e 为底的指数函数
以 10 为底的指数函数
双曲正弦函数
双曲正切函数
双曲余弦函数
反余弦函数
反双曲余弦函数
反正弦函数
反双曲正弦函数
反正切函数
双参数形式的反正切函数1
反双曲正切函数
绝对值函数 (复数取模)
符号函数
四舍五入
近似为比它小的最大整数
近似为比它大的最小整数
向 0 方向近似
求余数
3 OCTAVE 环境
7
2. 三角函数是使用的弧度制。角度制的可以通过乘以引子 /180 转换为弧度制。pi 是 Octave 中变量的一
个例子,这将在下一节中详细介绍。
3. 自然对数是用‘log’而不是‘ln’来表示的。
通过使用这些函数,Octave 能完成你用普通计算器来完成的所有计算。
3 Octave 环境
从之前的几个例子可以看出,Octave 有一个命令行界面——每个命令依次输入命令行中,并以回车结
束。Octave 为解释性语言,即每个命令通过命令解析器转化为机器语言。而在编译型语言,如 C++ 中,整
个程序通过文本编辑器输入并通过编译器将整个代码转化为机器语言。这样的编译型语言比解析型语言运行
速度快很多。然而由于 Octave 这样的语言能很快的将代码实现,这样弥补了其运行速度方面的缺陷。
3.1 变量
在实际的计算中,你都需要存储并再利用一些数值,正如计算器中的存储器一样。Octave 允许你定义并
使用变量。例如,在之前的角度问题中,我们可以定义一个名为 deg 的变量来保存角度与弧度换算的因子:
octave:##> deg=pi/180
deg=0.017453
注意和很多的高级语言 (如 C++) 不同,Octave 中变量的类型是不用声明的。Octave 所有的变量都是
浮点型或者字符串。运用这个变量,之前的表达式可以重写为:
octave:##>1.2*sin(40*deg+log(2.4^2))
ans=0.76618
这能使表达式更容易输入和易懂,避免因为粗心大意引起的一些低级错误等。在写程序的时候,请尽量
将你的一些常用数字和结果用变量表示。
你已经见到过的另一个 Octave 变量便是 ans 变量。这个变量存储你每次最近运算的结果。这个变量同
样可以像普通变量一样供我们使用。例如:
octave:##> new=3*ans
new=2.2985
注意 new 的数值也不是单单计算 3 0:76618 得到的结果。这是因为 Octave 的结果只以一定的精度展示出
来,而实际上它存储的变量的精度要比其显示的高很多,因此实际的结果要比 2.2985 精确很多。在所有的数
值计算中,数值的有效位数是很重要的因素。因此使用变量名而不是每次输入结果能够尽量的避免数值的截
断误差。
在定义和使用变量时,Octave 中变量名是区分大小的,即变量 a 和变量 A 是不同的变量。而且 Octave
p1(见第十四节)) 等。Octave 不会阻止你重新定义这些内
本身已经定义了一些变量,如 pi,i 和 j(i = j =
置变量,但是这样的操作会让你的程序变得含糊。同样的,类似于 sin 和 cos 这样的变量也是允许的,但
不提倡。
如果你需要查看某个变量的数值,输入其变量名并回车即可。如果你想查看当前名命名或者使用的函数
名和变量名,输入
3 OCTAVE 环境
octave:##> who
*** dynamically linked functions:
dispatch
*** currently compiled functions:
rem
*** local user variables:
deg new
8
如果你需要从当前的变量空间中删除某个变量,clear 命令能移出所有的变量,或者移出某个特定变量,
如:
clear name
将移出名为 name 的某个变量。
3.2 数值及其格式
我们发现 Octave 通常只显示一定的有效数字。format 命令能让你选择数值显示的不同方式。输入
octave:##> format long
将让 octave 以 15 位的有效数字显示数值,这也是 octave 程序本身的计算精度。输入 helpformat 你将得到
本命令的所有选项的列表。通过使用 format long 命令,我们将看到更加精确的 deg 数值:
octave:##> deg
deg=0.0174532925199433
octave:##> format short
其中第二行将让 octave 以默认的方式显示数值。
Octave 使用科学记数法来表达数值很大或者很小的数字,例如 13142:6 = 1:31426 104, 而在 Octave 中
这个科学数值被显示为 1.3143e+04,这样的数值输入形式也同样能被 Octave 认可。
同样被 Octave 识别并计算的数据形式还有:
复数 (e.g.3+4i), 能完全被 Octave 识别,具体的内容将在第十四节中讲述。
无穷大 (Inf) 一个数除以 0 得到的结果。
非数值 (NaN) 0 除以 0 得到的结果。同样是其他数学表达式无法得到合法结果时的返回值。
Inf 和 NaN 可以向其他类型的数据一样参与运算,当然得到的结果通常还是 Inf 或者 NaN。
3.3 数值的表示和精度
Octave 中的数值,通计算机中存储的数值一样,是用二进制的形式而不是十进制的形式存储的。在十进
制的数值表达中,12.25 的意义是
12:25 = 1 101 + 2 100 + 2 10
1 + 5 10
2
但是在二进制的表达中,这将被写为
1101:01 = 1 23 + 1 22 + 0 21 + 1 20 + 0 2
1 + 1 2
2 = 12:25
(1)
(2)