Next: , Previous:   [Contents][Index]

9 Simplification


9.1 Functions and Variables for Simplification

キーワード: additive

もしdeclare(f, additive)が実行されると:

(1) もしfが1変数関数なら、fが和に適用された時はいつでも、 fは和の上に分配整理されます。 例えば、f(y+x)は、f(y)+f(x)に整理されます。

(2) もしfが2変数以上の関数なら、 sumintegrateの場合と同様に 加法性が第一番目の引数に対して定義されます。 例えば、f(h(x)+g(x),x)f(h(x),x)+f(g(x),x)に整理されます。 fsum(x[i],i,lower-limit,upper-limit)の形の式に適用されたときには この整理はされません。

宣言: antisymmetric

もしdeclare(h,antisymmetric)が実行されると、 hは反対称として整理されます。 例えば、h(x,z,y)-h(x,y,z)と整理されます。 即ち、symmetriccommutativeで得られた結果に(-1)^nを掛けたものとなります。 ここで、nはその形に変換するのに必要な置換の回数です。

関数: combine (expr)

同じ分母を持つ項を単一の項に結合することによって和exprを整理します。

宣言: commutative

もしdeclare(h,commutative)が実行されたなら、 hは可換関数として整理されます。 例えば、h(x,z,y)h(x,y,z)に整理されます。 これはsymmetricと同じです。

関数: demoivre (expr)
オプション変数: demoivre

関数demoivre (expr)は、 グローバル変数demoivreを設定することなしに式を変換します。

変数demoivretrueの時、 複素数の指数関数は、円関数の項で表した同値な式に変換されます: もしb%iを含まなければ、 exp (a + b*%i)は、%e^a * (cos(b) + %i*sin(b))に整理されます。 abは展開されません。

demoivreのデフォルト値はfalseです。

exponentializeは、円関数や双曲関数を指数関数形に変換します。 demoivreexponentializeは、同時に両方trueにはできません。

関数: distrib (expr)

和を積上に分配します。 式のトップレベルのみで働き、すなわち、再帰的でなく、 expandより速い点で、expandとは違います。 トップレベルの和すべてを展開する点で、multthruとは違います。

例:

(%i1) distrib ((a+b) * (c+d));
(%o1)                 b d + a d + b c + a c
(%i2) multthru ((a+b) * (c+d));
(%o2)                 (b + a) d + (b + a) c
(%i3) distrib (1/((a+b) * (c+d)));
                                1
(%o3)                    ---------------
                         (b + a) (d + c)
(%i4) expand (1/((a+b) * (c+d)), 1, 0);
                                1
(%o4)                 ---------------------
                      b d + a d + b c + a c
オプション変数: distribute_over

デフォルト値: true

distribute_overは、 リストや行列や等式のようなバッグ(重複を許す集合)上の関数のマッピングを制御します。 今回、すべてのMaxima関数がこのプロパティを持つ訳ではありません。 このプロパティはコマンドpropertiesで調べることが可能です。

distribute_overを値falseに設定した時、 関数のマッピングはオフにスイッチされます。

例:

sin関数はリスト上にマップします:

(%i1) sin([x,1,1.0]);
(%o1)                 [sin(x), sin(1), .8414709848078965]

modは リスト上にマップされる2変数関数です。 入れ子のリスト上のマッピングも可能です:

(%i2) mod([x,11,2*a],10);
(%o2)                    [mod(x, 10), 1, 2 mod(a, 5)]
(%i3) mod([[x,y,z],11,2*a],10);
(%o3)       [[mod(x, 10), mod(y, 10), mod(z, 10)], 1, 2 mod(a, 5)]

floor関数の行列や等式上のマッピング:

(%i4) floor(matrix([a,b],[c,d]));
                            [ floor(a)  floor(b) ]
(%o4)                       [                    ]
                            [ floor(c)  floor(d) ]
(%i5) floor(a=b);
(%o5)                         floor(a) = floor(b)

1変数以上の関数は、任意の引数上、または、すべての引数上にマップします:

(%i6) expintegral_e([1,2],[x,y]);
(%o6) [[expintegral_e(1, x), expintegral_e(1, y)], 
       [expintegral_e(2, x), expintegral_e(2, y)]]

