OpenSource Matlab:Octave 初探

Syashin Chen
9 min readJul 6, 2017

--

多項式的展開,你會怎麼做?

用手算就好了?但如果遇到小數點很多位的係數像是:

3.26( 1.737X-2.688 )² + 1.478( 1.737X-2.688 )

該怎麼辦?

展開也才三項,係數的小數點位數卻非常的多,用手算的話,不管是花的時間或是精神都太驚人了,這時候,我們可能會選擇使用 MatLab,一個工程上常常在使用的科學計算軟體,但它是要錢的,要使用請支持正版

想要 Free 的?Google一下 FreeMatLab 關鍵詞,你可能會找到 Octave

OCTAVE 是什麼?

Octave 是一個科學計算數值分析的工具。

它的主頁,寫著 GNU Octave ,代表著這個東西屬於 GNU Project,另外,它還是個 開放原始碼 (Open-source) 自由軟體 (Free- Software)

GNU Octave is a high-level language, primarily intended for numerical computations. It provides a convenient command line interface for solving linear and nonlinear problems numerically, and for performing other numerical experiments using a language that is mostly compatible with Matlab. It may also be used as a batch-oriented language.

節錄自 About 頁面,簡單來說,Octave 就是個可以相容大部分 Matlab 指令的科學計算工具,操作方式也有類似的部分。

安裝 Octave

網站的首頁下方有提供各個平台的安裝方式,目前,Windows 的用戶可以直接下載安裝檔運行,非常的方便。

至於 Mac 的部分,安裝的方式比較多元,除了提供 dmg 檔外,也可使用 Command-Line 安裝,詳細列在 Octave Wiki

Installing a Mac OS X Bundle 段落中有提供dmg檔案的下載連結:

請檢查 Mac OS 的版本是否為 10.9 以上。

下載後跟著指示安裝即可。

開始使用 Octave

使用介面乍看之下好像有點陽春?其實可以幫你做很多事情。

Octave 提供兩種介面:Command WindowEditor 讓你輸入Command Window 就是即時互動的模式,Editor 則是像記事本等編輯器一樣,可以一次寫多行再執行。

以官方文件中的章節 — 28.5 Polynomial Interpolation 中的程式碼:

x = 2 * pi * rand (1, 200);
y = sin (x) + sin (2 * x) + 0.2 * randn (size (x));
## Uniform breaks
breaks = linspace (0, 2 * pi, 41); % 41 breaks, 40 pieces
pp1 = splinefit (x, y, breaks);
## Breaks interpolated from data
pp2 = splinefit (x, y, 10); % 11 breaks, 10 pieces
## Plot
xx = linspace (0, 2 * pi, 400);
y1 = ppval (pp1, xx);
y2 = ppval (pp2, xx);
plot (x, y, ".", xx, [y1; y2])
axis tight
ylim auto
legend ({"data", "41 breaks, 40 pieces", "11 breaks, 10 pieces"})

來畫一張圖型。

  • 使用 Command Line — 直接將程式整段複製貼上。
  • 使用 Editor — 將程式存檔後執行

示範了兩個基本用法後,我們試著用 Octave 展開一開始提到的多項式

3.26( 1.737X-2.688 )² + 1.478( 1.737X-2.688 )

這個式子擁有一個大寫的X符號,所以我們必須先在程式裡定義它,輸入:

syms X

然後…就會產生錯誤訊息!疑!?

這段錯誤訊息大意為:syms 這個函式存在於 symbolic package,而你的 Octave 並沒有這個套件,還貼心的附上了一個網址:Missing functions

這裡說明了為何會遺失 package,還有可能的解決辦法,先選擇進入 Octave-Forge 搜尋。

Octave-Forge 找尋需要的套件並安裝

可以用字母排序查詢的方式,找到 syms 這個函數,點擊後面的symbolic

接下來點擊 Download Package 來下載套件。

下載完畢後,回到 Octave 介面,在 Command Window 中,輸入:

pkg install [剛剛下載檔案的完整路徑]

檔案在我的 Mac,位於 /Users/syashin/Downloads/symbolic-2.5.0.tar.gz 那我就要輸入:

pkg install /Users/syashin/Downloads/symbolic-2.5.0.tar.gz

這樣就完成了套件的安裝,但是等等!先別急著使用

安裝完成的套件,使用前必須先被載入,輸入:

pkg load symbolic

再來就可以先定義符號:

syms X

接著,用 expand 函數展開多項式,並透過 vpa 將結果係數轉成小數:

vpa(expand(3.26*(1.737*X-2.688)^2 + 1.478*(1.737*X-2.688)))

得到的結果為:

9.83597094X² - 27.87495912X + 19.58175744

如果沒辦法在 Octave-Forge 找到套件?

其實 Missing functions 那頁已經說明:如果找不到,那有可能是該函數是個新的 Matlab Function 有可能連 Octave 社群都沒人發現,這時候就大膽的到 Octave bug tracker 發表你的問題吧!

Octave Online

如果你的電腦空間已經很少很少,不想在電腦安裝 Octave,那選擇 Octave-Online 就沒有錯啦!

以前面講的多項式計算為例:

syms Xvpa(expand(3.26*(1.737*X-2.688)^2 + 1.478*(1.737*X-2.688)))

按下 ctrl+v 貼上後,按 Enter 執行:

也不需要載入package,就能得到答案了,缺點當然是必須依賴網路啦!

心得與延伸

最近遇到某幾個專案要用到多項式的展開,一開始是抱著不想用手算的心態上網 Google,因為公司沒有買 Matlab 自己又不想裝盜版軟體,意外發現 Octave 這個自己之前聽都沒聽過的東西。

Octave 是個 OpenSource,對於那些有 Matlab 需求卻又沒預算的團隊,再也不用冒著使用盜版的風險!碩士時,認識一些同學在學校電腦會使用校園授權版的 Matlab但是為了研究方便,在自己電腦都會裝來源不明的軟體,那時候如果知道有 Octave,也就不需要了吧。

網路上 Octave 的教學其實不算多,尤其是中文的資源,存在的時間都非常久了,比較常用的應該就屬:

  • 陳鍾誠老師的教學網站
  • G. T. Wang 的 Blog

皆為 2010 年的教學資料,那時候的 Octave ,在各個平台甚至沒有統一的 GUI。當然這些網站紀錄的資料很多,對學習很有幫助,而且很多語法跟 Matlab 也是相通的

當然還有其他的工作方式,例如:PythonR,都有相對應的套件或函數來取代 Octave 可以做的事情,像是 numpymatplotlib,眼睛利一點的朋友甚至可以發現,前面在Octave-Forge 找的套件,其實在 Runtime 的時候會用到來自 Python 的 SymPy

這頁的下方寫著:

Dependencies:

Octave >= 4.0.0

Runtime system dependencies:python, sympy (>= 1.0)

但是 PythonR 缺少了像 Matlab 或 Octave 這樣容易學習的視窗環境,這也是 Matlab 至今還那麼受歡迎的原因。

那沒有錢的時候,Why not Octave ?

--

--

Syashin Chen

轉行滿兩年的小RD,喜歡做簡單有趣的東西,常常不小心複雜化。