Next: , Previous:   [Contents][Index]

75 simplification


75.1 Introduction to simplification

ディレクトリmaxima/share/simplificationは 整理ルールと整理関数を実装するいくつかのスクリプトと整理に関係しないいくつかの関数を含みます。


75.2 Package absimp

absimpパッケージは abssignum関数のために 組み込み整理ルールを拡張する パターンマッチングルールを含みます。 absimpは、 組み込みassume関数で、また、 偶数や奇数に関してmodedeclare (m, even, n, odd)のような宣言によって 確立された関係を考慮します。

absimpabssignumを使って unitrampunitstep関数を定義します。

load ("absimp")はこのパッケージをロードします。 demo (absimp)はこのパッケージのデモを表示します。

例:

(%i1) load ("absimp")$
(%i2) (abs (x))^2;
                                       2
(%o2)                                 x
(%i3) diff (abs (x), x);
                                      x
(%o3)                               ------
                                    abs(x)
(%i4) cosh (abs (x));
(%o4)                               cosh(x)

75.3 Package facexp

facexpパッケージは、 制御された展開によって式を構造化する能力をユーザーに与えるいくつかの関連関数を含みます。 式が物理的意味を持つ変数を含むとき、この能力は特に役に立ちます。 そんな式の最も簡潔な形式は、それらの変数に関して式を完全に展開し、 その後係数を因数分解することで得られることがしばしばあるからです。 この手続きは標準のMaxima関数を使って実行することは難しくありませんが、 追加の微調整も望まれていて、これらの仕上げは適用するのが更に難しくなることがあります。

関数facsumとその関連形式は、 この方法で式の構造を制御するための便利な手段を提供します。 別の関数collecttermsは、 この形式に既に整理された複数の式を 式全体を再整理することなく、足し合わせるのに使うことができます。 式が非常に大きいとき、この関数は役に立つかもしれません。

load ("facexp")はこのパッケージをロードします。 demo (facexp)はこのパッケージのデモを見せます。

関数: facsum (expr, arg_1, ..., arg_n)

引数arg_1, ..., arg_nに依存する exprの形式を返します。 引数はratvarsに適した任意の形式か、そんな形式のリストを取り得ます。 もし引数がリストでなければ、 返される形式は、引数に関して完全に展開され、引数の係数は因数分解されます。 これらの係数は、非合理的な意味合いを除いて引数に依存しません。

引数のいずれかがリストなら、リストすべては1つのリストに結合されて、 引数の係数に対してfactorをコールする代わりに facsumは、 これらの係数に対して自分自身をコールします。 この再帰コールに関しては、上記で新しく構成されたリストが新しい引数リストとして使われます。 この処理は、リストの中に望まれた要素を入れ子にすることで、任意の深さまで繰り返すことができます。

It is possible that one may wish to facsum with respect to more complicated subexpressions, such as log (x + y)のような、より複雑な部分式に関して facsumしたいかも知れません。 そんな引数も許されています。

時々、ユーザーは 式に関して、先頭演算子によってのみ指定された上記形式いずれかが欲しいかもしれません。 例えば、 すべてのlogに関してfacsumしたかもしれません。 この場合、 この方法で扱われる特定のlogか、 代わりに式operator (log)'operator (log) を引数に含むことができます。 もし 演算子op_1, ..., op_nに関して 式exprfacsumしたいなら、 facsum (expr, operator (op_1, ..., op_n))を評価します。 operator形式はリスト引数の中でも可能です。

更に、 スイッチfacsum_combinenextlayerfactorの設定は facsumの結果に影響するかもしれません。

グローバル変数: nextlayerfactor

デフォルト値: false

nextlayerfactortrueの時、 facsumの再帰コールが 引数の係数の因数分解された形式の因子に適用されます。

falseの時、 facsumは、 facsumへの再帰コールが起こる時はいつでも、全体としてそれぞれの係数に適用されます。

facsumの引数リストに アトムnextlayerfactorを入れると、 nextlayerfactor: trueの効果がありますが、 式の次のレベルだけに関してです。

nextlayerfactorはいつも truefalseにバインドされているので、 facsumの引数リストの中に現れる時はいつでも、 シングルクォートで表さなければいけません。

グローバル変数: facsum_combine

デフォルト値: true