関数がプロパティdistribute_overを持つかチェックします:

(%i7) properties(abs);
(%o7) [integral, distributes over bags, noun, rule, gradef]
オプション変数: domain

デフォルト値: real

domaincomplexに設定されている時、 sqrt (x^2)は、abs(x)を返さず、sqrt (x^2) のままを保ちます。

宣言: evenfun
宣言: oddfun

declare(f, evenfundeclare(f, oddfunは 関数 fを奇関数か偶関数として認識するように指示します。

例:

(%i1) o (- x) + o (x);
(%o1)                     o(x) + o(- x)
(%i2) declare (o, oddfun);
(%o2)                         done
(%i3) o (- x) + o (x);
(%o3)                           0
(%i4) e (- x) - e (x);
(%o4)                     e(- x) - e(x)
(%i5) declare (e, evenfun);
(%o5)                         done
(%i6) e (- x) - e (x);
(%o6)                           0
関数: expand (expr)
関数: expand (expr, p, n)

exprを展開します。 指数和や和の積の積を実行し、有理式の分子をそれぞれの項に分割し、 (可換、非可換な)積がexprのすべてのレベルの和で分配されます。

多項式の場合、もっと効率的なアルゴリズムのratexpandを普通使うべきです。

maxnegexmaxposexはそれぞれ、展開される最大の負と正の指数を制御します。

expand (expr, p, n)は、 exprを、maxposexpmaxnegexnを使って展開します。 これは、式のすべてではなく、一部を展開するために役立ちます。

expon - 自動的に展開される最大の負のべきの指数(expandのコールに独立して)。 例えば、もしもexponが4なら(x+1)^(-5)は自動では展開されません。

expop - 自動的に展開される最大の正の指数。 もしexpopが3以上なら、(x+1)^3は自動的に展開されます。 もしnexpopよりも大きい時(x+1)^nが展開されるのが望まれるなら、 maxposexnより小さくない場合のみ、expand ((x+1)^n)の実行が行われます。

evで使われるexpandフラグによって展開が実行されます。

ファイルshare/simplification/facexp.macは、 ユーザーに制御された展開によって式を構成する機能を提供するいくつかの関連関数 (特に自動ロードされるfacsum, factorfacsumcollectterms)と 変数(nextlayerfactorfacsum_combine)を含みます。 簡単な関数の記述がsimplification/facexp.usgにあります。 demo("facexp")でデモが実行できます。

例:

(%i1) expr:(x+1)^2*(y+1)^3;
                               2        3
(%o1)                   (x + 1)  (y + 1)
(%i2) expand(expr);
       2  3        3    3      2  2        2      2      2
(%o2) x  y  + 2 x y  + y  + 3 x  y  + 6 x y  + 3 y  + 3 x  y
                                                      2
                                     + 6 x y + 3 y + x  + 2 x + 1
(%i3) expand(expr,2);
               2        3              3          3
(%o3)         x  (y + 1)  + 2 x (y + 1)  + (y + 1)
(%i4) expr:(x+1)^-2*(y+1)^3;
                                   3
                            (y + 1)
(%o4)                       --------
                                   2
                            (x + 1)
(%i5) expand(expr);
            3               2
           y             3 y            3 y             1
(%o5) ------------ + ------------ + ------------ + ------------
       2              2              2              2
      x  + 2 x + 1   x  + 2 x + 1   x  + 2 x + 1   x  + 2 x + 1
(%i6) expand(expr,2,2);
                                   3
                            (y + 1)
(%o6)                     ------------
                           2
                          x  + 2 x + 1

展開なしに式を再整理します:

(%i7) expr:(1+x)^2*sin(x);
                                       2
(%o7)                           (x + 1)  sin(x)
(%i8) exponentialize:true;
(%o8)                                true
(%i9) expand(expr,0,0);
                                   2    %i x     - %i x
                         %i (x + 1)  (%e     - %e      )
(%o9)                  - -------------------------------
                                        2
関数: expandwrt (expr, x_1, ..., x_n)

exprを、変数x_1, ..., x_nに関して展開します。 変数を含む積すべては陽に現れます。 返される形式は、変数を含む式の和の積を含みません。 x_1, ..., x_nは、変数、演算子、式であり得ます。

デフォルトでは、分母は展開されませんが、これは、スイッチexpandwrt_denomによって 制御することができます。

この関数はsimplification/stopex.macから自動ロードされます。

オプション変数: expandwrt_denom

デフォルト値: false

expandwrt_denomは、expandwrtによって有理式の扱いを制御します。 もしtrueなら、式の分子も分母もexpandwrtの引数に従って展開されますが、 もしexpandwrt_denomfalseなら、分子だけがその方法で展開されます。

関数: expandwrt_factored (expr, x_1, ..., x_n)

expandwrtに似ていますが、積の式を幾分違って扱います。 expandwrt_factoredは、exprの、 変数x_1, ..., x_nを含む因子上でだけ展開します。

この関数は、simplification/stopex.macから自動ロードされます。

オプション変数: expon

デフォルト値: 0

exponは、(expandのコールに依らず)自動的に展開される負のべき乗の最大指数です。 例えば、 もしexponが4なら、 (x+1)^(-5)は自動的には展開されません。

関数: exponentialize (expr)
オプション変数: exponentialize

関数exponentialize (expr)は、 exprの中の円関数や双曲関数を指数関数に変換します。 グローバル変数exponentializeを設定する必要はありません。

変数exponentializetrueの時、 円関数や双曲関数すべては指数関数形に変換されます。 デフォルト値はfalseです。

demoivreは複素数の指数関数を円関数に変換します。 exponentializedemoivreは同時にtrueにすることはできません。

オプション変数: expop

デフォルト値: 0

expopは、自動的に展開される最高の正の指数です。 例えば、(x + 1)^3が入力された時、 expopが3以下の時だけ自動的に展開されます。 もし、nexpopより大きい(x + 1)^nが展開されることを望むなら、 expand ((x + 1)^n)の実行は、 maxposexがn以上の時だけ機能します。

宣言: lassociative

declare (g, lassociative)は、 Maximaの整理器に gが左結合であることを告げます。 例えば、g (g (a, b), g (c, d))g (g (g (a, b), c), d)に整理されます。

宣言: linear

Maximaの演算子のプロパティの1つ。 そう宣言された1変数関数fに関して、 "expansion" f(x + y)f(x) + f(y)を出力し、 aが定数のf(a*x)は、a*f(x)を出力します。 2つ以上の引数の関数に関しては、 「線形性」は、sumintegrateの場合のように定義されます。 すなわち、abxに独立の場合, f (a*x + b, x)a*f(x,x) + b*f(1,x)を出力します。

linearは、additiveかつoutativeと同値です。 oppropertiesも参照してください。

オプション変数: maxnegex

デフォルト値: 1000

maxnegexは、 expandコマンドによって展開される最大の負の指数です。 (maxposex)も参照してください。)

オプション変数: maxposex

デフォルト値: 1000

maxposexは、 expandコマンドで展開される最大指数です。 (maxnegex)も参照してください。)

