9Simplification

Last-modified: 2026-02-11 (水) 19:28:57

9 Simplification
9 簡略化
簡略化の紹介
簡略化のための関数と変数
Next: 簡略化のための関数と変数, Previous: 簡略化, Up: 簡略化 [Contents][Index]

9.1 簡略化の紹介
マキシマは、読み取りエバルプリントループ(REPL)と呼ばれるアクションのサイクルを通じてユーザーと対話します。読み取りと解析、評価と簡略化、出力の3つのステップで構成されます。解析は、入力された文字の構文的に有効なシーケンスを内部データ構造に変換します。評価は変数や関数名を値に置き換え、単純化は表現を書き換えて、ユーザーや他のプログラムが理解しやすくします。出力ディスプレイは、さまざまな形式と表記をもたらします。

評価と簡略化は、同様の機能を有するように見える場合があり、マキシマは他のシステムが評価を使用する場合に、多くの場合、簡略化を使用します。たとえば、数値式とシンボリック式の両方についての算術は、評価ではなく単純化です。 2+2は4に単純化し、2+x+xは2+2*xに単純化し、 sqrt(7)^4は49に単純化します。評価と簡略化がインターリーブされています。例えば、 factor(integrate(x+1,x)) は最初に組み込み関数 integrate を呼び出し、 x+x*x*2^-1 を与えます。 これは x+(1/2)*x^2 に単純化されます。

評価は、Maximaをプログラミング言語にするものです。 関数、サブルーチン、変数、値、ループ、割り当てなどを実装します。評価は、組み込み関数名またはユーザー定義関数名を定義名と変数名の値に置き換えます。これは、従来のプログラミング言語の活動とほとんど同じですが、象徴的な数学データを扱うように拡張されています。システムには、ユーザーが評価の詳細を制御するために設定できるさまざまなオプションの「フラグ」があります。評価のための関数と変数を参照してください。

簡略化は、表現の値を維持しながら、その形式をより小さく、理解しやすく、または特定の仕様に準拠するように再定式化します(拡張されたように ) 。たとえば、 sin(%pi/2) から 1、x+x から 2*x です。簡略化を制御する多くのフラグがあります。たとえば、triginverses:true では、quen(tan(x)) は x に単純化するのではなく、triginverses:all ではそうなる。

簡略化は3つの方法で提供できます。

内蔵の自動シンプル化機能、
ユーザーが書いたパターンマッチング変換は 、 " tellsimp" または "tellskrifter" を使用して簡易化機能にリンクされ、自動的に呼び出されます。
簡略化サブシステムを使用して追加するユーザーが作成した簡略化ルーチン。
内部シンプル化器はマキシマの中心に属しています。それはプログラムの大規模で複雑なコレクションであり、それは何年もの間、そして何千人ものユーザーによって洗練されています。それにもかかわらず、特にあなたが新しいアイデアや非伝統的な表記を試しているならば、あなたは自分でプログラムに小さな(または大きな)変更を加えることが役立つかもしれません。詳細は、例えば https : / /people.eecs.berkeley.edu/~fateman/papers/intro5.txt の末尾にある論文を参照してください。

Maxima は内部的に、オペレータや + 、 * 、 = などの "root" や x、y、z、関数やサブツリー、x*y などの変数である "leaves" を含む "trees" として表現します。各オペレータには、それに関連する単純化プログラムがあります。+ (a-b = a+(-1)*b からバイナリもカバー) と * (a/b = a*b^(-1) から / もカバー) は、簡略化プログラムをかなり精巧にしています。これらの簡略化プログラム(simplus、simptimes、simpexptなど)は、簡略化者が解析する式ツリー内のそれぞれの演算子に遭遇するたびに呼び出されます。

シンプル化機の構造は1965年にさかのぼり、多くの手が長年にわたってそれに取り組んできました。データ指向、あるいはオブジェクト指向は、表現のいくつかのサブツリーのルートに応じて適切なルーチンに再帰的にディスパッチするという意味です。この一般的なアプローチは、簡略化への変更が一般的にローカライズされていることを意味します。多くの場合、既存のコードを邪魔することなく、オペレータとその簡略化ルーチンを追加することは簡単です。