引数が多項式の商の時、 facsum_combinefacsumが返す最終結果の形式を制御します。 もしfacsum_combinefalseなら、 形式は既に記述したような完全に展開された和として返されますが、 もしtrueなら、 返される式は、既に記述した形式の多項式の比です。

有理式の分子と分母両方をfacsumしたいが、 分母が分子の項ずつに掛けられたくない時、 このスイッチのtrue設定は役に立ちます。

関数: factorfacsum (expr, arg_1, ... arg_n)

exprの因子に関して引数として arg_1, ... arg_nを付けてfacsumをコールすることで得られる exprの形式を返します。 もしexprの因子のいずれかがべきに累乗されるなら、 因子と指数と両方がこの方法で処理されます。

関数: collectterms (expr, arg_1, ..., arg_n)

もしいくつかの式がfacsumもしくはfactorfacsum, factenexpand, facexpten, factorfacexptenで整理されていて、それらが一緒に加算されているなら、 関数collecttermsを使ってそれらを結合することが望まれる場合があります。 collecttermsは、nextlayerfactorを除いてこれらの他の関連した関数に渡すことができる引数すべてを 引数として取ることができます。 collecttermsの利点は、facsumと似た形式を返すことです。 しかし、既にfacsumで処理された加算形式なのでこの処理を繰り返す必要はありません。 この能力は加算する式が非常に大きい時特に役立ちます。


75.4 Package functs

関数: rempart (expr, n)

exprからパーツnを取り除きます。

もしnが形式[l, m]のリストなら、 パーツlからmまでが取り除かれます。

この関数を使うには、最初にload("functs")を書いてください。

関数: wronskian ([f_1, ..., f_n], x)

変数xに関する式のリスト[f_1, ..., f_n]の Wronskian行列を返します。 Wronskian行列の行列式は、 式のリストのWronskian行列式です。

wronskianを使うには、最初にload("functs")してください。例えば:

(%i1) load("functs")$
(%i2) wronskian([f(x), g(x)],x);
(%o2) matrix([f(x),g(x)],['diff(f(x),x,1),'diff(g(x),x,1)])
関数: tracematrix (M)

行列Mの跡(対角要素の和)を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: rational (z)

分母を有理化するように、 zの分子と分母に分母の複素共役を掛けます。 もし与えられたものがそうであれば、正準有理式(CRE)形式を返し、 そうでないなら、一般形式を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: nonzeroandfreeof (x, expr)

もし exprがゼロでなく、 freeof (x, expr)trueを返すなら、 trueを返します。 そうでなければ、falseを返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: linear (expr, x)

exprが変数xに関して線形の式の時、 lineara*x + bを返します。 ここで、aはゼロでなく、abxに依存しません。 そうでなければ、linearexprを返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: gcdivide (p, q)

takegcdtrueの時、 gcdivideは多項式pqを最大公約多項式で割り、 結果の比を返します。

takegcdfalseの時、 gcdivideは比p/qを返します。

この関数を使うには、最初にload("functs")を書いてください。

ezgcd, gcd, gcdex, poly_gcdも参照してください。

例:

(%i1) load("functs")$

(%i2) p1:6*x^3+19*x^2+19*x+6; 
                        3       2
(%o2)                6 x  + 19 x  + 19 x + 6
(%i3) p2:6*x^5+13*x^4+12*x^3+13*x^2+6*x;
                  5       4       3       2
(%o3)          6 x  + 13 x  + 12 x  + 13 x  + 6 x
(%i4) gcdivide(p1, p2);
                             x + 1
(%o4)                        ------
                              3
                             x  + x
(%i5) takegcd:false;
(%o5)                         false
(%i6) gcdivide(p1, p2);
                       3       2
                    6 x  + 19 x  + 19 x + 6
(%o6)          ----------------------------------
                  5       4       3       2
               6 x  + 13 x  + 12 x  + 13 x  + 6 x
(%i7) ratsimp(%);
                             x + 1
(%o7)                        ------
                              3
                             x  + x
関数: arithmetic (a, d, n)

算術級数a, a + d, a + 2*d, ..., a + (n - 1)*dの第n項を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: geometric (a, r, n)

幾何級数a, a*r, a*r^2, ..., a*r^(n - 1)の第n項を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: harmonic (a, b, c, n)

調和級数a/b, a/(b + c), a/(b + 2*c), ..., a/(b + (n - 1)*c)の第n項を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: arithsum (a, d, n)

