Octave
は行列演算を中心とする数値計算用インタプリタ言語です。
行列やベクトルの演算、連立方程式、固有値、数値積分、常微分方程式、
非線形方程式、統計計算、FFT など、理工系のほとんどの数値計算をこなします。
gnuplot
を利用してグラフ表示ができます。
Ver.2.0.16 が LinuxMLD 5 に収録されています (MLD 6 では development version の octave-2.1.34 が、 MLD 7 では octave-2.1.40 が収録されています)。
作者: John W. Eaton さん他
ホームページ:
http://www.octave.org/
バージョン: 2.0.16 (2000/01/30)
ライセンス: GPL
付属ドキュメント マニュアルを読む
Octave FAQ を読む
Octave はもともと、化学を勉強する学生のために FORTRAN を学習しなくても数値計算ができるようにと開発されたようです。
インストールしたら、早速使ってみましょう。 起動はターミナルから octave と入力します。
$ octave GNU Octave, version 2.0.16 (i386-redhat-linux-gnu). Copyright (C) 1996, 1997, 1998, 1999, 2000 John W. Eaton. This is free software with ABSOLUTELY NO WARRANTY. For details, type `warranty'. octave:1>
終了は exit あるいは quit あるいは control-D を入力します。
プロンプト octave: の次の数字は何番目の入力であるかを示します。
bash などと同じようにコマンド・ヒストリーがあるので、
カーソルキーで前の入力を呼び出したり、history
で一覧表示したり、run_history N でヒストリーの
N 番目の入力を再実行できます。
入力行の編集も bash のコマンド行編集と同様にできます。
以下の例では入力番号は # で代用して示します。
計算式や変数の代入の書き方は C よりは FORTRAN に似ています。
octave:#> a=1+2*3 a = 7 octave:#>
冪乗は ** の他 ^ が使えます。
++ はできるけど +=
とかビット演算はありません。& も && も論理の AND です。
終りにセミコロン ; を付けると結果を表示しません。
octave:#> a = sqrt(2); octave:#>
FORTRAN と同じように書くけれど、大文字、小文字は区別されます。 変数名は英字で始まる英数字とアンダスコア“_”の列です。“_”で始めても いいのですが、内部名に使われているので自分では使わないほうがよいでしょう。 長さの制限はありません。 また整数とか実数 (とか複素数とか文字列とか行列とか) の型の宣言は必要ありません。スカラーはすべて倍精度実数として扱われます。
octave:#> 1/7 ans = 0.14286
ans は変数への代入がない時に使われる組込み変数です。
組込み変数として pi (円周率)、e (自然対数の底)、
i (虚数単位、j, I, J も同じ)、
eps (マシン・イプシロン) などがあらかじめ定義されていますが、
これらの変数に代入することもできてしまいますので
注意してください (特に i と j には気をつけましょう)。
表示の精度はデフォルトでは 5 桁ですが、組込み変数 output_precision で変更できます。
octave:#> output_precision=17; octave:#> pi pi = 3.1415926535897931e+00
17 桁で倍精度実数の精度いっぱいまで表示されます
(これ以上の桁数は意味がありません)。
こうした設定は ~/.octaverc
に書いておくと起動時に読み込まれます。
複素数、文字列の記述は次のようにします。
octave:#> b = 1 + 2i; ← 2 と i の間をあけてはいけない octave:#> c = "Hello";
自分で定義した変数や関数は who あるいは whos (who -long と同じ) で確認できます。
octave:#> whos *** local user variables: prot type rows cols name ==== ==== ==== ==== ==== wd scalar 1 1 a wd complex scalar 1 1 b wd string 1 5 c
最初の欄の prot はその変数に対して代入(w)あるいは消去(d) が
できるかどうかを示します。
変数や関数を消去するのは clear 名前
です。名前を省略するとユーザ定義の変数・関数がすべて消去されます。
whos -all とすると組込み変数も含めてリストされます。
変数・関数の内容を確認するには type 名前
としますが、変数なら単にその名前を入力すれば表示されます。
help とすると、演算子、予約語、組込み関数などの一覧が表示されます。
help 関数名 などとすれば具体的な使い方などがわかります。
(うっかり help = などとすると困ったことになります
(^_^;。
こういうときは help "=" とします。
あ、どうなるのかもうやってみたという好奇心の強い人は、clear help
してくださいね。)
ヘルプなどの長くなる表示は less
が使われるので自由にスクロールできるのが便利です (でも途中で q すると
warning: broken pipe が出たりするのがたまにキズ)。
さて、準備体操ができたところで行列の演算をやってみましょう。
行列の入力は次のようにします。
octave:#> A = [1,2,3;4,5,6] A = 1 2 3 4 5 6
列の区切りは カンマ ,
(空白も可)、
行の区切りは セミコロン ;
です。
次のように「分かりやすく」入力することもできます。
octave:#> B = [ ← ここで改行すると次のプロンプトが出ます > 1 0 4; > 0 3 2] B = 1 0 4 0 3 2
各要素は A(2,3)
のようにして (数学の記法と同じで行が先)
参照したり代入したりできます。
部分行列は A(1:2,1:2)
のようにします。
単位行列は eye()、全要素がゼロの行列は zeros() で作れます。
いきなり C(2)=1
とかすると C は列ベクトルになります。
行列演算は (数学的に意味がある限り) スカラーの演算と同じように行なえます。
octave:#> A + B ans = 2 2 7 4 8 8
2 × 3 の行列同士では積は定義されませんから B
を転置して掛けてみましょう。
転置 (複素数なら共役) の演算子は シングルクォート '
です。
octave:#> B' ans = 1 0 0 3 4 2 octave:#> A * B' ans = 13 12 28 27
演算子 .*
では要素ごとの積になります。
.+
、.-
、./
なども同様です。
sin()
とか、スカラーとの演算は要素ごとに計算されます。
octave:#> A .* B ans = 1 0 12 0 15 12
連立方程式
11x + 3y = 1, 2x + y = 0
を解くには次のようにします。
octave:#> A = [11, 3; 2, 1]; octave:#> b = [1; 0]; octave:#> A\b ans = 2.0000000000000001e-01 -4.0000000000000002e-01
演算子 \
(バックスラッシュですが¥に見えるかも) は、
A\b
で「b を A で割る」イメージです。つまり A-1b ですが
Octave
の中では逆行列を経由しているわけではありません。
連立方程式を解くのに逆行列を使うのは手間がかかる上に精度が悪いと言うのは
数値計算の常識です。逆行列は inv()
で求められます。
固有値を求める関数は eig()
です。
octave:#> A=[1,2;2,1]; octave:#> eig(A) ans = -1 3
固有ベクトルも同時に求めるには
octave:#> [V,D]=eig(A) V = -7.0710678118654757e-01 7.0710678118654757e-01 7.0710678118654757e-01 7.0710678118654757e-01 D = -1 0 0 3
このように Octave の関数は2つ以上の結果を同時に返すことができます。
最後にグラフ表示してみましょう。
簡単な x-y グラフを書く関数は plot
ですが
gnuplot
が必要です。
正弦関数を (-3, 3) の範囲で描いてみましょう。まず x の列ベクトルを
用意します。
octave:#> x = (-3:0.1:3)';
これで -3 から 0.1 きざみで 3 までのベクトルができます。転置しているのは単に
(-3:0.1:3)
だと行ベクトルになるからです。
octave:#> y = sin(x); octave:#> plot (x,y)
これで次のようなグラフが出ます。 グラフのウィンドウを閉じるにはそのウィンドウにマウスカーソルを置いて q を押します。
グラフを描く関数は他に counter
、mesh
などがあります。
gplot、gsplot、gset、gshow
などで直接 gnuplot を制御することもできます。
そのほかの応用は、
常微分方程式は lsode 最小自乗法は gls 数値積分は quad 非線形方程式は fsolve
など、help あるいは以下に述べるマニュアルでそれぞれの関数について調べてください。
Octave は言語ですから当然プログラミングできます。 インタプリタですから少しずつ直しながら試してみるということが簡単にできます。
*** function files in /usr/share/octave/2.0.16/m/audio/:の様な見出しの後に並んでいる、.m で終る名前は、そのディレクトリにあるスクリプト・ファイルです。 関心のある分野があったら中身を覗いてみてください。
ヘルプには、help -i として表示される info
形式のマニュアルがあります。info 形式に慣れていないと使いにくいかも
(info のヘルプは control-H で出ます) しれませんが、
help では関数名などがわからないと引き出せない情報が
help -i topic で出て来ることもあります。
info に慣れていない方は
gnome-help から参照 する方が (マニュアルを読みながら操作できますし)
いいかもしれません。
マニュアルのほかには、Octave-FAQ が
/usr/share/doc/octave-2.0.16/faq/
にあります。
PostScript ファイル Octave-FAQ.ps
、
HTML ファイル (目次は Octave-FAQ_toc.html
)、
info ファイル Octave-FAQ.info
と3種類(内容は同じ)用意されています。
また A4 3ページ分のクイックリファレンスカード
/usr/share/doc/octave-2.0.16/refcard/refcard-a4.ps
があります (Ver.1.1.1 なので、ちょっと古いです)。
Octave
は LinuxMLD 5 の Disc3 に収録されています。
rpm コマンドでインストールするには、Disc3 を
マウントして、
# rpm -i /mnt/cdrom/RPMS/octave-2.0.16-1.i386.rpm
とします。
MLD 6, 7 では先に blas-3.0、lapack-3.0 をインストールする必要があります。 例として MLD 6 ならば、Disc4 をマウントして
# rpm -i /mnt/cdrom/RPMS/blas-3.0-12.i386.rpm # rpm -i /mnt/cdrom/RPMS/lapack-3.0-12.i386.rpm # rpm -i /mnt/cdrom/RPMS/octave-2.1.34-3.i386.rpm
とします。
Gnome の GUI でインストールすることもできます。
MLD 5 の RPM には info ファイルと同内容の、印刷できるマニュアルは含まれていません。 必要な方は SRPM から取り出して下さい。 適当な作業ディレクトリを作ってそこに移動し、MLD5 の Disc4 をマウントして
$ rpm2cpio /mnt/cdrom/SRPMS/octave-2.0.16-1.src.rpm | cpio -i $ tar xIf octave-2.0.16.tar.bz2 $ cd octave-2.0.16/doc/interpreter
とすると、そこに 262 ページの PostScript マニュアル octave.ps
があります。
HTML 版のマニュアル (octave_toc.html
が目次) もあります。
MLD 6 の RPM には上記の PS マニュアル、HTML マニュアルが含まれています。
MLD 7 では再び含まれなくなってしまったので、上記の
MLD 5 と同様に SRPM から取り出してください。
tar の bzip2 用のオプションは、新しい tar では -j
になっていますのでご注意ください。
Octave は MATLAB クローンといわれ、商用ソフトである MATLAB (日本での代理店 サイバネットシステムのページの技術/サポート情報に MATLAB 入門コースがあります) とある程度互換性があります。 起動時に --traditional (または --braindead 脳死モード?) オプションをつけると MATLAB との互換性が高まるようです。
Web 上の参考になるページを御紹介します。
基本からシステム制御まで簡潔にまとめられています。 科学技術出版刊 「Octave で見るシステム制御」を書いておられます。
基本的な使い方と、Octave 日本語メーリングリストの案内があります。
常微分方程式、固有値、FFT、画像の処理などの例と Color Map。 御勉強のページ も参考に。
数値・数式処理関連 のページから辿れる Scilabを中心としたMATLABクローン即席入門講座 も参考になります。
Octave入門、ATLAS による高速化、関連リンクなどがあります。
Octave を MATLAB と同じように使うための情報や高速化の手法などがあります。
Octave 付属のライブラリ liboctave による数値計算
Octave に並列計算用の関数を追加するパッチ
MATLAB/SIMULINK の紹介, 初心者から上級者までレベルに応じたテキストの紹介,主要リンク集など
関連ソフトウェア
システム制御のための拡張パッケージ。
MLD 6,7 に収録の octave 2.1.x では標準で含まれています。
2.1.x のマニュアルの「29. Control Theory」を参照してください。
Toolkit of graphical output functions for Matlab and Octave
その他のアプリケーション