宣言: multiplicative

declare (f, multiplicative)は、Maxima整理器に fが乗法的であることを告げます。

  1. もしfが1変数関数なら、 整理器が積に適用されたfに出会うといつでも、 fはその積上に分配されます。 例えば、f(x*y)f(x)*f(y)に整理されます。
  2. もしfが多変数関数なら、 乗法性は、fの最初の引数の乗法性として定義されます。 例えば、 f (g(x) * h(x), x)は、f (g(x) ,x) * f (h(x), x)に整理されます。

この式整理は、fproduct (x[i], i, m, n)の形の式に適用された時にはなされません。

関数: multthru (expr)
関数: multthru (expr_1, expr_2)

exprの(和の)因子にexprの他の因子を掛ける。 すなわち、exprf_1 f_2 ... f_nです。 ここで、少なくとも1つの因子、f_iとしましょう、は項の和です。 この和の各項に、積の中の他の因子を掛けます。 (すなわち、f_iを除いた因子すべてです。) multthruは、指数化された和を展開しません。 この関数は、(可換であれ非可換であれ)積を和上に分配する最も速い方法です。 割り算は積として表現されるので、 multthruは積によって和を割ることにも使うことができます。

multthru (expr_1, expr_2)は、 (和もしくは等式の)expr_2の中の各項にexpr_1を掛けます。 もしexpr_1がそれ自身和でなければ、 この形式はmultthru (expr_1*expr_2)と同値です。