また、式の形を変える変換ルーチンとして、 factor (多項式の factorization ) 、 horner (Horner のルールを使用して多項式を再構成 ) 、 partfrac (合理的な関数を部分的な分数として書き換える ) 、 trigexpand (三角関数に合計式を適用する) などがあります。

ユーザーは、式の形式を変更するルーチンを書くこともできます。

代数式の木で動作するこの一般的な簡略化ツールに加えて、マキシマでは別の方法を持つ式の表現がいくつかあります。たとえば、ラット関数は多項式を係数のベクトルに変換して、そのような形態の迅速な操作を支援します。その他の表現には、テイラーシリーズと(まれに使用される)ポアソンシリーズが含まれます。

ユーザーによって導入されたすべての演算子は、最初はそれらに関連する単純化プログラムを持っていません。Maxima は関数 "f" について何も知らないので、 f(a,b) をタイプすると a,b は単純化されるが f は単純化されない。一部の組み込みオペレータでさえ単純化はありません。たとえば、= は "simplify" はしません。 単純化セマンティクスが存在しないプレースホルダーで、この場合は左右の面と呼ばれる2つの引数を単純化するだけです。ソルブプログラムのようなマキシマの他の部分は、式の特別な注意を取ります。 つまり、=をルートとする木です。(注 – Maxima では、割り当て操作は :. つまり、 q: 4 はシンボルの値を q から 4 に設定します。

一般的な簡略化機能は、式を示す内部フラグで結果を返し、各サブ式は簡略化されています。これは、考えられるすべての等価表現で 一意であることを 保証するものではありません。それは難しすぎます(理論的には、マキシマで表現できるものの一般性を考えると、不可能 ) 。ただし、合計や製品の用語の順序など、表現のいくつかの側面は統一されています。これは、他のプログラムが正常に機能するために重要です。

多くのオプション変数が単純化を制御します。確かに、簡略化は単純化:false を使うだけで完全にオフにすることができます。ただし、多くの内部ルーチンでは、apr:false では正しく動作しません。(単純化機能をオフにするのは、組み込みの単純化機能をオーバーライドしたい場合がほとんどなく、一時的に単純化機能を無効にし、tellsimp を使って新しい変換を入れ直してから、単純化機能を単純化:true で再度有効にします。

ユーザー定義のシンボリック関数名や演算子をプロパティ(additive、lassociative、 oddfun、anti-symmetric、linear、outative、 commutative、mulplicative、 Racsociative、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のプロパティは無視されます。

ユーザーが設定したこれらの直接関連するプロパティに加えて、実際のコンテキストからの事実とプロパティも、シンプル化者の動作に影響を与える可能性があります。Maximaのデータベースの紹介を参照してください。

例: sin(n*%pi) は、n が整数であればゼロに単純化されます。

(%i1) sin(n*%pi);
(%o1) sin(%pi n)
(%i2) declare(n, integer);
(%o2) が完了しました
(%i3) sin(n*%pi);
(%o3) 0
自動単純化が十分でない場合は、さまざまな組み込みの単純化関数(ratsimp、expand、factor、radcanなど)を検討できます。単純化を1つまたは別の方向にプッシュするフラグもあります。シンプル化機能は、複雑な指数関数を三角形形式として書き換えます。exponentialize:true が与えられた場合、シンプル化機能は逆にしようとします。

マキシマのどこにでも、独自の関数(マキシマのユーザー言語または実装言語Lispのいずれか)を書いて、プログラム内の選択された場所で明示的に呼び出すことで、個々の単純化ニーズに対応できます。Lispはすべての内部メカニズムのハンドルを提供しますが、この完全な一般性はめったに必要ありません。「Tellsimp」は、Lisp内部インターフェイスの多くを自動的にシンプル化器に生成するように設計されています。ルールとパターンをご覧ください。

長年にわたり(Maxima/Macsymaの起源は1966年頃にさかのぼります! ) 、ユーザーはその機能的な動作を拡張または変更するための多数のアプリケーションパッケージとツールに貢献してきました。単純化を変更または拡張するために、さまざまな非標準および「共有」パッケージが存在します。作業がまだ進行中であるこのより実験的な資料を調べることをお勧めします。 パッケージの簡略化を参照してください。

以下の添付資料は、最初の読み取りではオプションであり、Maximaの生産的な使用には読み取る必要はありません。何が起こっているのか理解したい好奇心旺盛なユーザー、または(オープンソースの)コードを変更したいという野心的なプログラマー向けです。Maxima Lisp コードを再定義する実験は簡単です。Lisp プログラムの定義を変更するには(例えば、 cos() を単純化するプログラムの名前で「XP%cos」と呼ばれる) maxima パッケージからXP%cos 関数を上書きするテキストファイルを Maxima にロードするだけで済みます。

Previous: 簡略化の紹介, Up: 簡略化 [Contents][Index]

9.2 簡略化のための関数と変数
プロパティ: additive
declare(f,additive) が実行された場合、次のようにします。

(1) f が一変量の場合、簡略化が f を合計に適用するたびに f はその合計にわたって分配される。すなわち f(y+x) は f に単純化する(y)+f(x ) 。

(2) f が 2 以上の引数の関数である場合、 additivity は sum や integrate の場合と同様に f への最初の引数で additivity として定義される。すなわち f(h(x)+g(x),x) は f(h(x),x)+f(g(x),x に単純化される。sum(x[i],i,lower-limit,upper-limit)の式にfを適用した場合、この単純化は発生しません。

例:

(%i1) F3 (a + b + c);
(%o1) F3(c + b + a)
(%i2) declare (F3, additive);
(%o2) が完了しました
(%i3) F3 (a + b + c);
(%o3) F3(c) + F3(b) + F3(a)
カテゴリー: オペレーター · 宣言と推論 ·
プロパティ: 対称性
declare(h,antisymmetric) が行われた場合、これは簡略化者に h が対称であることを示します。例えば、h(x,z,y)は-h(x,y,z)に単純化します。すなわち、対称的または交互で与えられた結果の (-1)^n 倍を与える。 ここで n は、それをその形式に変換するために必要な 2 つの引数の相互作用の数である。

例:

(%i1) S (b, a);
(%o1) S(b, a)
(%i2) declare (S, symmetric);
(%o2) が完了しました
(%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, 対称性);
(%o6) が完了しました
(%i7) T (b, a);
(%o7) - T(a, b)
(%i8) T (a, c, e, d, b);
(%o8) T(a, b, c, d, e)
カテゴリー: オペレーター · 宣言と推論 ·
Function: combine (expr)
同じ分母を持つ用語を単一の用語に組み合わせることで、 sum expr を簡略化します。

参照: rncombine。

例:

(%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) 結合する (%);
75 b f + 4 (3 a b c + 10 a c)
(%o2) -----------------------------
60
カテゴリー: 表現 ·
プロパティ: 通勤
declare(h, commutative) が行われた場合、h は交互関数であることを簡略化者に伝えます。例えば h(x, z,y) は h(x, y,z ) 。これは対称と同じです。

例:

(%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) が完了しました
(%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)
カテゴリー: オペレーター · 宣言と推論 ·
Function: demoivre (expr)
オプション変数: デモ
グローバル変数のデモを設定せずに、関数 demoivre (expr) が一つの式を変換します。

変数デモンタが true の場合、複雑な指数関数は円形関数の点で等価表現に変換されます。 exp (a + b* %i) は %e^a * (cos(b) + %i*sin(b)) に単純化します。a と b は展開されません。

デフォルト値はfalseです。

指数関数化は、円形およびハイパーボリック関数を指数関数形式に変換します。デモンストレーションと指数関数化の両方が同時に真であることはできません。

カテゴリー: 複雑な変数 · 三角関数 · ハイパーボーラ関数 ·
Function: distrib (expr)
製品の合計を分散します。エクスペリエンスとは異なり、エクスペリエンスのトップレベルでのみ動作します。 つまり、繰り返さず、エクスペリエンスよりも速くなります。multthruとは異なり、そのレベルですべての合計を拡大します。

例:

(%i1) distrib *1;
(%o1) b d + a d + b c + a c
(%i2) multthru *2;
(%o2) (b + a) d + (b + a) c
(%i3) distrib (1/ *3);
1
(%o3) ---------------
(b + a) (d + c)
(%i4) expand (1/ *4, 1, 0);
1
(%o4) ---------------------
b d + a d + b c + a c
カテゴリー: 表現 ·
オプション変数: distribute_over
デフォルト値: true

distribute_over は、リスト、行列、方程式などのバッグ上の関数のマッピングを制御します。現時点では、すべてのMaxima関数にこのプロパティがあるわけではありません。コマンドプロパティでこのプロパティを調べることができます。.

関数のマッピングは、distribute_over を false に設定するとオフになります。

例:

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

(%i1) sin([x,1,1.0]);
(%o1) [sin(x), sin(1), 0.8414709848078965]
mod はリストにマップする二つの引数を持つ関数です。ネストされたリスト上へのマッピングも可能です:

(%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)]
マトリックスと式上のフロア関数のマッピング:

(%i1) floor(matrix([a,b],[c,d]));
[ floor ] [ floor ] [ floor ](a) フロア(b) ]
(%o1) [ ]
[ floor ] [ floor ] [ floor ](c) フロア(d) ]
(%i2) floor(a=b);
(%o2) フロア(a) = floor(b)
複数の引数がある関数は、引数やすべての引数をマップします:

(%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) プロパティ(abs ) ;
(%o1) [integral, rule, distributes over bags, noun, gradef,
システム関数]
関数のマッピングは、distribute_over を false に設定するとオフになります。

(%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

ドメインが複合体に設定されている場合、 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) が完了しました
(%i3) o (- x) + o (x);
(%o3) 0
(%i4) e (- x) - e (x);
(%o4) e(-x) - e(x)
(%i5) declare (e, evenfun);
(%o5) が完了しました
(%i6) e (- x) - e (x);
(%o6) 0
関数: expand
拡大する (expr)
expand (expr, p, n)
式を展開する expr.合計と指数関数化合計の生成物は乗算され、合計である合理的表現の数値はそれぞれの用語に分割され、乗算(変動的および非変動的)は、Exprのすべてのレベルで追加にわたって分布しています。

多項式の場合は、通常、より効率的なアルゴリズムを使用する ratexpand を使用する必要があります。

maxnegex と maxposex はそれぞれ最大の負と正の指数を制御します。

expand (expr, p, n) は maxposex に p を、 maxnegex に n を用いて expr を展開します。これは、一つの式のすべてではなく、部分を展開するのに有用です。

expon - 自動的に展開される最大の負の電力の指数(展開する呼び出しに依存しない ) 。たとえば、expon が 4 の場合、(x+1)^(-5) は自動的に展開されません。

exop - 自動的に展開される最も高い正の指数。したがって、 (x+1)^3 と入力すると、 expop が 3 以上の場合にのみ自動的に展開されます。n が expop より大きい場合に (x+1)^n を展開したい場合、 expand ((x+1)^n) を実行すると maxposex が n より小さい場合にのみ動作します。

expand(expr, 0, 0) は expr の再単純化を引き起こします。expr は再評価されません。ev(expr, noeval)とは異なり、特別な表現(例:CRE形式)が削除されます。簡略化とevも参照してください。

ev で使用される展開フラグは展開を引き起こします。

file share/simplification/facexp.mac には、関連する関数 (特に、自動ロードされている facsum、factorfacsum、collectterms) と変数 (nextlayerfactor と facsum_combine) が含まれており、制御された拡張によって表現を構造化する機能がユーザに提供されます。簡単な機能の説明は簡略化/facexp.usg で利用できます。デモは、デモ("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

  1. 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 + 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
カテゴリー: 表現 ·
Function: expandwrt (expr, x_1,..., x_n)
変数 x_1,..., x_n に関して expr 式を展開します。変数を含むすべての製品が明示的に表示されます。返されるフォームは、変数を含まない表現の合計の製品が含まれません。x_1,..., x_n は変数, 演算子, 式のどれかです。

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

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

カテゴリー: 表現 ·
オプション変数: expandwrt_denom
デフォルト値: false

expandwrt_denom は expandwrt による合理表現の扱いを制御します。true の場合、式の分子と分母は expandwrt の引数に従って展開されますが、 expandwrt_denom が false の場合、その方法で展開されるのは分子だけです。

カテゴリー: 表現 ·
Function: expandwrt_factored (expr, x_1,..., x_n)
expandwrtに似ていますが、製品である表現をやや異なる方法で扱います。expandwrt_factored は変数 x_1,..., x_n を含む expr の要素に対してのみ展開します。

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

カテゴリー: 表現 ·
オプション変数:expon
デフォルト値: 0

expon は、自動的に展開される最大の負の電力の指数です(展開する呼び出しとは無関係 ) 。たとえば、expon が 4 の場合、(x+1)^(-5) は自動的に展開されません。

カテゴリー: 表現 ·
Function: exponentialize (expr)
Option variable: 指数関数化
関数指数関数化(expr)は、グローバル変数指数化を設定せずに、円形関数とハイパーボリック関数をexprで指数関数に変換します。

変数指数関数化が真になると、すべての円形およびハイパーボリック関数が指数関数形式に変換されます。デフォルト値は false です。

複雑な指数関数を円形関数に変換します。指数関数化とデモンストレーションの両方が同時に真であることはできません。

カテゴリー: 複雑な変数 · 三角関数 · ハイパーボーラ関数 ·
オプション変数: expop
デフォルト値: 0

exop は、自動的に展開される最も高い正の指数です。したがって(x + 1)^3 は、入力すると、exop が 3 より大きい場合にのみ自動的に展開されます。n が expop より大きい場合に (x + 1)^n を展開したい場合、 expand ((x + 1)^n) を実行すると maxposex が n より小さい場合にのみ動作します。

カテゴリー: 表現 ·
プロパティ: Lassociative
declare (g, lassociative) は Maxima シンプルファイアーに、g が左の関連付けであることを示します。例えば、 g (g) a,b), g (c,d) は g (g (a,b ),c ) 、d ) 。

