第 3 章 プログラム 175
3.2 Maxima で函数の定義
3.2.1 函数定義
(%i1) f(x):=(y:x,z:2+y,2*z);
(%o1) f(x) := (y : x, z : 2 + y, 2 z) (%i2) f(x);
(%o2) 2 (x + 2)
(%i3) y;
(%o3) x
(%i4) z;
(%o4) x + 2
(%i5) f(2);
(%o5) 8
(%i6) x;
(%o6) x
(%i7) y;
(%o7) 2
(%i8) z;
(%o8) 4
この様に,先頭の式から順番に処理されて行き,最後の式の結果だけが返却されています.更に,こ の函数の場合,内部で用いた変数yとzの値が書換えられている事に注意して下さい.
この様に,Maxima内部で用いた変数は,通常は大域変数として扱われます. その為,変数の値の 書換が生じます.この事を避ける為に,Maximaでは函数内部のみで有効な局所変数が扱えます.こ の局所変数は,後述のblock文の中で定義可能です.
Maximaのlambda式を用いると無名の函数が構築出来ます.このlambda函数の構文は最初に
函数の変数を宣言し,その後に函数本体が続きます.函数本体は基本的にMaximaの式をコンマで 区切ったものになります.
lambda函数
¶ ³
lambda([h変数1i,· · ·,h変数ni],h函数本体i)
µ ´
構文自体はLISPのlambda式と同様の構文となっています.
次の例ではlambda([i],2*i+1)で引数iに1を加える無名函数を構成し,その函数にmap函数で
リスト[1,2,3]に作用させた結果と,lambda式を利用した函数nekoを示しています.
(%i58) map(lambda([i],2*i+1),[1,2,3]);
(%o58) [3, 5, 7]
(%i59) neko(x):=map(lambda([i],sin(2*i+1)),x);
(%o59) neko(x) := map(lambda([i], sin(2 i + 1)), x) (%i60) neko([1,2,3,4,5]);
(%o60) [sin(3), sin(5), sin(7), sin(9), sin(11)]
(%i61) i;
(%o61) i
ここで,lambda函数内部で用いた疑似変数iがlambda函数内部のみで値を持つ事に注意して下 さい.
Maximaでは引数の個数が可変な函数も定義出来ます.この場合,最後の引数を特別な引数リス
トとして割当てて,函数を定義します.尚,引数が少ない場合, 安易な処理を行っていると少し問題 になるかもしれません.
(%i41) f([u]):=u;
(%o41) f([u]) := u
(%i42) f(1,2,3,4,5);
(%o42) [1, 2, 3, 4, 5]
(%i43) f(a,b,[u]):=[a,b,u];
(%o43) f(a, b, [u]) := [a, b, u]
(%i44) f(1,2,3,4,5,6);
(%o44) [1, 2, [3, 4, 5, 6]]
(%i45) f(1,2);
(%o45) [1, 2, []]
単純に式を並べる方式では,函数の返却値は最後に処理された式の値となります. そうではなく, 函数本体に含まれる式の返却値が必要な場合には,block文とreturn文を組合せます.
定義した函数の内容は函数dispfunやfundefで参照する事が出来ます.
定義した函数の内容を表示する函数
¶ ³
dispfun(h函数名1i,· · ·,h函数名ni) dispfun(all)
fundef(h関数名i)
µ ´
利用者定義の函数 h函数名1i,· · ·,h函数名niの内容を表示します.この函数の表示では,函数を 定義した時点での函数や定数等がそのまま表示されます.
尚,引数にallを設定すると,大域変数functionsとarraysで与えられる函数を全て表示します.
fundef函数は h関数名i に対応する函数の定義を返します. fundefはdispfunに似ています
が,fundefではdisplay函数を呼出さない点で異なります.
(%i9) neko(x):=sin(x)*exp(x);
(%o9) neko(x) := sin(x) exp(x)
(%i10) dispfun(neko);
(%t10) neko(x) := sin(x) exp(x)
(%o10) done
(%i11) fundef(neko);
(%o11) neko(x) := sin(x) exp(x)
この例で示す様に,dispfunを実行すると結果は%tラベルに表示されていますが, fundefの方は 通常の%oラベルに表示されています.それ以外で違いはありません.
利用者定義函数を削除する函数
¶ ³
remfunction (h函数1i,h函数2i,· · ·) remfunction (all)
µ ´
remfunction函数は利用者定義函数をMaximaから削除します.利用者定義函数は大域変数
func-tionsにその名前が保存されており,remfunctionはfunctionsに含まれている函数名の削除を行い
ます.尚,引数としてallが与えられた場合,大域変数functionsに含まれる全ての利用者定義の函数 が削除されます.