矢印記号

Maple で自前の数学関数を定義する一番簡単な方法は矢印記号 -> (マイナスと左向きの不等号の組合せ)を使うものだ.次の例では x の関数 x2 + 1 を f1 と名づけ,f1(2)=22 + 1 を計算している.

>    f1 := x -> x^2+1;

f1 := x -> x^2+1

>    f1(2);

5

Maple の式 (expression)

Maple では上で定めたような関数(手続き)と式 (expression) は別のものである. 例として式 ex sin x を f2 と名づけよう.

>    f2 := exp(x)*sin(x);

f2 := exp(x)*sin(x)

x = 0 における f2 の値を求めるには,eval を用いる.

>    eval(f2,x=0);

0

10年以上前の Maple にはこのような eval の用法は無かったので,代入を行う命令 subs を用いていた.古くからのユーザーには今でも subs を使っている人もいる.

>    subs(x=0,f2);

exp(0)*sin(0)

subs は形式的な置き換えを行うだけで,値を評価してくれない. 値を評価するには更に eval(または simplify など)を用いる必要がある. (もっとも eval だけでは求めた値が十分簡単な形になっていない場合もあり, その場合はやはり何らかの簡単化の命令を使う必要がある.)

>    eval(%);

0

式から関数を作る(unapply)

上の例で定義した f2 という式を x の関数として使いたいという要求にはどう応えればよいだろうか. 矢印記号を用いて x -> f2 とするのがもっともらしいのだが, 次に見るようにうまくいかない.(不便といえば不便だが, Maple が部分式を評価する順番の規則に関わることで止むを得ない.)

>    f3 := x -> f2;

f3 := x -> f2

>    f3(0);

exp(x)*sin(x)

この問題点をどう解決すればよいかというと, unapply を用いて式を指定した変数の関数を作ればよい. (unapply を用いて多変数の関数を作ることもできる.)

>    f4 := unapply(f2,x);

f4 := x -> exp(x)*sin(x)

>    f4(0);

0

上で説明した eval による値の評価を手続き (procedure) として定義する方法もある.

>    f5 := proc(t) eval(f2,x=t) end proc;

f5 := proc (t) eval(f2,x = t) end proc

>    f5(0);

0

Maple の関数(よくある誤り)

関数を定義するときに変数を ( ) でくくって与えればよいのではないかと考えるのは自然だが,Maple ではうまくいかない.

>    f6(x) := exp(x)*sin(x);

f6(x) := exp(x)*sin(x)

>    f6(0);

f6(0)

フリーの数式処理ソフトウエア Maxima では,上の2行をそのまま実行すると, 望む結果 0 が得られる.Mathematica も似たような方法で関数を定義することができる. Maple ではそうなっていない.
unapply は Maple を使う上で便利で重要な命令である. Maple に関する解説やマニュアルにもよく現れるが, Maple 独特のことのためか Maple を使っていても知らない人もいるようなので,関数と式の話を書いてみた.

(6/4/09)