協会的も参照してください。

カテゴリー: 宣言と推論 · オペレーター · 簡略化 ·
プロパティ: 線形
Maximaのオペレータプロパティの1つ。宣言された単変数 f の場合、"expansion" f(x +y) yields f(x) + f(y), f(a*x) yields a*f(x) は a が "定数" である場合に実行されます。二つ以上の引数の関数では、"linearity" は sum または integrate の場合と同じように定義される。すなわち、f (a*x + b,x) yield a*f(x,x) + b*f(1,x) for a and b free of x.

例:

(%i1) declare (f, linear);
(%o1) done
(%i2) f(x+y);
(%o2) f(y) + f(x)
(%i3) declare (a, constant);
(%o3) が完了しました
(%i4) f(a*x);
(%o4) a f(x)
線形は添加剤および外形に相当する。不適切性も参照してください。

例:

(%i1)'sum (F(k) + G(k), k, 1, inf);
inf

                      ====
                      \

(%o1) > (G(k) + F(k))

                      /
                      ====

k = 1
(%i2) declare (nounify (sum ), linear);
(%o2) が完了しました
(%i3)'sum (F(k) + G(k), k, 1, inf);
inf inf

                    ====         ====
                    \            \

(%o3) > G(k) + > F(k)

                    /            /
                    ====         ====

