[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9. Simplification


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.1 Introduction to Simplification

Maximaは、新しくユーザーがタイプしたコマンドそれぞれに対応してアクションのサイクルを実行します。 これは4つのステップからなります:入力を読み「パース」すること、評価、整理、そして出力。 パースは文法的に有効な一連のタイプされた文字を操作の残りで使うデータ構造に変換します。 評価は名前を割り当てられた値に置き換えます。 整理は式をユーザーや他のプログラムがより理解しやすいように書き直すことを意味します。 出力は様々な異なるフォーマットや記法で計算結果を表示することを含みます。

評価や整理は、どちらも「複雑さ」を取り除くことがゴールなので、時々、似た機能を持つように見えます。 システム設計者は時々、それぞれで部分的に実行されるようにタスクを分割します。 例えば、 integrate(x,x)は答えを x*x/2と評価し、それは、 x^2/2に整理されます。

評価はいつも存在します: それは、関数、サブルーチン、変数、値、ループ、割り当てなどを持つプログラミングシステムを持つことの 結果です。 評価ステップでは、組み込みかユーザー定義の関数名はそれらの定義に置き換えられ、変数はそれらの値に置き換えられます。 これは、従来のプログラミング言語の活動と大部分同じですが、 記号数学データも扱うように拡張されました。 目下の数学の汎用性のため、異なる可能な評価モデルがあり、 システムは評価のプロセスの舵をとるオプションの「フラグ」を持ちます。 See section Functions and Variables for Evaluation

対照的に、整理の意図は、表現を再再定式化して、より小さく、理解しやすく、 (因数分解や展開のように)特定の仕様に準じるように式の値を整備することです。 例えば、  sin(0)0に、 x+x2*xに。 整理の結果を変えるいくつかの強力なツールがあります。 新しく導入された関数や記号記法の知識をユーザーがMaximaに取り込むことができることの大半はシステムのこの部分だからです。

整理は一般に4つの異なるレベルで行われます:

内部の整理器はMaximaの心臓部に属します。 それは大きく複雑なプログラムの集まりであり、何年にも渡って数千のユーザーの手で改良され続けています。 それでもやはり、特に、新しいアイデアや従来とは違う記法を試すなら、 自分自身でプログラムに小さな(また大きな)変更を加えることが役に立つことがわかるかもしれません。 詳細は例えば、 https://people.eecs.berkeley.edu/~fateman/papers/intro5.txt の終わりの論文を参照してください。

Maximaは内部的に、演算子を使った「ツリー」として、すなわち +, * , =のような「ルート」と、x, y, zのような変数や 関数、 x*yのようなサブツリーである演算数(「リーフ」)で式を表現します。 演算子それぞれはそれと連携した整理プログラムを持ちます。 +(これはa-b = a+(-1)*b)なので二項演算子 -もカバーします)と *(これはa/b = a*b^(-1)なので二項演算子 /もカバーします) はかなり込み入った整理プログラムを持ちます。 これらの整理プログラム(simplus, simptimes, simpexptなど)は 整理器が解析中の式ツリーの中でそれぞれの算術演算子を見つけると常にコールされます。

整理器の構造は1965年まで遡り、以来多くの手が加えられています。 その構造は現代の専門用語で言うと、データ指示でオブジェクト指向です。 プログラムは、式の、あるサブツリーの根に依存して適切なルーチンを再帰的に送ります。 この汎用の概念は、 プログラムへの非常に局所的な変更で整理プロセスへの修正を行うことができることを意味します。 多くの場合、既存のコードを乱すことなく演算子とその整理器を追加することは概念的に簡単です。

代数式ツリーに演算するこの汎用の整理器に加えて、 Maximaの式のいくつかの他の表現がメソッドと整理器を分離することに注意を払います。 例えば、rat()関数は、そんな形式の高速な操作を助けるために、多項式を係数のベクトルに変換します。 他の表現にはTaylor級数や(滅多に使われない)Poisson級数があります。

ユーザーが導入するすべての演算子は、初期状態としてそれらと連携した整理器を持ちません。 Maximaは関数"f"に関して何も知らないので、 f(a,b)とタイプすると、 a, bは整理されますが、 fについては整理されません。 いくつかの組み込み演算子でさえ整理器を持たないものがあります。 例えば、 =は「整理」しません。 - それは、 この場合左辺と右辺を参照する2つの引数を整理する以上の整理セマンティクスを持たないプレイスホルダです 解答プログラムのようなMaximaの他の部分は等式 、すなわち、 =を根に持つツリーに特別な注意を払います。 (注意 - Maximaでは、割り当て演算は :です。 すなわち、 q: 4はシンボル qの値に 4を設定します。 関数定義には :=を使います。)

