• 検索結果がありません。

函数定義

ドキュメント内 Maxima c (2007),,,,,. (ページ 191-194)

第 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に含まれる全ての利用者定義の函数 が削除されます.

ドキュメント内 Maxima c (2007),,,,,. (ページ 191-194)