(%i1) x/(x-y)^2 - 1/(x-y) - f(x)/(x-y)^3;
                      1        x         f(x)
(%o1)             - ----- + -------- - --------
                    x - y          2          3
                            (x - y)    (x - y)
(%i2) multthru ((x-y)^3, %);
                           2
(%o2)             - (x - y)  + x (x - y) - f(x)
(%i3) ratexpand (%);
                           2
(%o3)                   - y  + x y - f(x)
(%i4) ((a+b)^10*s^2 + 2*a*b*s + (a*b)^2)/(a*b*s^2);
                        10  2              2  2
                 (b + a)   s  + 2 a b s + a  b
(%o4)            ------------------------------
                                  2
                             a b s
(%i5) multthru (%);  /* note that this does not expand (b+a)^10 */
                                        10
                       2   a b   (b + a)
(%o5)                  - + --- + ---------
                       s    2       a b
                           s
(%i6) multthru (a.(b+c.(d+e)+f));
(%o6)            a . f + a . c . (e + d) + a . b
(%i7) expand (a.(b+c.(d+e)+f));
(%o7)         a . f + a . c . e + a . c . d + a . b
宣言: nary

declare(f, nary)はMaximaに 関数 fをn項関数として認識するよう指示します。

nary宣言は nary関数をコールするのと同じではありません。 declare(f, nary)は唯一の効果は 例えば、 foo(x, foo(y, z))foo(x, y, z)に整理するように 入れ子の式をフラットにするようMaxima整理器に指示することです。 declare.も参照してください。

例:

(%i1) H (H (a, b), H (c, H (d, e)));
(%o1)               H(H(a, b), H(c, H(d, e)))
(%i2) declare (H, nary);
(%o2)                         done
(%i3) H (H (a, b), H (c, H (d, e)));
(%o3)                   H(a, b, c, d, e)
オプション変数: negdistrib

デフォルト値: true

negdistribtrueの時, -1が式上に分配されます。 例えば、-(x + y)- y - xになります。 falseに設定すると、- (x + y)はそのまま表示されることになるでしょう。 これは時々役に立ちますが、非常に注意してください; simpフラグ同様に、 当然のことながら、Maximaの中でローカルな使用以外には、 これは、falseに設定したくないフラグの1つです。

システム変数: opproperties

oppropertiesは、Maximaの整理器が認識する特殊演算子プロパティのリストです: linear, additive, multiplicative, outative, evenfun, oddfun, commutative, symmetric, antisymmetric, nary, lassociative, rassociative.

宣言: outative

declare (f, outative)は、Maximaの整理器に fの引数の中の定数因子が外に出すことができることを告げます。

  1. もしfが1変数関数なら、 整理器が積に適用されたfに出会うといつでも、その積は定数因子と、ていすうでない因子に分割され、定数因子が外に出されます。 例えば、f(a*x)は、aを定数とすると、a*f(x)に整理されます。 非アトムな定数因子は外に出されません。
  2. もしfが多変数関数なら、 outativityは、sumintegrateの場合のように定義されます。 すなわち、f (a*g(x), x)は、axに依らないとすると、 a * f(g(x), x)に整理されます。

sum, integrate, limitはすべてoutativeです。

関数: radcan (expr)

対数関数、指数関数、累乗根を含むexprを、与えられ場変数の順序で式の大きなクラス上の標準形式に整理します; 関数的に同値な形式は特殊な形式にマップされます。 式の幾分大きなクラスのため、radcanは正規の形式を生成します。 このクラスの2つの式は、必ずしも、同じ結果ではありませんが、それらの差はradcanによって0に整理されます。

