Octave 编程教程/入门
本教程的目的是快速介绍 Octave 的基础知识,并向您展示您已经了解了其中很多内容。如果您遇到困难或需要有关 Octave 函数或命令的更多信息,请键入
help command
在 Octave 提示符下。command
是要查找帮助的 Octave 命令或函数的名称。不过要注意,描述有时可能有点技术性,并且充满了行话。
在终端窗口中键入 octave
开始。您应该会看到类似以下内容,具体取决于您安装的版本
GNU Octave, version 3.6.4.0 Copyright (C) 2013 John W. Eaton and others. This is free software; see the source code for copying conditions. There is ABSOLUTELY NO WARRANTY; not even for MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, type `warranty'. 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/get-involved.html Report bugs to <[email protected]> (but first, please read http://www.octave.org/bugs.html to learn how to write a helpful report). octave:1>
要退出 Octave,请键入 quit 或 exit。
上面的最后一行被称为 Octave 提示符,就像 Linux 中的提示符一样,这是您键入 Octave 命令的地方。要进行简单的算术运算,请使用 +
(加法)、-
(减法)、*
(乘法)、/
(除法)和 ^
(乘方)。
许多数学函数都可用,并且具有明显的名称(其中许多与其他编程语言相似)。例如,我们有
- 三角函数[1]:
sin
、cos
、tan
- 反三角函数:
asin
、acos
、atan
- 自然对数和以 10 为底的对数:
log
、log10
- 乘方运算:
exp
- 绝对值:
abs
还预定义了各种常量:pi
、e
(欧拉数)、i
和 j
(虚数 sqrt(-1))、inf
(无穷大)、NaN
(非数字 - 由未定义的操作导致,例如 Inf/Inf
)。
以下是一些示例,展示了在提示符下键入的输入和 Octave 返回的输出。
octave:1> 2 + 3 ans = 5 |
octave:2> log10(100)/log10(10) ans = 2 |
octave:3> floor((1+tan(1.2)) / 1.2) ans = 2 |
octave:4> sqrt(3^2 + 4^2) ans = 5 |
octave:5> e^(i*pi) ans = -1.0000e+00 + 1.2246e-16i octave:6> # Comment: From Euler's famous formula octave:6> # extremely close to the correct value of -1 |
一些需要注意的事项
- Octave 要求在函数的输入周围使用括号(因此,
log(10)
很好,但 (log 10
) 不行)。 - 算术运算符前后任何空格都是可选的,但允许。
- 并非所有 Octave 函数都具有明显的名称(例如上面的
sqrt
)。现在不要惊慌。随着我们的学习,您将逐渐了解它们。
您将使用 Octave 绘制以下图片
图 1 |
图 2 |
图 3 |
图 4 |
图 1 包含 sin x 与 x 的关系图,并使用以下命令生成。虽然这是一个简单的示例,但它旨在说明基本功能。我们将在后面看到更详细的示例。
x = linspace(0, 2*pi, 100); y = sin(x); plot(x, y); figure;
实际上生成绘图的命令当然是 plot(x, y)
。在执行此命令之前,我们需要设置变量 x 和 y。plot
函数只需将两个长度相等的向量作为输入,将第一个向量中的值解释为 x 坐标,将第二个向量中的值解释为 y 坐标,并绘制连接这些坐标的直线。
上面的第一个命令 x = linspace(0, 2*pi, 100)
使用 linspace
函数创建一个等间距间隔向量(有时也称为“线性间距值”)。向量中的第一个值为 0,最后一个值为 2π,向量包含 100 个值。此向量分配给名为 x
的变量。
第二个命令计算向量变量 x
中每个值的 sin,并将生成的向量存储在变量 y
中。
(顺便说一句:变量的名称可以是任何字母、数字和下划线的序列,但不能以数字开头。变量名没有最大长度,并且字母字符的大小写很重要,即 a
和 A
是两个不同的变量名。)
绘制函数 的图像,其中 。(这是图2)。
注意: 如果linspace
的第三个参数(长度)不够大,图形可能会出现轻微的误差。有关更多信息,请参见下一标题。
关于命令的更多信息
[edit | edit source]以下命令和函数对于设置绘制二维图形的变量很有用。
linspace
创建一个包含均匀(线性)间隔值的向量。
用法:linspace(start, stop, length)
。length
参数是可选的,它指定返回向量中的值的数量。如果省略此参数,向量将包含 100 个元素,第一个值为start
,最后一个值为stop
。
plot
绘制二维图形。
用法:plot(x, y)
,其中x
和y
是长度相等的向量。
figure
创建一个新的绘图窗口。
当您希望在单独的窗口中绘制多个图形而不是替换之前的图形或在相同的轴上绘制图形时,此命令很有用。
hold on
和hold off
设置是否希望后续绘图在相同的轴上绘制在一起或替换之前的绘图。
- 行末的
;
将抑制结果的显示。尝试删除它,看看结果!
示例
[edit | edit source]我们将绘制图3和图4。图3包含 3 个三角函数
- ,
- ,和
在一个轴组上。图4包含这 3 个函数的总和。
首先,我们使用linspace
来设置一个包含x值的向量。
octave:1> x = linspace(0, 2*pi);
然后,我们计算 3 个函数的y值。
octave:2> a = cos(2*x); octave:3> b = sin(4*x); octave:4> c = 2*sin(x);
以下代码绘制第一个图形。
octave:5> figure; octave:6> plot(x, a); octave:7> hold on; octave:8> plot(x, b); octave:9> plot(x, c);
我们使用第 5 行(figure
)告诉 Octave 我们想要在新的轴组上绘制。建议在绘制任何新图形之前使用figure
。这可以防止您意外地将之前的图形替换为新的图形。
注意,在第 7 行,hold on
用于告诉 Octave 我们不希望将第一个图形(来自第 6 行)替换为随后的图形。Octave 将在hold on
之后的相同轴上绘制所有内容,直到发出hold off
命令。
您看到的图形显示了在相同颜色下的所有三个绘制的函数。要让 Octave 自动分配不同的颜色,请在一步中绘制所有函数。
octave:10> plot(x, a, x, b, x, c);
最后,我们绘制第二个图形。
octave:11> figure; octave:12> hold off; octave:13> plot(x, a+b+c);
第 11 行创建一个新的图形窗口,第 12 行告诉 Octave 任何后续的图形应该简单地替换之前的图形。第 13 行生成 3 个三角函数之和的图形。对于 Mac 用户,如果绘图图形命令不起作用,请首先使用以下命令:> setenv ("GNUTERM", "x11")
练习
[edit | edit source]- 绘制绝对值函数的图像,其中 。
- 绘制一个以原点为中心、半径为 1 的圆。(这并不容易。)
- 绘制您喜欢的函数(例如正弦函数和余弦函数)。
警告
[edit | edit source]如果您尝试(或已经尝试)绘制诸如 或 之类的图像,您将遇到麻烦。以下错误消息很常见。在x^2
的情况下
error: for A^b, A must be square
在sin(x)*cos(x)
的情况下
error: operator *: nonconformant arguments (op1 is 1x100, op2 is 1x100)
每当您尝试乘或除两个向量变量时(请记住x
和y
是向量),就会出现此错误。目前,您可以执行以下两件事之一。
- 使用
plot(sin(x).*cos(x))
- 注意sin(x)
和*
之间的.
。对于x^2
,请使用plot(x.*x)
。 - 阅读关于向量和矩阵的部分。
挑战
[edit | edit source]由于 Octave 是一个数值(而不是符号)数学包,它确实会产生数值错误,并且不能很好地处理某些操作。为了确认这一点,绘制 tan x 的图像,其中x 在 -π 和 π 之间。得到的图片有什么问题?
您的任务是使用您迄今为止所学的内容和axis
函数生成下面的(看起来好得多的)图形。axis
可用于调整实际显示在屏幕上的图形的哪一部分。使用命令help axis
来确定此函数的工作方式。
可能需要一些思考才能在 处得到正确的渐近线。您可以使用help plot
来了解如何绘制点线。(尝试自己绘制图形,然后再查看下面的解决方案。)
以下命令可用于生成上面显示的图形。
octave:1> x_part_left = linspace(-pi, -pi/2-0.001, 100); octave:2> x_part_mid = linspace(-pi/2, pi/2, 100); octave:3> x_part_right = linspace( pi/2+0.001, pi, 100); octave:4> plot(x_part_left, tan(x_part_left)); octave:5> hold on; octave:6> plot(x_part_mid, tan(x_part_mid)); octave:7> plot(x_part_right, tan(x_part_right)); octave:8> y_limit = 4; octave:9> axis([-pi, pi, -y_limit, y_limit]); octave:10> plot(linspace(-pi/2, -pi/2, 100), linspace(-y_limit, y_limit, 100), '.'); octave:11> plot(linspace( pi/2, pi/2, 100), linspace(-y_limit, y_limit, 100), '.'); octave:12> hold off;
水平绘图范围从 -π 到 π 被分成三个向量,以便在绘图时跳过奇点。在第 4-7 行,绘制了 tan 函数的不同部分。之后,在第 8 行,我们选择 y 轴的限制,并使用它来约束垂直绘图范围(使用 axis
命令 [第 9 行])。最后,我们在 添加点状的渐近线(第 10 和 11 行)。
能够保存 Octave 命令并在以后返回它们非常有用。你可能想要保存你的工作或创建可以重复使用的代码(由你自己或其他人使用)。此类文件被称为 Octave 脚本文件。它们应该用 .m
扩展名保存,以便 Octave 可以识别它们。(.m
扩展名被使用是因为 MATLAB 将其脚本文件称为 M 文件,而 Octave 是基于 MATLAB 的。)
要在 Octave 中运行现有脚本,你必须位于与脚本文件相同的目录下,并在 Octave 中输入文件名称 **不带** .m
。例如,如果我在 octave
目录中有一个名为 myscript.m
的脚本,则以下两个命令将执行该脚本。
chdir('~/octave'); % This changes to the octave directory myscript;
请注意,chdir('~/octave')
命令仅在运行 Octave 时你不在该目录中才需要。
在下一节中,将向你展示一些新的语句,你可以使用它们使你的 Octave 代码更加强大。将提供一些示例脚本文件,你应该将它们保存到一个目录中以备后用。一个好主意是在你的主目录中创建一个名为 octave
的目录,并将所有 Octave 文件存储在那里。
- ↑ 与数学中通常一样,三角函数以弧度为单位接受参数。