算術級数の1からnまでの和を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: geosum (a, r, n)

幾何級数の1からnまでの和を返します。 もしnが無限大(inf)なら、 rの絶対値が1未満でのみ、和は有限です。

この関数を使うには、最初にload("functs")を書いてください。

関数: gaussprob (x)

Gaussian確率函数%e^(-x^2/2) / sqrt(2*%pi)を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: gd (x)

Gudermannian函数2*atan(%e^x)-%pi/2を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: agd (x)

逆Gudermannian函数log (tan (%pi/4 + x/2)))を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: vers (x)

正矢(せいし)1 - cos (x)を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: covers (x)

余矢(よし)1 - sin (x)を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: exsec (x)

外正割(exsecant)sec (x) - 1を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: hav (x)

半正矢(1 - cos(x))/2を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: combination (n, r)

一度にr個を取るn個のオブジェクトの組み合わせの数を返します。

この関数を使うには、最初にload("functs")を書いてください。

関数: permutation (n, r)

n個のオブジェクトの集合から選択されたr個のオブジェクトの置換の数を返します。

この関数を使うには、最初にload("functs")を書いてください。


75.5 Package ineq

ineqパッケージは不等式の整理規則を含みます。

セッション例:

(%i1) load("ineq")$
Warning: Putting rules on '+' or '*' is inefficient, and may not work.
Warning: Putting rules on '+' or '*' is inefficient, and may not work.
Warning: Putting rules on '+' or '*' is inefficient, and may not work.
Warning: Putting rules on '+' or '*' is inefficient, and may not work.
Warning: Putting rules on '+' or '*' is inefficient, and may not work.
Warning: Putting rules on '+' or '*' is inefficient, and may not work.
Warning: Putting rules on '+' or '*' is inefficient, and may not work.
Warning: Putting rules on '+' or '*' is inefficient, and may not work.
(%i2) a>=4;  /* a sample inequality */
(%o2)                               a >= 4
(%i3) (b>c)+%; /* add a second, strict inequality */
(%o3)                            b + a > c + 4
(%i4) 7*(x<y); /* multiply by a positive number */
(%o4)                              7 x < 7 y
(%i5) -2*(x>=3*z); /* multiply by a negative number */
(%o5)                           - 2 x <= - 6 z
(%i6) (1+a^2)*(1/(1+a^2)<=1); /* Maxima knows that 1+a^2 > 0 */
                                        2
(%o6)                             1 <= a  + 1
(%i7) assume(x>0)$ x*(2<3); /* assuming x>0 */
(%o7)                              2 x < 3 x
(%i8) a>=b; /* another inequality */
(%o8)                               a >= b
(%i9) 3+%; /* add something */
(%o9)                           a + 3 >= b + 3
(%i10) %-3; /* subtract it out */
(%o10)                              a >= b
(%i11) a>=c-b; /* yet another inequality */
(%o11)                            a >= c - b
(%i12) b+%; /* add b to both sides */
(%o12)                            b + a >= c
(%i13) %-c; /* subtract c from both sides */
(%o13)                         - c + b + a >= 0
(%i14) -%;  /* multiply by -1 */
(%o14)                          c - b - a <= 0
(%i15) (z-1)^2>-2*z; /* determining truth of assertion */
                                      2
(%o15)                         (z - 1)  > - 2 z
(%i16) expand(%)+2*z; /* expand this and add 2*z to both sides */
                                   2
(%o16)                            z  + 1 > 0
(%i17) %,pred;
(%o17)                               true

不等式の回りで括弧を使うことについて注意してください; ユーザーが(A > B) + (C = 5)と入力した時、 結果はA + C > B + 5ですが、A > B + C = 5は構文エラーであり、 (A > B + C) = 5は完全に何か他のものです。

規則定義の完全なリストを見るには、 disprule (all)を実行してください。

Maximaが不等式に掛けられる量の符号を決定できない時、 ユーザーは問い合わせを受けるでしょう。

最もありふれた仕様の欠陥を以下に例示します:

(%i1) eq: a > b;
(%o1)                              a > b
(%i2) 2*eq;
(%o2)                            2 (a > b)
(%i3) % - eq;
(%o3)                              a > b

