[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
8.1 Functions and Variables for Evaluation |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
シングルクォート演算子 '
は評価を抑制します。
シンボルにシングルクォートを用いるとシンボルが評価されません。
関数コールにシングルクォートを用いると、 関数の引数は(抑制されない限り)評価されますが、関数コールは評価されません。 結果は関数コールの名詞形です。
括弧でくくられた式にシングルクォートを用いると、
式の中のすべてのシンボルと関数コールは評価されません。
例えば、 '(f(x))
は式 f(x)
を評価しないことを意味します。
'f(x)
(f(x)
ではなく f
へ適用されたシングルクォート)は
[x]
に適用された f
の名詞形を返します。
シングルクォートは式整理を抑制しません。
グローバルフラグ noundisp
が true
の時
名詞はシングルクォート付きで表示されます。
このスイッチは関数定義を表示するときには、常にtrue
です。
例:
シンボルにシングルクォートを用いるとシンボルが評価されません。
(%i1) aa: 1024; (%o1) 1024 (%i2) aa^2; (%o2) 1048576 (%i3) 'aa^2; 2 (%o3) aa (%i4) ''%; (%o4) 1048576 |
関数コールにシングルクォートを用いると、関数の引数は評価されますが、 関数コールが評価されません。 結果は関数コールの名詞形です。
(%i1) x0: 5; (%o1) 5 (%i2) x1: 7; (%o2) 7 (%i3) integrate (x^2, x, x0, x1); 218 (%o3) --- 3 (%i4) 'integrate (x^2, x, x0, x1); 7 / [ 2 (%o4) I x dx ] / 5 (%i5) %, nouns; 218 (%o5) --- 3 |
括弧でくくられた式にシングルクォートを用いると、式の中のすべてのシンボルと関数コールは評価されません。
(%i1) aa: 1024; (%o1) 1024 (%i2) bb: 19; (%o2) 19 (%i3) sqrt(aa) + bb; (%o3) 51 (%i4) '(sqrt(aa) + bb); (%o4) bb + sqrt(aa) (%i5) ''%; (%o5) 51 |
シングルクォートは式整理を抑制しません。
(%i1) sin (17 * %pi) + cos (17 * %pi); (%o1) - 1 (%i2) '(sin (17 * %pi) + cos (17 * %pi)); (%o2) - 1 |
Maximaは組み込み数学関数による浮動小数点演算を整理とみなします。
(%i1) sin(1.0); (%o1) .8414709848078965 (%i2) '(sin(1.0)); (%o2) .8414709848078965 |
グローバルフラグ noundisp
が true
の時、
シングルクオートで名詞を表示します。
(%i1) x:%pi; (%o1) %pi (%i2) bfloat(x); (%o2) 3.141592653589793b0 (%i3) sin(x); (%o3) 0 (%i4) noundisp; (%o4) false (%i5) 'bfloat(x); (%o5) bfloat(%pi) (%i6) bfloat('x); (%o6) x (%i7) 'sin(x); (%o7) 0 (%i8) sin('x); (%o8) sin(x) (%i9) noundisp : not noundisp; (%o9) true (%i10) 'bfloat(x); (%o10) 'bfloat(%pi) (%i11) bfloat('x); (%o11) x (%i12) 'sin(x); (%o12) 0 (%i13) sin('x); (%o13) sin(x) (%i14) |
Categories: Evaluation · Operators
クォートクォート演算子''
(シングルクォートマーク2つ)は
入力式の中の評価を部分修正します。
一般式 exprにクォートクォートを用いると 入力式の中の exprに exprの値を代入します。
式の演算子にクォートクォートを用いると (もし動詞でないなら)演算子は名詞から動詞に変わります。
クォートクォート演算子は入力パーサが適用します;
クォートクォート演算子はパースされた入力式の一部としては格納されません。
クォートクォート演算子はパースされるといつもすぐに適用され、クォートできません。
このように、関数定義やラムダ式、シングルクォート'
でクォートされた式の中のように通常評価が抑制される時も、
クォートクォートがあると評価を実行します。
例:
一般式 exprにクォートクォートを用いると入力式の中の exprに exprの値を代入します。
(%i1) expand ((a + b)^3); 3 2 2 3 (%o1) b + 3 a b + 3 a b + a (%i2) [_, ''_]; 3 3 2 2 3 (%o2) [expand((b + a) ), b + 3 a b + 3 a b + a ] (%i3) [%i1, ''%i1]; 3 3 2 2 3 (%o3) [expand((b + a) ), b + 3 a b + 3 a b + a ] (%i4) [aa : cc, bb : dd, cc : 17, dd : 29]; (%o4) [cc, dd, 17, 29] (%i5) foo_1 (x) := aa - bb * x; (%o5) foo_1(x) := aa - bb x (%i6) foo_1 (10); (%o6) cc - 10 dd (%i7) ''%; (%o7) - 273 (%i8) ''(foo_1 (10)); (%o8) - 273 (%i9) foo_2 (x) := ''aa - ''bb * x; (%o9) foo_2(x) := cc - dd x (%i10) foo_2 (10); (%o10) - 273 (%i11) [x0 : x1, x1 : x2, x2 : x3]; (%o11) [x1, x2, x3] (%i12) x0; (%o12) x1 (%i13) ''x0; (%o13) x2 (%i14) '' ''x0; (%o14) x3 |
式の演算子にクォートクォートを用いると (もし動詞でないなら)演算子は名詞から動詞に変わります。
(%i1) declare (foo, noun); (%o1) done (%i2) foo (x) := x - 1729; (%o2) ''foo(x) := x - 1729 (%i3) foo (100); (%o3) foo(100) (%i4) ''foo (100); (%o4) - 1629 |
クォートクォート演算子は入力パーサが適用します; クォートクォート演算子はパースされた入力式の一部としては格納されません。
(%i1) [aa : bb, cc : dd, bb : 1234, dd : 5678]; (%o1) [bb, dd, 1234, 5678] (%i2) aa + cc; (%o2) dd + bb (%i3) display (_, op (_), args (_)); _ = cc + aa op(cc + aa) = + args(cc + aa) = [cc, aa] (%o3) done (%i4) ''(aa + cc); (%o4) 6912 (%i5) display (_, op (_), args (_)); _ = dd + bb op(dd + bb) = + args(dd + bb) = [dd, bb] (%o5) done |
関数定義やラムダ式、シングルクォート'
でクォートされた式の中のように
通常評価が抑制される時も、
クォートクォートがあると評価を実行します。
(%i1) foo_1a (x) := ''(integrate (log (x), x)); (%o1) foo_1a(x) := x log(x) - x (%i2) foo_1b (x) := integrate (log (x), x); (%o2) foo_1b(x) := integrate(log(x), x) (%i3) dispfun (foo_1a, foo_1b); (%t3) foo_1a(x) := x log(x) - x (%t4) foo_1b(x) := integrate(log(x), x) (%o4) [%t3, %t4] (%i5) integrate (log (x), x); (%o5) x log(x) - x (%i6) foo_2a (x) := ''%; (%o6) foo_2a(x) := x log(x) - x (%i7) foo_2b (x) := %; (%o7) foo_2b(x) := % (%i8) dispfun (foo_2a, foo_2b); (%t8) foo_2a(x) := x log(x) - x (%t9) foo_2b(x) := % (%o9) [%t7, %t8] (%i10) F : lambda ([u], diff (sin (u), u)); (%o10) lambda([u], diff(sin(u), u)) (%i11) G : lambda ([u], ''(diff (sin (u), u))); (%o11) lambda([u], cos(u)) (%i12) '(sum (a[k], k, 1, 3) + sum (b[k], k, 1, 3)); (%o12) sum(b , k, 1, 3) + sum(a , k, 1, 3) k k (%i13) '(''(sum (a[k], k, 1, 3)) + ''(sum (b[k], k, 1, 3))); (%o13) b + a + b + a + b + a 3 3 2 2 1 1 |
Categories: Evaluation · Operators
引数arg_1, …, arg_nで指定された環境下で 式exprを評価します。 引数はスイッチ(ブーリアンフラグ)だったり、割り当てだったり、 等式だったり、関数だったりします。 evは評価の結果(別の式)を返します。
評価は以下のようにステップを追って実行されます。
simp
を引数に指定するとexprを整理します。false
なら整理を抑制するスイッチsimp
の設定に関わらずです。
noeval
を引数に指定するとev
の評価フェイズを抑制します。
(以下のステップ(4)を参照してください。)
これは、他のスイッチとの連携時や、exprを再評価せずに再整理をさせる時に役に立ちます。
nouns
を引数に指定するとexprの中の名詞形式
(典型的には、'integrate
や'diff
のような未評価関数)を評価します。
expand
を引数に指定すると展開します。
expand (m, n)
を引数に指定すると、
maxposex
とmaxnegex
の値をそれぞれmとnに設定して、展開します。
detout
を引数に指定すると、exprの中で計算されるどんな逆行列も、逆行列の外側に行列式を保つようにします。
diff
を引数に指定するとexprの中のすべての微分を実行します。
derivlist (x, y, z, ...)
を引数に指定すると指定された変数に関する微分のみを実行します。
risch
を引数に指定すると
exprの中の積分をRischアルゴリズムを使って評価します。
risch
を参照してください。
特殊なシンボルnouns
を使った時には標準の積分ルーチンが呼び出されます。
float
を引数に指定すると非整数有理数を浮動小数点に変換します。
numer
を引数に指定すると数値引数が指定された(指数関数を含む)いくつかの数学関数を浮動小数点に評価します。
また、exprの中の numerval宣言された変数は、宣言された値に置き換えられます。
また、float
スイッチをオンにします。
pred
を引数に指定すると述語(true
もしくはfalse
に評価される式)を評価します。
eval
を引数に指定するとexprの特別な後評価をします。(ステップ(5)を参照。)
eval
は複数回起こるかもしれません。eval
のそれぞれのインスタンスのために、式は再評価されます。
evflag
を参照)として宣言されたアトムA
を引数に指定すると、
exprの評価の最中、A
がtrue
にバインドされます。
V: expression
(もしくは代わりにV=expression
)を引数に指定すると、
exprの評価の最中、V
がexpression
の値にバインドされます。
もしV
がMaximaオプションなら、exprの評価の最中、V
の値にexpression
が使われることに注意してください。
もしev
の複数の引数がこのタイプの場合、並列してバインドされます。
もしV
が非アトムの式なら、バインドではなく、代入が実行されます。
F
が評価関数(evfun
参照)として宣言されている場合、
F
を引数に指定すると F
が exprに適用されます。
sum
)でも引数に指定すると、
exprの中にそれらの名前が現れた時それらが動詞であるかのように評価します。
F(x)
としましょう)を、
exprの今回の評価の目的のため、
F(X) := expression
をev
の引数に与えて、局所的に定義することができます。
ev
に与えられた追加の引数であるかのように扱います。
これにより、 solve
が返すような、与えられた等式のリスト
(例えば、 [X=1,Y=A**2]
)や
等式の名前のリスト(例えば、 [%t1, %t2]
。ここで %t1
, %t2
は等式)が使えます。
ev
の引数は代入等式と評価関数以外はどんな順序で与えてもかまいません。
代入等式は左から右へ順に扱われ、
評価関数は、例えば、 ev (expr, ratsimp, realpart)
は
realpart (ratsimp (expr))
と扱われるように合成されます。
simp
, numer
, float
スイッチは、ブロックの中でローカルにも、
またMaximaの中でグローバルにも設定でき、その場合リセットされるまで効果を保ちます。
numer
と float
スイッチがともに true
でない場合、
もし exprが標準有理式(CRE)なら ev
が返す式もまたCREです。
%i2
のように) %
だったりするので、
その場合,このステップは単にラベルされた式を取り出し、
ev
はその式に対して機能することになります。
noeval
が指定されていない限り)結果の式は再評価され
引数に従って整理されます。
exprの中のどんな関数コールもその中の変数が評価された後実行されること、
ev(F(x))
は F(ev(x))
のように振る舞うことに注意してください。
eval
のそれぞれのインスタンスのために
step (3)(4)を繰り返します。
例:
(%i1) sin(x) + cos(y) + (w+1)^2 + 'diff (sin(w), w); d 2 (%o1) cos(y) + sin(x) + -- (sin(w)) + (w + 1) dw (%i2) ev (%, numer, expand, diff, x=2, y=1); 2 (%o2) cos(w) + w + 2 w + cos(1) + 2.449599732693821 |
ev
のために代わりのトップレベルの文法が提供されています。
それによってev()
なしに引数をタイプして入力するだけでよくなります。
すなわち、単に以下のように書けます。
expr, arg_1, ..., arg_n |
これは、例えば、関数やブロックの中など、他の式の一部としては許されません。
以下の例では並列のバインドプロセスに注意してください。
(%i3) programmode: false; (%o3) false (%i4) x+y, x: a+y, y: 2; (%o4) y + a + 2 (%i5) 2*x - 3*y = 3$ (%i6) -3*x + 2*y = -4$ (%i7) solve ([%o5, %o6]); Solution 1 (%t7) y = - - 5 6 (%t8) x = - 5 (%o8) [[%t7, %t8]] (%i8) %o6, %o8; (%o8) - 4 = - 4 (%i9) x + 1/x > gamma (1/2); 1 (%o9) x + - > sqrt(%pi) x (%i10) %, numer, x=1/2; (%o10) 2.5 > 1.772453850905516 (%i11) %, pred; (%o11) true |
Categories: Evaluation
ev (expr)
のコールの引数として
eval
は
exprの追加の評価をもたらします。
ev
を参照してください。
例:
(%i1) [a:b,b:c,c:d,d:e]; (%o1) [b, c, d, e] (%i2) a; (%o2) b (%i3) ev(a); (%o3) c (%i4) ev(a),eval; (%o4) e (%i5) a,eval,eval; (%o5) e |
Categories: Evaluation flags
シンボルx
がevflag
プロパティを持つ時、
式ev(expr, x)
や対話プロンプトでのexpr, x
は
ev(expr, x = true)
と同値です。
すなわち、exprが評価される間、xはtrue
にバインドされます。
式declare(x, evflag)
は、変数xにevflag
プロパティを与えます。
デフォルトでevflag
プロパティを持つフラグは以下の通りです:
algebraic cauchysum demoivre dotscrules %emode %enumer exponentialize exptisolate factorflag float halfangles infeval isolate_wrt_times keepfloat letrat listarith logabs logarc logexpand lognegint m1pbranch numer_pbranch programmode radexpand ratalgdenom ratfac ratmx ratsimpexpons simp simpproduct simpsum sumexpand trigexpand
例:
(%i1) sin (1/2); 1 (%o1) sin(-) 2 (%i2) sin (1/2), float; (%o2) 0.479425538604203 (%i3) sin (1/2), float=true; (%o3) 0.479425538604203 (%i4) simp : false; (%o4) false (%i5) 1 + 1; (%o5) 1 + 1 (%i6) 1 + 1, simp; (%o6) 2 (%i7) simp : true; (%o7) true (%i8) sum (1/k^2, k, 1, inf); inf ==== \ 1 (%o8) > -- / 2 ==== k k = 1 (%i9) sum (1/k^2, k, 1, inf), simpsum; 2 %pi (%o9) ---- 6 (%i10) declare (aa, evflag); (%o10) done (%i11) if aa = true then YES else NO; (%o11) NO (%i12) if aa = true then YES else NO, aa; (%o12) YES |
Categories: Evaluation flags · Simplification flags and variables
関数 Fが evfun
プロパティを持つ時、
式 ev(expr, F)
や(対話プロンプトでの)
expr, F
は F(ev(expr))
と同値です。
もし2つ以上の evfun
関数 F, Gなどが指定されたなら
関数は指定された順に適用されます。
式 declare(F, evfun)
は関数 Fに evfun
プロパティを与えます。
デフォルトで evfun
プロパティを持つ関数は以下の通りです:
bfloat factor fullratsimp logcontract polarform radcan ratexpand ratsimp rectform rootscontract trigexpand trigreduce
例:
(%i1) x^3 - 1; 3 (%o1) x - 1 (%i2) x^3 - 1, factor; 2 (%o2) (x - 1) (x + x + 1) (%i3) factor (x^3 - 1); 2 (%o3) (x - 1) (x + x + 1) (%i4) cos(4 * x) / sin(x)^4; cos(4 x) (%o4) -------- 4 sin (x) (%i5) cos(4 * x) / sin(x)^4, trigexpand; 4 2 2 4 sin (x) - 6 cos (x) sin (x) + cos (x) (%o5) ------------------------------------- 4 sin (x) (%i6) cos(4 * x) / sin(x)^4, trigexpand, ratexpand; 2 4 6 cos (x) cos (x) (%o6) - --------- + ------- + 1 2 4 sin (x) sin (x) (%i7) ratexpand (trigexpand (cos(4 * x) / sin(x)^4)); 2 4 6 cos (x) cos (x) (%o7) - --------- + ------- + 1 2 4 sin (x) sin (x) (%i8) declare ([F, G], evfun); (%o8) done (%i9) (aa : bb, bb : cc, cc : dd); (%o9) dd (%i10) aa; (%o10) bb (%i11) aa, F; (%o11) F(cc) (%i12) F (aa); (%o12) F(bb) (%i13) F (ev (aa)); (%o13) F(cc) (%i14) aa, F, G; (%o14) G(F(cc)) (%i15) G (F (ev (aa))); (%o15) G(F(cc)) |
Categories: Evaluation flags
「無限評価」モードにします。
ev
は値が変わらなくなるまで式を繰り返し評価します。
このモードで変数 (X
とします)が評価されることを避けるには、単に
X='X
を ev
の引数として含めます。
ev (X, X=X+1, infeval)
のような式はもちろん、無限ループを引き起こします。
Categories: Evaluation flags
noeval
は ev
の評価フェイズを抑制します。
これは、他のスイッチと連携したり、
式を再評価することなしに再整理したりするのに役に立ちます。
Categories: Evaluation flags
nouns
は evflag
の1つです。
ev
コマンドのオプションとして使われる時、
nouns
は式の中に現れる「名詞」形すべてを「動詞」に ev
します。
すなわち、それらを評価します。
noun
, nounify
, verb
, verbify
も参照してください。
Categories: Evaluation flags · Nouns and verbs
ev (expr)
のコールでの引数として、
pred
は
述語論理 (true
または false
に評価される式)を評価するようにします。
ev
を参照してください。
例:
(%i1) 1<2; (%o1) 1 < 2 (%i2) 1<2,pred; (%o2) true |
Categories: Evaluation flags
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated by 市川雄二 on June, 21 2016 using texi2html 1.76.