Octave で数値計算やシミュレーションをしようと思ったらユーザ定義関数の作り方の知識は必須です。ここでは、Octave でユーザ定義関数をつくる方法を見てみましょう。
ユーザ定義関数は function コマンドを使って作ります。function と endfunction に挟まれた部分でユーザ定義関数を定義します。一番簡単な場合は関数が引数も戻り値も持たない場合です。この場合は function <関数名> で定義することができます。例えば hello と印字する関数 h は次のように作ります。
octave:1> function h > printf ( "hello\n" ); > endfunction octave:2> h hello
今度は、引数 name をとる関数 hn を定義してみましょう。引数を持つ関数を定義するには function <関数名> ( <引数名> ) で行います。次の例は名前を引数に取って hello, <名前> を表示する関数 hn ( name ) です。
octave:3> function hn ( name ) > printf ( "hello, %s\n", name ); > endfunction octave:4> hn ( 'world' ) hello, world
さらに、戻り値を持つ関数 square ( x ) を作成してみましょう。戻り値と引数を持つ関数を定義するには function <戻り値> = <関数名> ( <引数名> ) と記述します。
octave:5> function y = square ( x ) > y = x .* x; > endfunction octave:6> square ( 2 ) ans = 4
定義のところで .* というドットつきの演算子を使ったのは引数にベクトルを取る場合を想定しているからです。.* はベクトルや行列の対応する要素どうしの掛算を行います。それでは、square の引数にベクトルを与えてみましょう。
octave:7> a = [1; 2] a = 1 2 octave:8> square ( a ) ans = 1 4
ベクトルを引数にできる関数を作っておくと関数のグラフをすぐに描くことができます。
octave:9> t = (-3:0.1:3); octave:10> plot (t, square(t))
(-3:0.1:3) は範囲を表し、要素の値が -3 から 3 まで 0.1 づつ増加して行く横ベクトルを作成します。同じようなベクトルは linspace 関数でも作ることができます。次の例では -3 から 3 までを 100 等分した数列を要素とする横ベクトルが作られます。
octave:11> t = linspace (-3, 3, 100); octave:12> plot (t, square(t))
ユーザ定義関数は関数ファイルに記述しておいて自動的に呼び出すこともできます。関数ファイルの名前は、(1) ファイルの冒頭に関数の定義がされていること。(2)ファイルの拡張子が .m であること (3) ファイルの名前が .m の部分をのぞいて冒頭に記述された関数と同じ名前であること (4) ファイルのあるディレクトリーが LOADPATH に登録されていること。という四つの条件を満たす必要があります。例えばカレントディレクトリーに次のような plotsin.m というファイルがあったとします。するととくにこのファイルを読みこまなくても Octave のコマンドラインで plotsin と入力すると正弦波のグラフが表示されます。
$ cat plotsin.m function plotsin t = (-3:0.1:3); plot (t, sin(t)); endfunction $ octave GNU Octave, version 2.0.16 (i386-vine-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:> plotsin
Octave のコマンドを記述したファイルはスクリプトファイルとして使用することができますが、スクリプトファイルとして使用するときは冒頭で関数を定義してはいけません。どうしても冒頭に関数の定義が必要な場合はその上の行に 1; などのダミーのコマンドを記述しておけばだいじょうぶです。
$ cat plotsin2.oct
1;
function plotsin2
t = (-3:0.1:3);
plot (t, sin(t));
endfunction
plotsin2
input ("Press Retern ");
$ octave plotsin2.oct
GNU Octave, version 2.0.16 (i386-vine-linux-gnu).
Copyright (C) 1996, 1997, 1998, 1999, 2000 John W. Eaton.
This is free software with ABSOLUTELY NO WARRANTY.
For details, type `warranty'.
Press Retern
また、スクリプトファイルを Octave のコマンドラインから使うときは source コマンドで実行できます。
octave:> source "plotsin2.oct"