別の問題は0掛ける不等式です; これを0にするデフォルト動作はそのままです。 しかし、 もしX*some_inequalityとタイプして、 MaximaがXの符号を尋ね、 zero (またはz)と答えたなら、 プログラムはX*some_inequalityを返し、 Xが0という情報を使いません。 そんな時は、 データベースは、決定の際、Xを評価する目的ではなく、比較目的のためだけに使われるので、 ev (%, x: 0)を実行すべきです。

パッケージがロードされた時、 整理器が、パッケージなしよりたくさんの規則を検証するよう強制されるので、 ユーザーはより遅い応答に気がつくかもしれません。 だから、これらを利用した後、規則を取り除きたいかもしれません。 (あなたが定義したかもしれないものすべてを含み)規則すべてを消すには、 kill (rules)してください; もしくは、もっと選択的にそれらのうちのいくつかだけ消すかもしれません; もしくは、特定の規則にremruleを使ってください。

もし自分の規則を定義した後、このパッケージをロードするなら、 同じ名前を持つあなたの規則をつぶすでしょう。 このパッケージの規則は以下の通りです: *rule1, ..., *rule8, +rule1, ..., +rule18, そして、それを参照するには、 "+"に関する最初の規則を限定して取り除くためのremrule ("+", "+rule1")とか、 二番目の乗法規則の定義を表示するためのdisprule ("*rule2")とか、 規則名を引用符で囲まなければいけません。


75.6 Package rducon

関数: reduce_consts (expr)

exprの定部分式を構成された定アトムで置き換え、 これら構成された定数すべての定義を等式のリストconst_eqnsに保存し、 修正されたexprを返します。 exprのそれらのパーツは、関数constantpが施された時trueを返す 定数です。 それゆえ、 reduce_constsを呼び出す前に、

declare ([objects to be given the constant property], constant)$

をして、自分の式に現れる定数量のデータベースを設定すべきです。

もしこれらの数式計算の後、Fortran出力を生成する予定があるなら、 最初のコードセクションの1つはすべての定数の計算であるべきです。 このコードセグメントを生成するには、

map ('fortran, const_eqns)$

を実行してください。

reduce_constsに影響するconst_eqns を除いた変数は以下の通りです: const_prefix (デフォルト値: xx) 定部分式を表すためにreduce_constsが生成するシンボルすべてに接頭として付けるのに使われる文字列です。

const_counter (デフォルト値: 1)は reduce_constsが見つける定部分式それぞれを表すためのユニークなシンボルを生成するのに使われる整数添字です。

load ("rducon")はこの関数をロードします。 demo (rducon)はこの関数のデモを見せます。


75.7 Package scifac

関数: gcfac (expr)

gcfacは 科学者が式をより簡単にしようとする時に適用するのと同じ発見的方法の適用を試みる 因数分解関数です。 gcfacは単項式タイプの因数分解に限られます。 和に関しては、gcfacは以下を行います:

  1. 整数上で素因数分解します。
  2. 項の複雑さに関わらず、生じる項の最大の冪を係数として因数分解します。
  3. 項の隣同士の対を因数分解する時に、(1)と(2)を使います。
  4. 式がもはや変化しなくなるまで、 これらのテクニックを繰り返し、再帰的に適用します。

対のすべての可能な再配列の中から最も簡潔な対因数分解された結果を産むものを見つけることの 組み合わせ的に困難な性質のため、 項目(3)は必ずしも、対での因数分解の最善の仕事をしません。

load ("scifac")はこの関数をロードします。 demo (scifac)はこの関数のデモを見せます。


75.8 Package sqdnst

関数: sqrtdenest (expr)

可能なら、簡単で、数値的で、二項無理数(binomial surds)のsqrtをdenestします。

例えば、

(%i1) load ("sqdnst")$
(%i2) sqrt(sqrt(3)/2+1)/sqrt(11*sqrt(2)-12);
                                    sqrt(3)
                               sqrt(------- + 1)
                                       2
(%o2)                        ---------------------
                             sqrt(11 sqrt(2) - 12)
(%i3) sqrtdenest(%);
                                  sqrt(3)   1
                                  ------- + -
                                     2      2
(%o3)                            -------------
                                    1/4    3/4
                                 3 2    - 2

時々、 (19601-13860 sqrt(2))^(7/4)に対してのように、 sqrtdenestを複数回適用することが役立ちます。

load ("sqdnst")はこの関数をロードします。


Next: , Previous:   [Contents][Index]