Next: Package absimp, Previous: simplification, Up: simplification [Contents][Index]
ディレクトリmaxima/share/simplification
は
整理ルールと整理関数を実装するいくつかのスクリプトと整理に関係しないいくつかの関数を含みます。
Next: Package facexp, Previous: Introduction to simplification, Up: simplification [Contents][Index]
absimp
パッケージは
abs
とsignum
関数のために
組み込み整理ルールを拡張する
パターンマッチングルールを含みます。
absimp
は、
組み込みassume
関数で、また、
偶数や奇数に関してmodedeclare (m, even, n, odd)
のような宣言によって
確立された関係を考慮します。
absimp
は
abs
とsignum
を使って
unitramp
とunitstep
関数を定義します。
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)
Next: Package functs, Previous: Package absimp, Up: simplification [Contents][Index]
facexp
パッケージは、
制御された展開によって式を構造化する能力をユーザーに与えるいくつかの関連関数を含みます。
式が物理的意味を持つ変数を含むとき、この能力は特に役に立ちます。
そんな式の最も簡潔な形式は、それらの変数に関して式を完全に展開し、
その後係数を因数分解することで得られることがしばしばあるからです。
この手続きは標準のMaxima関数を使って実行することは難しくありませんが、
追加の微調整も望まれていて、これらの仕上げは適用するのが更に難しくなることがあります。
関数facsum
とその関連形式は、
この方法で式の構造を制御するための便利な手段を提供します。
別の関数collectterms
は、
この形式に既に整理された複数の式を
式全体を再整理することなく、足し合わせるのに使うことができます。
式が非常に大きいとき、この関数は役に立つかもしれません。
load ("facexp")
はこのパッケージをロードします。
demo (facexp)
はこのパッケージのデモを見せます。
引数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に関して
式exprをfacsum
したいなら、
facsum (expr, operator (op_1, ..., op_n))
を評価します。
operator
形式はリスト引数の中でも可能です。
更に、
スイッチfacsum_combine
とnextlayerfactor
の設定は
facsum
の結果に影響するかもしれません。
デフォルト値: false
nextlayerfactor
がtrue
の時、
facsum
の再帰コールが
引数の係数の因数分解された形式の因子に適用されます。
false
の時、
facsum
は、
facsum
への再帰コールが起こる時はいつでも、全体としてそれぞれの係数に適用されます。
facsum
の引数リストに
アトムnextlayerfactor
を入れると、
nextlayerfactor: true
の効果がありますが、
式の次のレベルだけに関してです。
nextlayerfactor
はいつも
true
かfalse
にバインドされているので、
facsum
の引数リストの中に現れる時はいつでも、
シングルクォートで表さなければいけません。
デフォルト値: true
引数が多項式の商の時、
facsum_combine
は
facsum
が返す最終結果の形式を制御します。
もしfacsum_combine
がfalse
なら、
形式は既に記述したような完全に展開された和として返されますが、
もしtrue
なら、
返される式は、既に記述した形式の多項式の比です。
有理式の分子と分母両方をfacsum
したいが、
分母が分子の項ずつに掛けられたくない時、
このスイッチのtrue
設定は役に立ちます。
exprの因子に関して引数として
arg_1, ... arg_nを付けてfacsum
をコールすることで得られる
exprの形式を返します。
もしexprの因子のいずれかがべきに累乗されるなら、
因子と指数と両方がこの方法で処理されます。
もしいくつかの式がfacsum
もしくはfactorfacsum
, factenexpand
, facexpten
,
factorfacexpten
で整理されていて、それらが一緒に加算されているなら、
関数collectterms
を使ってそれらを結合することが望まれる場合があります。
collectterms
は、nextlayerfactor
を除いてこれらの他の関連した関数に渡すことができる引数すべてを
引数として取ることができます。
collectterms
の利点は、facsum
と似た形式を返すことです。
しかし、既にfacsum
で処理された加算形式なのでこの処理を繰り返す必要はありません。
この能力は加算する式が非常に大きい時特に役立ちます。
Next: Package ineq, Previous: Package facexp, Up: simplification [Contents][Index]
式exprからパーツnを取り除きます。
もしnが形式[l, m]
のリストなら、
パーツlからmまでが取り除かれます。
この関数を使うには、最初にload("functs")
を書いてください。
変数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)])
行列Mの跡(対角要素の和)を返します。
この関数を使うには、最初にload("functs")
を書いてください。
z
) ¶分母を有理化するように、 zの分子と分母に分母の複素共役を掛けます。 もし与えられたものがそうであれば、正準有理式(CRE)形式を返し、 そうでないなら、一般形式を返します。
この関数を使うには、最初にload("functs")
を書いてください。
もし exprがゼロでなく、
freeof (x, expr)
がtrue
を返すなら、
true
を返します。
そうでなければ、false
を返します。
この関数を使うには、最初にload("functs")
を書いてください。
exprが変数xに関して線形の式の時、
linear
はa*x + b
を返します。
ここで、aはゼロでなく、aとbはxに依存しません。
そうでなければ、linear
はexprを返します。
この関数を使うには、最初にload("functs")
を書いてください。
takegcd
がtrue
の時、
gcdivide
は多項式pとqを最大公約多項式で割り、
結果の比を返します。
takegcd
がfalse
の時、
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
算術級数a, a + d, a + 2*d, ..., a + (n - 1)*d
の第n項を返します。
この関数を使うには、最初にload("functs")
を書いてください。
幾何級数a, a*r, a*r^2, ..., a*r^(n - 1)
の第n項を返します。
この関数を使うには、最初にload("functs")
を書いてください。
調和級数a/b, a/(b + c), a/(b + 2*c), ..., a/(b + (n - 1)*c)
の第n項を返します。
この関数を使うには、最初にload("functs")
を書いてください。
算術級数の1からnまでの和を返します。
この関数を使うには、最初にload("functs")
を書いてください。
幾何級数の1からnまでの和を返します。
もしnが無限大(inf
)なら、
rの絶対値が1未満でのみ、和は有限です。
この関数を使うには、最初にload("functs")
を書いてください。
Gaussian確率函数%e^(-x^2/2) / sqrt(2*%pi)
を返します。
この関数を使うには、最初にload("functs")
を書いてください。
Gudermannian函数2*atan(%e^x)-%pi/2
を返します。
この関数を使うには、最初にload("functs")
を書いてください。
逆Gudermannian函数log (tan (%pi/4 + x/2)))
を返します。
この関数を使うには、最初にload("functs")
を書いてください。
正矢(せいし)1 - cos (x)
を返します。
この関数を使うには、最初にload("functs")
を書いてください。
余矢(よし)1 - sin (x)
を返します。
この関数を使うには、最初にload("functs")
を書いてください。
外正割(exsecant)sec (x) - 1
を返します。
この関数を使うには、最初にload("functs")
を書いてください。
半正矢(1 - cos(x))/2
を返します。
この関数を使うには、最初にload("functs")
を書いてください。
一度にr個を取るn個のオブジェクトの組み合わせの数を返します。
この関数を使うには、最初にload("functs")
を書いてください。
n個のオブジェクトの集合から選択されたr個のオブジェクトの置換の数を返します。
この関数を使うには、最初にload("functs")
を書いてください。
Next: Package rducon, Previous: Package functs, Up: simplification [Contents][Index]
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")
とか、
規則名を引用符で囲まなければいけません。
Next: Package scifac, Previous: Package ineq, Up: simplification [Contents][Index]
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)
はこの関数のデモを見せます。
Next: Package sqdnst, Previous: Package rducon, Up: simplification [Contents][Index]
gcfac
は
科学者が式をより簡単にしようとする時に適用するのと同じ発見的方法の適用を試みる
因数分解関数です。
gcfac
は単項式タイプの因数分解に限られます。
和に関しては、gcfac
は以下を行います:
対のすべての可能な再配列の中から最も簡潔な対因数分解された結果を産むものを見つけることの 組み合わせ的に困難な性質のため、 項目(3)は必ずしも、対での因数分解の最善の仕事をしません。
load ("scifac")
はこの関数をロードします。
demo (scifac)
はこの関数のデモを見せます。
Previous: Package scifac, Up: simplification [Contents][Index]
可能なら、簡単で、数値的で、二項無理数(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")
はこの関数をロードします。