跳轉至內容

Octave 程式設計教程/入門

來自華夏公益教科書

本教程的目的是快速介紹 Octave 的基礎知識,並向您展示您已經瞭解了其中很多內容。如果您遇到困難或需要有關 Octave 函式或命令的更多資訊,請鍵入

help command

在 Octave 提示符下。command 是要查詢幫助的 Octave 命令或函式的名稱。不過要注意,描述有時可能有點技術性,並且充滿了行話。

注意
當 Octave 無法正常工作時,網站 NCLabVerbosus 允許您在雲端使用 Octave。這兩個系統都有免費模式。另一個選擇是使用 SageCell-Server,它允許您線上使用多種數學軟體工具執行計算 - 選擇“Octave”作為程式語言。

啟動 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 <bug@octave.org> (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]: sincostan
  • 反三角函式:asinacosatan
  • 自然對數和以 10 為底的對數:loglog10
  • 乘方運算:exp
  • 絕對值:abs

還預定義了各種常量:pie(尤拉數)、ij(虛數 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 xx 的關係圖,並使用以下命令生成。雖然這是一個簡單的示例,但它旨在說明基本功能。我們將在後面看到更詳細的示例。

x = linspace(0, 2*pi, 100);
y = sin(x);
plot(x, y);
figure;

實際上生成繪圖的命令當然是 plot(x, y)。在執行此命令之前,我們需要設定變數 xyplot 函式只需將兩個長度相等的向量作為輸入,將第一個向量中的值解釋為 x 座標,將第二個向量中的值解釋為 y 座標,並繪製連線這些座標的直線。

上面的第一個命令 x = linspace(0, 2*pi, 100) 使用 linspace 函式建立一個等間距間隔向量(有時也稱為“線性間距值”)。向量中的第一個值為 0,最後一個值為 2π,向量包含 100 個值。此向量分配給名為 x 的變數。

第二個命令計算向量變數 x每個值的 sin,並將生成的向量儲存在變數 y 中。

(順便說一句:變數的名稱可以是任何字母、數字和下劃線的序列,但不能以數字開頭。變數名沒有最大長度,並且字母字元的大小寫很重要,即 aA 是兩個不同的變數名。)

繪製函式 的影像,其中 。(這是圖2)。
注意: 如果linspace的第三個引數(長度)不夠大,圖形可能會出現輕微的誤差。有關更多資訊,請參見下一標題。

關於命令的更多資訊

[edit | edit source]

以下命令和函式對於設定繪製二維圖形的變數很有用。

  • linspace 建立一個包含均勻(線性)間隔值的向量。

用法:linspace(start, stop, length)length引數是可選的,它指定返回向量中的值的數量。如果省略此引數,向量將包含 100 個元素,第一個值為start,最後一個值為stop

  • plot 繪製二維圖形。

用法:plot(x, y),其中xy是長度相等的向量。

  • figure 建立一個新的繪圖視窗。

當您希望在單獨的視窗中繪製多個圖形而不是替換之前的圖形或在相同的軸上繪製圖形時,此命令很有用。

  • hold onhold 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)

每當您嘗試乘或除兩個向量變數時(請記住xy是向量),就會出現此錯誤。目前,您可以執行以下兩件事之一。

  1. 使用plot(sin(x).*cos(x)) - 注意sin(x)*之間的.。對於x^2,請使用plot(x.*x)
  2. 閱讀關於向量和矩陣的部分。

挑戰

[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 檔案儲存在那裡。


返回 Octave 程式設計教程索引

參考資料

[編輯 | 編輯原始碼]
  1. 與數學中通常一樣,三角函式以弧度為單位接受引數。
華夏公益教科書