汎用整理器は、式と部分式それぞれが整理されたことを示す内部フラグと一緒に結果を返します。 これは、すべての可能な等価式上でそれが唯一であることを保証しません。 それは困難すぎます。(理論的に、Maximaで表現可能なものの一般性を仮定して不可能です) しかし、和や積の中の項の順序など、式のいくつかの面では一貫しています。 これは他のプログラムが適切に動作するために重要です。

Maximaの処理をゴールとして特定の好みの種類のパターンに導くたくさんのオプション変数を設定できます。 simp:falseで整理器をオフにする最も極端なオプションを使うことさえできます。 多くの内部ルーチンは引数が整理されていることを仮定しているので、これはお勧めしません。 (整理器をオフにするにが尤もらしくみえる唯一のケースは、組み込み整理器をオーバーライドしたいという稀なケースです。 その場合、一時的に整理器をオフにして、 tellsimp,経由で新しい変換に置き換え、 そして simp:trueで整理器を再度オンにするかもしれません)

あなたがユーザー定義のシンボル関数名や演算子をプロパティ (additive, lassociative, oddfun, antisymmetric, linear, outative, commutative, multiplicative, rassociative, evenfun, nary, symmetric)と連携させることはさらに尤もらしいです。 これらのオプションは処理する整理器をシステマティックな指示で操作します。

例えば、 declare(f,oddfun)は、 fを奇関数と規定します。 Maximaは f(-x)-f(x)に整理するでしょう。 偶関数の場合、それは declare(g,evenfun)であり、 Maximaは g(-x)g(x)に整理するでしょう。 h(x):=x^2+1といったようにプログラミング関数を名前に関連づけることもできます。 その場合、評価器はすぐに h(3)10に、 h(a+1)(a+1)^2+1に置き換え、 hのどんなプロパティも無視されます。

ユーザーが設定したこれらの直接関連したプロパティに加えて、 実際の文脈からのファクトやプロパティも 整理器の振る舞いに影響を与えるかもしれません。 See section Introduction to Maximas Database

例: もし nが整数なら、 sin(n*%pi)は零に整理されます。

 
(%i1) sin(n*%pi);
(%o1)                      sin(%pi n)
(%i2) declare(n, integer);
(%o2)                         done
(%i3) sin(n*%pi);
(%o3)                           0

もし自動整理が不十分なら、 組み込みだけれでも明示的に呼び出す整理関数 (ratsimp, expand, factor, radcan, その他)を検討できます。 整理をあれこれの方向に進めるフラグもあります。 demoivre:trueを与えると、整理器は複素指数を三角関数形式に書き換えます。 exponentialize:trueを与えると、整理器は逆を試みます: 三角関数形式を複素指数に。

Maximaのどこでも、 (Maximaユーザー言語でも実装言語のLispでも)自身の関数を書いてプログラムの中の選んだ場所で明示的に呼び出すことで 個人的な整理の必要性に応えることができます。 Lispはあなたに内部メカニズムすべてのハンドルを与えますが、めったにこの最大限の汎用性は必要としないでしょう。 "Tellsimp"は 整理機への Lisp内部インタフェースの多くを自動的に生成するように設計されています。 See section Rules and Patternsを参照してください。

何年にも渡って(Maxima/Macsymaの起源は1966年まで遡ります!) ユーザーは関数的な振る舞いを拡張したり変えたりするたくさんの応用パッケージやツールを貢献し続けています。 整理を修正したり拡張したりするための様々な非標準の「共有」パッケージも存在します。 現在も進行中の実験的な材料も見てみてください。 See section simplification

以下の追加された材料は初めて読む時には必須ではありません。 以下を読むことはMaximaの生産的な利用に必要ではありません。 何が起こっているのか知りたい好奇心あるユーザーや (オープンソース)コードを変更したい野心的なプログラマーのためです。 Maxima Lispコードを再定義する実験は簡単に可能です: Lispプログラム(例えば、 cos()を整理する simp%cosだとしましょう)の定義を変えるには、 Maximaのテキストファイルを覗き込んで、 maximaパッケージから simp%cos関数を書き換えるだけです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2 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)の形の式に適用されたときには この整理はされません。