いくつかの式のため、radcanは特殊な時間消費をします。 これは、因数分解や指数関数の部分分解展開に基づいた整理のための式のコンポーネントの間のある関係を探求するコストです。

例:

(%i1) radcan((log(x+x^2)-log(x))^a/log(1+x)^(a/2));
                                           a/2
(%o1)                            log(x + 1)

(%i2) radcan((log(1+2*a^x+a^(2*x))/log(1+a^x)));
(%o2)                                  2

(%i3) radcan((%e^x-1)/(1+%e^(x/2)));
                                     x/2
(%o3)                              %e    - 1
オプション変数: radexpand

デフォルト値: true

radexpandは、根号のいくつかの整理を制御します。

radexpandallの時 n乗の積の因子のn番目の根を根号の外に出すようにします。 例えば、もしradexpandallなら、 sqrt (16*x^2)4*xに整理されます。

特に、sqrt (x^2)を考えます。

  • もしradexpandallもしくはassume (x > 0)が実行されたなら、 sqrt(x^2)xに整理されます。
  • もしradexpandtrue、かつdomainreal(これはデフォルトです)なら、 sqrt(x^2)abs(x)に整理されます。
  • もしradexpandfalse、もしくは、radexpandtrueかつdomaincomplexなら、 sqrt(x^2)は整理されません。

domainは、radexpandtrueの時だけ意味を持つことに注意してください。

宣言: rassociative

declare (g, rassociative)は、 Maximaの整理器に gが右結合であることを告げます。 例えば、 g(g(a, b), g(c, d))は、g(a, g(b, g(c, d)))に整理されます。

関数: scsimp (expr, rule_1, ..., rule_n)

順次的な相対整理(Sequential Comparative Simplification) (Stouteによる方法)。 scsimpは、 規則rule_1, ..., rule_nに従って、 exprを整理しようとします。 もしより小さな式が得られたら、 プロセスは繰り返されます。 そうでなければ、すべての整理が試された後、 元の答えを返します。

example (scsimp)はいくつかの例を表示します。

オプション変数: simp

デフォルト値: true

simpは整理を有効にします。 これは標準です。 simpevflagでもあります。 それは関数evに認識されます。evを参照してください。

simpが 値falseevflagとして使われる時、 式の評価フェイズの間だけ 整理は抑制されます。 フラグは評価フェイズに続く整理を抑制できません。

例:

整理がグローバルにオフにスイッチされます。 式sin(1.0)は数値に整理されません。 simp-フラグは整理をオンにスイッチします。

(%i1) simp:false;
(%o1)                                false
(%i2) sin(1.0);
(%o2)                              sin(1.0)
(%i3) sin(1.0),simp;
(%o3)                          .8414709848078965

整理が再びオンにスイッチされます。 simp-フラグは完全に整理を抑制できません。 割り当ては式の評価フェイズの間に起こるので、 出力は整理された式を示しますが、 変数xは、値として未整理の式を持ちます。

(%i4) simp:true;
(%o4)                                true
(%i5) x:sin(1.0),simp:false;
(%o5)                          .8414709848078965
(%i6) :lisp $X
((%SIN) 1.0)
宣言: symmetric

declare (h, symmetric)は、Maximaの整理器に hが対称関数であることを告げます。 例えば、h (x, z, y)h (x, y, z)に整理されます。

commutativesymmetricと同義です。

関数: xthru (expr)

(和でなければいけない)exprのすべての項を、 共通分母上で、ratsimpがするように積や指数和を展開することなしに結合させます。 xthruは、因子が陽であるときだけ、有理式の分子と分母の共通因子を消去します。

分子と分母の最大公約数の陽因子を消去するために、式をratsimpする前にxthruを使うのがよい場合があります。

(%i1) ((x+2)^20 - 2*y)/(x+y)^20 + (x+y)^(-19) - x/(x+y)^20;
                                20
                 1       (x + 2)   - 2 y       x
(%o1)        --------- + --------------- - ---------
                    19             20             20
             (y + x)        (y + x)        (y + x)
(%i2) xthru (%);
                                 20
                          (x + 2)   - y
(%o2)                     -------------
                                   20
                            (y + x)

Next: , Previous:   [Contents][Index]