|
3.3.10 仮定の使用
Mathematicaは通常,オブジェクトの処理に必要なだけの最小限の仮定しかしない.これによりその結果も可能な限り一般的になる.しかし,場合によってこれらの結果は,より多くの仮定がなされた場合よりもかなり複雑になってしまうこともある.

仮定の下で演算を行う
デフォルトのSimplifyはこの式に本質的には何もしない.
In[1]:= Simplify[1/Sqrt[x] - Sqrt[1/x]]
Out[1]= 
その理由は異なる を選択をすると,全く異なった値になるからである.
In[2]:= % /. x -> {-3, -2, -1, 1, 2, 3}
Out[2]= 
と仮定すると,Simplifyは式を直ちに0にする.
In[3]:= Simplify[1/Sqrt[x] - Sqrt[1/x], x > 0]
Out[3]= 
と について仮定をしないと,何も実行されない.
In[4]:= FunctionExpand[Log[x y]]
Out[4]= 
と が両方とも正であると仮定された場合,対数が展開される.
In[5]:= FunctionExpand[Log[x y], x > 0 && y > 0]
Out[5]= 
SimplifyとFullSimplifyを適当な仮定の下で方程式や不等式に適用すると広範な定理を確立することもできる.
に関する仮定を行わないと,この方程式の真偽を決定することができない.
In[6]:= Simplify[Abs[x] == x]
Out[6]= 
これによりSimplifyで方程式が真であるという証明ができる.
In[7]:= Simplify[Abs[x] == x, x > 0]
Out[7]= 
これにより算術平均が幾何平均よりも大きいという普遍的結果が確立される.
In[8]:= Simplify[(x + y)/2 >= Sqrt[x y], x >= 0 && y >= 0]
Out[8]= 
がすべての正の引数に関して 内にあるということを証明する.
In[9]:= FullSimplify[0 < Erf[x] < 1, x > 0]
Out[9]= 
SimplifyとFullSimplifyは常に式の最も簡単な形を求めようとする.しかし,場合によってはMathematicaに特定の前提条件のもとで通常の評価過程を進ませたいこともあるだろう.そのような場合にはRefineを使うとよい.Refine[expr, assum]はexpr中の変数が前提条件assumを満たす数式で置き換えられたならばMathematicaが自動的に行うであろう変形と同じ変形を行う.
これ以上簡単な形はSimplify には見付けられない.
In[10]:= Simplify[Log[x], x < 0]
Out[10]= 
Refineは明示的な負の数 xであるかのようにLog[x]を評価する.
In[11]:= Refine[Log[x], x < 0]
Out[11]= 
仮定において重要なことは,あるオブジェクトが特定の領域の要素であるということを主張することである.x domを用いてそのような仮定を設定することができる.ここで, 文字は el または\[Element]として入力できる.

オブジェクトは領域の要素である
が実数領域の要素であるということを確かめる.
In[12]:= Pi Reals
Out[12]= 
これらの数は,すべて代数的数の要素である.
In[13]:= {1, Sqrt[2], 3 + Sqrt[5]} Algebraics
Out[13]= 
Mathematicaは, は代数的数ではないことを知っている.
In[14]:= Pi Algebraics
Out[14]= 
現代数学でも, が代数的数か否かまだ分かっていない.
In[15]:= E + Pi Algebraics
Out[15]= 
記号xが実数領域の要素であるということを表している.
In[16]:= x Reals
Out[16]= 

Mathematicaがサポートする領域
が整数の仮定の下で はゼロである.
In[17]:= Simplify[Sin[n Pi], n Integers]
Out[17]= 
が実数の仮定の下で の定理を確立する.
In[18]:= Simplify[Cosh[x] >= 1, x Reals]
Out[18]= 
ある変数が不等式を満たしていると述べると,Mathematicaは自動的にその変数が実数であるとみなす.
In[19]:= Simplify[x Reals, x > 0]
Out[19]= 
Simplify,FullSimplifyおよびFunctionExpandを仮定の下に使用することで,Mathematicaの広大な数学的事実のコレクションにアクセスできる.
正接関数の周期性を用いる.
In[20]:= Simplify[Tan[x + Pi k], k Integers]
Out[20]= 
k/2 Integersの仮定はkが偶数である必要があるということを意味している.
In[21]:= Simplify[Tan[x + Pi k/2], k/2 Integers]
Out[21]= 
Mathematicaは,正数 に関して であることを知っている.
In[22]:= Simplify[Log[x] < Exp[x], x > 0]
Out[22]= 
FullSimplifyは,特殊関数の知識にアクセスする.
In[23]:= FullSimplify[Im[BesselJ[0, x]], x Reals]
Out[23]= 
Mathematicaは,連続を扱う数学と同様に,離散数学と数論も扱える.
結果を簡約するためウィルソンの定理を用いる.
In[24]:= FunctionExpand[Mod[(p - 1)!, p], p Primes]
Out[24]= 
オイラーのファイ関数の乗積特性を用いる.
In[25]:= FunctionExpand[EulerPhi[m n], {m, n} Integers && GCD[m, n] == 1]
Out[25]= 
Simplify[expr, assum]あるいはRefine[expr, assum]のようなものには使いたい前提条件を明示的に与える.しかし,操作全体に1組の前提を指定したい場合もあるだろう.そのような場合はAssumingを使うとよい.

より大きなスコープでの前提条件の指定
こうするとSimplifyがデフォルトの前提条件x > 0を使う.
In[26]:= Assuming[x > 0, Simplify[Sqrt[x^2]]]
Out[26]= 
これは与えられた2つの前提条件を組み合せる.
In[27]:= Assuming[x > 0, Assuming[x Integers, Refine[Floor[Sqrt[x^2]]]]]
Out[27]= 
SimplifyやRefineのような関数は使うべきデフォルトの前提条件を指定するオプションAssumptionsを取る.デフォルトでは,このオプションの設定はAssumptions :> $Assumptionsである.Assumingは,Blockにおけるように局所値を$Assumptionsに割り当てるという方法で作用する.
Assumptionsオプションを取るためにAssumingを使って前提条件を指定できる関数はSimplifyとRefineの他にもたくさんある.FunctionExpand,Integrate, Limit,LaplaceTransform等がその例である.
Integrateでは自動的に前提条件が使われる.
In[28]:= Assuming[n > 0, 1 + Integrate[x^n, {x, 0, 1}]^2]
Out[28]= 
|