例:

 
(%i1) F3 (a + b + c);
(%o1)                     F3(c + b + a)
(%i2) declare (F3, additive);
(%o2)                         done
(%i3) F3 (a + b + c);
(%o3)                 F3(c) + F3(b) + F3(a)

プロパティ: antisymmetric

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

例:

 
(%i1) S (b, a);
(%o1)                        S(b, a)
(%i2) declare (S, symmetric);
(%o2)                         done
(%i3) S (b, a);
(%o3)                        S(a, b)
(%i4) S (a, c, e, d, b);
(%o4)                   S(a, b, c, d, e)
(%i5) T (b, a);
(%o5)                        T(b, a)
(%i6) declare (T, antisymmetric);
(%o6)                         done
(%i7) T (b, a);
(%o7)                       - T(a, b)
(%i8) T (a, c, e, d, b);
(%o8)                   T(a, b, c, d, e)

関数: combine (expr)

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

例:

 
(%i1) 1*f/2*b + 2*c/3*a + 3*f/4*b +c/5*b*a;
                      5 b f   a b c   2 a c
(%o1)                 ----- + ----- + -----
                        4       5       3
(%i2) combine (%);
                  75 b f + 4 (3 a b c + 10 a c)
(%o2)             -----------------------------
                               60

Categories:  Expressions

プロパティ: commutative

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

例:

 
(%i1) S (b, a);
(%o1)                        S(b, a)
(%i2) S (a, b) + S (b, a);
(%o2)                   S(b, a) + S(a, b)
(%i3) declare (S, commutative);
(%o3)                         done
(%i4) S (b, a);
(%o4)                        S(a, b)
(%i5) S (a, b) + S (b, a);
(%o5)                       2 S(a, b)
(%i6) S (a, c, e, d, b);
(%o6)                   S(a, b, c, d, e)

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

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

変数 demoivreが trueの時、 複素数の指数関数は円関数の項で表した同値な式に変換されます: もし 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

Categories:  Expressions

オプション変数: distribute_over

デフォルト値: true

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

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

例:

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

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

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

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

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

 
(%i1) floor(matrix([a,b],[c,d]));
                     [ floor(a)  floor(b) ]
(%o1)                [                    ]
                     [ floor(c)  floor(d) ]
(%i2) floor(a=b);
(%o2)                  floor(a) = floor(b)

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

 
(%i1) expintegral_e([1,2],[x,y]);
(%o1) [[expintegral_e(1, x), expintegral_e(1, y)],
                      [expintegral_e(2, x), expintegral_e(2, y)]]

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

 
(%i1) properties(abs);
(%o1) [integral, rule, distributes over bags, noun, gradef,
                                                 system function]

distribute_overfalse値に設定すると、 関数の展開はオフになります。

 
(%i1) distribute_over;
(%o1)                         true
(%i2) sin([x,1,1.0]);
(%o2)         [sin(x), sin(1), 0.8414709848078965]
(%i3) distribute_over : not distribute_over;
(%o3)                         false
(%i4) sin([x,1,1.0]);
(%o4)                   sin([x, 1, 1.0])

オプション変数: domain

デフォルト値: real

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

プロパティ: evenfun
プロパティ: oddfun

declare(f, evenfun)declare(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  
    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)の実行が行われます。

expand(expr, 0, 0)exprを再整理します。 exprは再評価はされません。 ev(expr, noeval)との違いは、 特殊な表現(例えばCRE形式)が削除されることです。 evも参照してください。

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

