11 評価

編集

通常,Octave のプロンプトにおいて単に式を入力することにより,それを評価します。 あるいは,ファイルに保存しておいたコマンドが解釈できるかをOctave に問い合わせることによって評価することもできます。

ときどき,計算されて文字列に格納された文字列を評価すること,あるいは呼び出すべき関数名を文字列として使用する必要があると思うかもしれません。 evalおよびfeval関数は,それを行えるようにします。 または,実行時には知られていないコマンドを評価するため,あるいはユーザ提供関数を呼び出す必要のある関数を書くために必要です。

eval (try, catch)

編集

                                                           [Built-in Function]

文字列try を解釈し,それがOctave のコマンドであるかのように評価します。 もしそれが失敗するならば,文字列catch を評価します。 文字列tryは現在の状態で評価され,結果はevalが戻った後に入手できるようになったままです。

feval (name, . . . )

編集

                                                           [Built-in Function]

name という名前をもつ関数を評価します。 1番め以降の引数は,いずれもその名前の関数に渡されます。 たとえば,

	feval ("acos", -1)
⇒ 3.1416

この式は,引数‘-1’をつけて関数acosを呼び出します。

関数fevalは,ユーザ提供関数を呼び出すような関数を書くことができるようにするために必要です。 なぜならば,Octave は(C言語のような)関数へのポインタを宣言したり,(FortranのEXTERNALのような)関数名を保持するために使用される特殊な変数を宣言するための方法をもたないからです。 かわりに,名前によって関数を参照し,それを呼び出すためにfevalを使用しなければなりません。

fevalを使用し,ニュートン法を用いてある変数のユーザ提供関数の根を見いだす単純な関数を示します。

function result = newtroot (fname, x)
# 使用法: newtroot (fname, x)
#
# fname : 関数f(x) の名前を含む文字列
# x : 初期値
	delta = tol = sqrt (eps);
	maxit = 200;
	fx = feval (fname, x);
	for i = 1:maxit
		if (abs (fx) < tol)
			result = x;
			return;
		else
			fx_new = feval (fname, x + delta);
			deriv = (fx_new - fx) / delta;
			x = x - fx / deriv;
			fx = fx_new;
		endif
	endfor
	result = x;
endfunction

この例は,単にユーザ提供関数を呼び出す一例という意味でしかなく,ニュートン法を真剣に理解しろということではないことに気を付けてください。 本格的なコードを書くならば,より頑健なアルゴリズムを使用することに加えて, 数値とすべての引数の型,および,与えられる関数が本当に関数なのかなどをチェックすることになります。 たとえば,数値オブジェクトの判定関数のリストはSection 4.4[Predicates for Numeric Objects]を,exist関数の説明については,Section 9.3 [Status of Variables]を参照してください。