eval - 評価
|
使い方
|
|
eval(e, x=a)
|
|
eval(e, eqns)
|
|
eval(e)
|
|
eval(x, n)
|
|
|
|
|
|
パラメータ
|
|
e
|
-
|
式
|
x
|
-
|
普通は名前だが一般の式のこともある
|
a
|
-
|
式
|
eqns
|
-
|
等式のリストまたは集合
|
n
|
-
|
正の整数
|
|
|
|
|
説明
|
|
•
|
eval 関数のもっともよくある使い方は、式 e を与えられた点 x=a で評価することです。たとえば、eval(x^2+3*x+2,x=1); は多項式 x^2+3*x+2 を点 で評価して 6 を得ます。
|
•
|
eval コマンドは、1-D または 2-D の使い方を用いて入力できます。たとえば、eval(x^3 + 3*x + 2, x=1) は、次に相当します。.
|
•
|
2 番目の使い方では、eqns は等式の集合またはリストですが、式 e は与えられたすべての点 (または式) において同時に評価されます。
|
•
|
通常、等式の左辺は評価される変数名です。しかし、等式の左辺 x が単純な名前ではないときは、subs と同じ制限を持つ文法規則上の置き換えが試みられます。
|
•
|
eval は各点で評価を行うので、eval を特異点で評価するために用いることはできません。代わりに limit を使います。
|
•
|
eval コマンドは導関数、積分、区分的に定義された関数などを正しく評価する方法を認識します。一方、これに対して、subs コマンドは数学的には意味をなさない置き換えをします。評価しなければいけない点と式の間に「安全でない」と考えられる記号的な相互依存があると、eval は unevaluated (未評価)を返します。この情報は Maple ライブラリにおいて Maple プロシージャ `eval/diff`、`eval/int`、`eval/piecewise` などにコードされます。ユーザはどのように評価するかを次のように Maple に指示することができます。関数 foo(y) が与えられたとします。この場合、ユーザが `eval/foo` を Maple プロシージャとして定義していると、コール eval(foo(y),x=a) によって、`eval/foo`(foo(y),x=a); が呼び出されるようになります。
|
•
|
コール eval(e) は式 e が 2 つの遅延評価 (uneval 参照) まで完全評価されることを意味します。これは e の中のそれぞれの名前がその値まで評価され、値は再帰的に評価される、そして e の中のそれぞれの関数呼び出しはそのパラメータを評価して実行されるが、遅延評価の 2 つのレベルを越えては評価されないことを意味します。
|
•
|
コール eval(x, 1) は x を深さ 1 で評価することを意味しています。つまり、名前 x に割り当てられた値がそれ以上評価されることなく返されます。より一般に、eval(x, n) は名前の深さ n までの評価を行います。
|
•
|
深さ n (n>1) までの評価は、深さ n-1 まで評価してもまだ単に名前であるような式に対して有用です。コールeval(x, n) は、n-1 から名前をさらに 1 つ深くして評価した結果を返します。
|
•
|
深さ n の評価は名前以外の式に対して直接適用することもできます。結果は式の実際の構造がどのように自動簡単化と相互作用するかにより大きく変わり得ます。
|
•
|
table、rtable および module のような配列型コンテナオブジェクトに を適用することは、各要素に map することではありません。map(eval,M) を使用して、オブジェクトの中の要素 M を評価します。
|
•
|
evalhf 環境で実行されるプロシージャ内部から呼び出された場合、eval は evalhf の外部で評価を行います。eval に対する引数シーケンス内のすべてが、シンボリックモード (つまり、記号、整数、ソフトウェアの浮動小数点値) で評価されます。評価の結果は、ハードウェアの浮動小数点またはその配列に変換されます。変換できない場合は、例外が発生します。
|
|
|
スレッド安全性
|
|
•
|
eval コマンドは、Maple 15 以後スレッドセーフです。ただし、与えられた式の評価自体がスレッドセーフである場合に限ります。
|
|
|
例
|
|
eval を用いて「点」における評価を行う例
| (1) |
| (2) |
| (3) |
>
|
eval(poly,[x=2,y=3,z=t]);
|
| (4) |
>
|
eval(int(sin(x),x),x=1);
|
| (5) |
eval が誤った答えの代わりに(正しい)エラーを返す例
| (6) |
| (7) |
eval を用いた不活性な積分、導関数の例
>
|
integral := int(f(t,a),t=a..x);
|
| (8) |
>
|
eval(integral,{t=0,a=1});
|
| (9) |
>
|
der := diff(f(x),x) + f(x);
|
| (10) |
| (11) |
いくつかの深さにおける変数 a の評価
| (12) |
| (13) |
| (14) |
デフォルトの完全な再帰評価
| (15) |
完全な再帰評価の実行
| (16) |
| (17) |
| (18) |
| (19) |
| (20) |
|
|
eval と subs の比較
|
|
|
eval コマンドは、subs コマンドとは異なります。
|
| (21) |
| (22) |
| (23) |
|
eval と subs コマンドは、それぞれ異なる方法で不活性な積分の評価を行います。subs コマンドは、不活性な式の場合では指定した値を式に挿入するのみで、評価を実行することはありません。
|
>
|
subs({a = 1, t = 0}, integral);
|
| (24) |
>
|
eval(integral, {t=0, a=1});
|
| (25) |
| (26) |
| (27) |
|
|