k = 1 k = 1
カテゴリー: 宣言と推論 · オペレーター · 簡略化 ·
オプション変数: maxnegex
デフォルト値: 1000

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

カテゴリー: 表現 ·
オプション変数: maxposex
デフォルト値: 1000

maxposex は expand コマンドで拡張される最大の指数です。 maxnegex も参照してください。

カテゴリー: 表現 ·
プロパティ: 多重
declare(f, multiplicative) は Maxima シンプルファイアーに、f が多重であることを示します。

f が単一変数である場合、シンプル化器 f が製品に適用されるたびに、f はその製品にわたって分配されます。例えば、f(x*y)はfに簡略化します。(x)*f(y ) 。この単純化は、f ('product (. ) という形式の式には適用されません。
f が 2 以上の引数の関数である場合、乗数は f の最初の引数で乗数として定義されます。例えば、f (g(x) * h(x)、x) は f (g(x)、x) * f (h(x)、x に単純化されます。
declare(nounify(product ), multiplicative(複数)は、マキシマがシンボリック製品を簡素化するように指示します。

例:

(%i1) F2 (a * b * c);
(%o1) F2(a b c)
(%i2) declare (F2, multiplicative);
(%o2) が完了しました
(%i3) F2 (a * b * c);
(%o3) F2(a) F2(b) F2(c)
declare(nounify(product ), multiplicative(複数)は、マキシマがシンボリック製品を簡素化するように指示します。

(%i1) 製品 (a[i] * b[i], i, 1, n);
n

                          /===\
                           ! !

(%o1)!! a b
! ! i i
i = 1
(%i2) declare (nounify (product ), multiplicative; プロダクトのプロダクトを宣言する。
(%o2) が完了しました
(%i3) 製品 (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 の要因 (合計であるべき) を掛けます。すなわち、exprはf_1 f_2... f_nで、少なくとも1つの要素、すなわちf_iが用語の合計である。その合計の各用語は、製品の他の要因によって乗算されます。(f_i を除くすべての要因を指します。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
(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 ( % ) ; /* 拡大しないことに注意 (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) は、関数 f を nary 関数として認識するようにマキシマに指示します。

nary 宣言は nary 関数を呼び出すのと同じではありません。declare(f, nary) の唯一の効果は、 Maxima シンプルファイアにネストされた式をフラット化するように指示することです。たとえば、 foo(x, foo(y, z)) を foo(x, y, z) に単純化します。宣言も参照してください。

例:

(%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) が完了しました
(%i3) H (H (a, b), H (c, H (d, e)));
(%o3) H(a, b, c, d, e)
オプション変数: negdistrib
デフォルト値: true

negdistrib が true の場合、 -1 は式にわたって分布します。例えば、-(x + y) は - y - x になります。false に設定すると - ( x + y) がそのように表示されます。これは便利な場合もありますが、非常に注意してください。 マキシマのローカル用途以外では、このフラグを偽に設定したくないフラグです。

例:

(%i1) negdistrib;
(%o1) true
(%i2) -(x+y);
(%o2) - - x
(%i3) negdistrib : not negdistrib ;
(%o3) false
(%i4) -(x+y);
(%o4) - (y + x)
カテゴリ: 簡略化フラグと変数 ·
システム変数: 不適合
不適切なオペレータは、Maxima シンプル化装置によって認識される特殊なオペレータのプロパティのリストです。

項目は関数 define_opproperty によって不適切リストに追加されます。

例:

(%i1) 不適切性;
(%o1) [linear, additive, multiplicative, outative, evenfun,
oddfun, commutative, symmetric, antisymmetric, nary,
lassociative, 連合, 連合]
カテゴリ: グローバル変数 · オペレーター · 簡体字 ·
Function: define_opproperty (property_name, simplifier_fn)
シンボル property_name を演算子プロパティとして宣言します。 これは simplifier_fn で簡略化されます。 これは Maxima 関数や Lisp 関数の名前、または lambda 式です。define_opproperty が呼び出された後、 functions と operators は property_name プロパティを持つように宣言され、 simplifier_fn はそれらを単純化するために呼び出されます。

simplifier_fn は、主演算子が property_name プロパティを持つと宣言される式である、1 つの引数の関数でなければなりません。

simplifier_fn はグローバル フラグが無効になっている状態で呼び出されます。したがって、 simplifier_fn は一般的な簡略化機能を使用せずに簡略化を実行できる必要があります。

define_opproperty は、グローバルリストの不適切なプロパティに property_name を追加します。

define_opproperty は done を返します。

例:

新しいプロパティである identity を宣言します。 これは simplify_identity で簡略化されます。f と g に新しいプロパティがあることを宣言します。

(%i1) define_opproperty (identity, simplify_identity);
(%o1) done
(%i2) simplify_identity(e) := first(e);
(%o2) simplify_identity(e) := first(e)
(%i3) declare ([f, g], identity);
(%o3) が完了しました
(%i4) f(10 + t);
(%o4) t + 10
(%i5) g(3*u) - f(2*u);
(%o5) u
カテゴリー: 演算子 · 簡体字 ·
プロパティ: outative
declare(f, outative) は Maxima シンプルファイアーに、f の引数にある定数ファクタを引き出すことができることを示します。

f が単一変数である場合、シンプル化器が製品に適用された f に遭遇するたびに、その製品は定数である要因に分割され、定数ではない要因が引き出されます。例えば、 f(a*x) は a が定数である a*f(x) に単純化します。非原子定数因子は引き出されません。
f が 2 以上の引数の関数である場合、 sum や integrate の場合と同様に outativity が定義される。 すなわち、 f (a*g(x)、x) は x を含まない * f(g(x)、x に単純化される。
sum、integrate、limit はすべて外的です。

例:

(%i1) F1 (100 * x);
(%o1) F1(100 x)
(%i2) declare (F1, outative);
(%o2) が完了しました
(%i3) F1 (100 * x);
(%o3) 100 F1(x)
(%i4) declare (zz, constant);
(%o4) が完了しました
(%i5) F1 (zz * y);
(%o5) zz F1(y)
カテゴリー: 宣言と推論 · オペレーター ·
機能: radcan (expr)
記号、指数関数、およびラジカルを含むことができるexprを、大規模な式クラスと特定の変数の順序にわたって正規化された形式に変換することによって簡略化します。 つまり、すべての機能的に等価な形式が一意の形式にマッピングされます。やや大きいクラスの表現のために、ラドカンは正規の形を生み出します。このクラスの2つの等価表現は必ずしも同じ外観を持っているわけではありませんが、それらの違いはラドカンによってゼロに単純化することができます。

いくつかの表現のためにラドカンはかなり時間がかかります。これは、指数の因数化と部分分割の拡大に基づく簡略化のために、式の構成要素間の特定の関係を調べるためのコストです。

例:

(%i1) radcan*5^a/log(1+x)^(a/2));
a/2
(%o1) log(x + 1)
(%i2) radcan*6/log(1+a^x)));
(%o2) 2
(%i3) radcan *7);
x/2
(%o3) - 1
カテゴリ: 簡略化機能 ·
オプション変数: radexpand
デフォルト値: true

ラジカルのいくつかの単純化をコントロールします。

すべての場合、nのパワーである製品の因子のnのルートがラジカルから外に引っ張られる。たとえば、vnexpand がすべての場合、 sqrt (16*x^2) は 4*x に単純化されます。

特に、 sqrt (x^2) を検討してください。

この場合、 sqrt(x^2) は x に単純化されます。
この場合、sqrt(x^2) は abs(x) に単純化されます。
もし、Squrtxpand が false か、Squrtxpand がtrue で、ドメインが複雑な場合は、 sqrt(x^2) は単純化されません。
ドメインが重要なのは、VoExpandがtrueの場合のみであることに注意してください。

カテゴリ: 簡略化フラグと変数 ·
プロパティ: 協会
declare (g, rassociative) は Maxima シンプルファイアーに g が右の関連性であることを示します。例えば、g(g(a, b), g(c, d))はg(a, g(b, g(c, d))に単純化される。

連想も参照してください。

カテゴリー: 宣言と推論 · オペレーター ·
Function: resimplify (expr)
現在の環境に基づいて式exprを再単純化します。この関数は、式が最後に簡略化されて以来、事実データベース、オプション変数、または tellsimp ルールが変更されたときに便利です。

例:

(%i1) expr : sin(x)^2 + cos(x)^2;
2 2
(%o1) sin (x) + cos (x)
(%i2) exponentialize : true;
(%o2) true
(%i3) expr;
2 2
(%o3) sin (x) + cos (x)
(%i4) resimplify(%);
%i x - %i x 2 - %i x 2
( %e + %e ) ( %e - %e )
(%o4) -------------------- --------------------
4 4
(%i5) ラットインプ(%);
(%o5) 1
カテゴリ: 簡略化機能 ·
Function: scsimp (expr, rule_1,..., rule_n)
シーケンシャル比較簡略化(Stouteによる方法 ) 。scsimp は rule_1,..., rule_n に従って expr を簡略化しようとします。より小さな式が得られた場合、プロセスは繰り返されます。そうでなければ、すべての単純化が試された後、元の答えを返します。

例 (scsimp) にはいくつかの例が表示されます。

カテゴリ: 簡略化機能 ·
オプション変数: バージョン
デフォルト値: true

簡略化を有効にします。これがデフォルトです。関数 ev によって認識される evflag も含まれます。ev を参照。

値 false を含む evflag として使用する場合、式の評価段階でのみ単純化が抑制されます。このフラグは、評価フェーズに続く簡略化を抑制しません。

多くの Maxima 関数と操作では、通常どおりに動作するために、単純化を有効にする必要があります。簡略化を無効にすると、多くの結果が不完全になり、さらに誤った結果やプログラムエラーが発生する可能性があります。

例:

簡略化はグローバルに切り替えられます。式 sin(1.0) はその数値に単純化されていません。シンプル化をオンに切り替えます。

(%i1) メッセージ:false;
(%o1) false
(%i2) sin(1.0);
(%o2) sin(1.0)
(%i3) sin(1.0),simp;
(%o3) 0.8414709848078965
簡略化は再びオンにされます。シンプル化を完全に抑制することはできません。出力は単純化された式を示しますが、変数 x は式の評価段階で割り当てが行われたため、値として単純化されていない式を持ちます。

(%i1) はじめに:true;
(%o1) true
(%i2) x:sin(1.0),simp:false;
(%o2) 0.8414709848078965
(%i3) :lisp $x
((%SIN) 1.0)
カテゴリー: 評価フラグ ·
プロパティ: 対称
declare (h, symmetric) は Maxima シンプルファイアーに、h が対称関数であることを示します。例えば、h (x, z,y) は h (x, y,z ) 。

通勤は対称と同義です。

カテゴリー: 宣言と推論 · オペレーター ·
関数: xthru (expr)
ラッツインプのように、商品や指数関数化された合計を拡大することなく、共通の分母の上にexprのすべての用語(合計であるべきです)を組み合わせます。xthru は、合理的な式の分母と分母の共通の要素をキャンセルしますが、要素が明示的である場合にのみキャンセルします。

時には、分子と分母のgdの明示的な要因をキャンセルするために、式をラットインピーする前に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)
(%i2) xthru (%);
20
(x + 2) - y
(%o2) -------------
20
(y + x)
カテゴリー: 表現 ·
Next: Elementary Functions, Previous: Evaluation [Contents][Index]


*1 a+b) * (c+d
*2 a+b) * (c+d
*3 a+b) * (c+d
*4 a+b) * (c+d
*5 log(x+x^2)-log(x
*6 log(1+2*a^x+a^(2*x
*7 %e^x-1)/(1+%e^(x/2