ファイル`share/simplification/facexp.mac'は、 ユーザーに制御された展開によって式を構成する機能を提供するいくつかの関連関数 (特に自動ロードされる facsum, factorfacsum, collectterms)と 変数(nextlayerfactor, facsum_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

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

 
(%i1) expr:(1+x)^2*sin(x);
                                2
(%o1)                    (x + 1)  sin(x)
(%i2) exponentialize:true;
(%o2)                         true
(%i3) expand(expr,0,0);
                            2    %i x     - %i x
                  %i (x + 1)  (%e     - %e      )
(%o3)           - -------------------------------
                                 2

Categories:  Expressions

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

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

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

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

Categories:  Expressions

オプション変数: expandwrt_denom

デフォルト値: false

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

Categories:  Expressions

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

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

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

Categories:  Expressions

オプション変数: expon

デフォルト値: 0

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

Categories:  Expressions

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

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

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

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

オプション変数: expop

デフォルト値: 0

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

Categories:  Expressions

プロパティ: 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に関して、 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)を出力します。

例:

 
(%i1) declare (f, linear);
(%o1)                         done
(%i2) f(x+y);
(%o2)                      f(y) + f(x)
(%i3) declare (a, constant);
(%o3)                         done
(%i4) f(a*x);
(%o4)                        a f(x)

linearadditiveかつ outativeと同値です。 oppropertiesも参照してください。

例:

 
(%i1) 'sum (F(k) + G(k), k, 1, inf);
                       inf
                       ====
                       \
(%o1)                   >    (G(k) + F(k))
                       /
                       ====
                       k = 1
(%i2) declare (nounify (sum), linear);
(%o2)                         done
(%i3) 'sum (F(k) + G(k), k, 1, inf);
                     inf          inf
                     ====         ====
                     \            \
(%o3)                 >    G(k) +  >    F(k)
                     /            /
                     ====         ====
                     k = 1        k = 1

オプション変数: maxnegex

デフォルト値: 1000

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

Categories:  Expressions

オプション変数: maxposex

デフォルト値: 1000

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

Categories:  Expressions

プロパティ: multiplicative

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

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

declare(nounify(product), multiplicative)はMaximaに記号積を整理するように命じます。

例:

 
(%i1) F2 (a * b * c);
(%o1)                       F2(a b c)
(%i2) declare (F2, multiplicative);
(%o2)                         done
(%i3) F2 (a * b * c);
(%o3)                   F2(a) F2(b) F2(c)

declare(nounify(product), multiplicative) tells Maxima to simplify symbolic products.

 
(%i1) product (a[i] * b[i], i, 1, n);
                             n
                           /===\
                            ! !
(%o1)                       ! !  a  b
                            ! !   i  i
                           i = 1
(%i2) declare (nounify (product), multiplicative);
(%o2)                         done
(%i3) product (a[i] * b[i], i, 1, n);
                          n         n
                        /===\     /===\
                         ! !       ! !
(%o3)                  ( ! !  a )  ! !  b
                         ! !   i   ! !   i
                        i = 1     i = 1

関数: multthru  
    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

Categories:  Expressions

プロパティ: 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つです。

例:

 
(%i1) negdistrib;
(%o1)                         true
(%i2) -(x+y);
(%o2)                       (- y) - x
(%i3) negdistrib : not negdistrib ;
(%o3)                         false
(%i4) -(x+y);
(%o4)                       - (y + x)

システム変数: opproperties

oppropertiesは、Maximaの整理器が認識する特殊演算子プロパティのリストです:

例:

 
(%i1) opproperties;
(%o1) [linear, additive, multiplicative, outative, evenfun,
oddfun, commutative, symmetric, antisymmetric, nary,
lassociative, rassociative]

Categories:  Global variables · Operators

プロパティ: outative

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

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

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

例:

 
(%i1) F1 (100 * x);
(%o1)                       F1(100 x)
(%i2) declare (F1, outative);
(%o2)                         done
(%i3) F1 (100 * x);
(%o3)                       100 F1(x)
(%i4) declare (zz, constant);
(%o4)                         done
(%i5) F1 (zz * y);
(%o5)                       zz F1(y)

関数: 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

Categories:  Simplification functions

オプション変数: radexpand

デフォルト値: true

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

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

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

domainradexpandtrueの時だけ 意味を持つことに注意してください。

プロパティ: 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)

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

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

Categories:  Simplification functions

オプション変数: simp

デフォルト値: true

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

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

多くの Maxima関数や演算子は 正常に機能することを可能にするために整理を要求します。 整理が無効になっている時、多くの結果は不備があり、 加えて、不正確な結果であったりプログラムエラーになったりします。

例:

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

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

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

 
(%i1) simp:true;
(%o1)                         true
(%i2) x:sin(1.0),simp:false;
(%o2)                  0.8414709848078965
(%i3) :lisp $x
((%SIN) 1.0)

Categories:  Evaluation flags

プロパティ: 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)

Categories:  Expressions


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by 市川雄二 on October, 5 2017 using texi2html 1.76.