Octave

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 を押します。

グラフ

グラフを描く関数は他に countermesh などがあります。 gplotgsplotgsetgshow などで直接 gnuplot を制御することもできます。

そのほかの応用は、

        常微分方程式は lsode
        最小自乗法は gls
        数値積分は quad
        非線形方程式は fsolve

など、help あるいは以下に述べるマニュアルでそれぞれの関数について調べてください。

Octave は言語ですから当然プログラミングできます。 インタプリタですから少しずつ直しながら試してみるということが簡単にできます。

実際、Octave の応用的な関数はスクリプトになっています。 単に help として出て来るリストの後半に
*** 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 上の参考になるページを御紹介します。

関連ソフトウェア

その他のアプリケーション

[2001/03/16 作成] [2004/03/27 更新]


このページに関する御意見、御要望を science@mlb.co.jp までお寄せ下さい
Copyright © 2001-2005 Media Lab. All Rights Reserved.