|
3.4.2 一変数の方程式
Solveやこれに関連した Mathematicaの関数は,主に整方程式(代数方程式)を扱う.
xの1次方程式は簡単に解ける.
In[1]:= Solve[ a x + b == c , x ]
Out[1]= 
2次方程式も簡単な公式を適用すればだれでも解ける.
In[2]:= Solve[ x^2 + a x + 2 == 0 , x ]
Out[2]= 
Mathematicaでは,3次方程式の厳密な解も求めることができる.ここでは,比較的単純な3次方程式の最初の解を求めて みる.
In[3]:= Solve[ x^3 + 34 x + 1 == 0 , x ] [[1]]
Out[3]= 
方程式が3次と4次になると解は非常に複雑にはなりがちだが,それでも, Mathematicaは4次までの方程式なら明示的な式として解を必ず見付けることができる.
解として与えられる式の重要な特徴は,根基(べき根)のみを含むということである.つまり,平方根,3乗根,さらに高次の根に四則演算を施した形で表される.
数学的に証明されている基本的事項であるが,一般に,5次以上の方程式にはベキ根を使った明示的な式で解を表すことができない.
限られた方程式についてはそのような解が存在することもあるが,多くの方程式では存在しない.
6次方程式を構築する.
In[4]:= Expand[ Product[x^2 - 2 i, {i, 3}] ]
Out[4]= 
この例の式のように因数に分解する多項式なら, Solveを使うだけで簡単に根が見付かる.
In[5]:= Solve[% == 0, x]
Out[5]= 
8次式を構築する.
In[6]:= Expand[x^2 - 2 /. x -> x^2 - 3 /. x -> x^2 - 5]
Out[6]= 
この多項式は(Factorでは)因数分解できないが,多項式の多項式という形をしているので, Solveで明示的な解を求めることができる.(今の例では,2次式の2次式の2次式という構造をしているので2次方程式を3回解くことになる.)
In[7]:= Solve[% == 0, x]
Out[7]= 

根を陰的に表すオブジェクト
この方程式にはベキ根で表せるような解が存在しない.このため, Mathematicaはシンボル的に解を表す.
In[8]:= Solve[x^5 - x + 11 == 0, x]
Out[8]= 
これは各根の数値近似を求める.
In[9]:= N[%]
Out[9]= 
最終的に数値解が欲しいのであれば,はじめからNSolveを使った方が速いことが多い.
In[10]:= NSolve[x^5 - x + 11 == 0, x]
Out[10]= 
Rootオブジェクトは多項式の根の陰的ではあるが厳密な表現を与える.これはSqrt[2]あるいは厳密な数値を表すその他の表現と同じように扱うことができる.
これは上で論じた多項式の最初の根を表すRootオブジェクトである.
In[11]:= r = Root[#^5 - # + 11 &, 1]
Out[11]= 
これはその値の数値近似である.
In[12]:= N[r]
Out[12]= 
Roundは根に最も近い整数を求める厳密計算を行う.
In[13]:= Round[r]
Out[13]= 
この根をもとの多項式に代入し,結果を簡約すると零になる.
In[14]:= FullSimplify[ x^5 - x + 11 /. x -> r ]
Out[14]= 
もとの多項式のすべての根の積を求める.
In[15]:= FullSimplify[ Product[Root[11 - # + #^5 &, k], {k, 5}] ]
Out[15]= 
第3根の複素共役は第2根である.
In[16]:= Conjugate[ Root[11 - # + #^5 &, 3] ]
Out[16]= 
方程式に存在する唯一の記号パラメータがそれについて解こうとしている変数の場合,方程式のすべての解はただの数になる.しかし,方程式にこの他のパラメータがあれば,一般に解はそれらのパラメータの関数になる.
この方程式の解もまたRootオブジェクトで表すことができる.しかしここでは,各Rootオブジェクトがパラメータaを含んでいる.
In[17]:= Solve[x^5 + x + a == 0, x]
Out[17]= 
aに1を代入すると,Rootオブジェクトは簡約され,中には明示的な根として与えられるものもある.
In[18]:= Simplify[ % /. a -> 1 ]
Out[18]= 
これはaの関数としての第1根の動きを示している.
In[19]:= Plot[Root[#^5 + # + a &, 1], {a, -2, 2}]

Out[19]= 
これはaについての第1根の導関数を求める.
In[20]:= D[Root[#^5 + # + a &, 1], a]
Out[20]= 
Solveに 次の整方程式を与えると,Solveは厳密に 個の解を返す.ただし,解の中にはRootオブジェクトで表されるものもある.中に変質した解がある場合,その特定の解が現れる回数はその重複度に一致する.
Solveはこの方程式に2つの同一の解を与える.
In[21]:= Solve[(x - 1)^2 == 0, x]
Out[21]= 
これは10次方程式の最初の4つの解である.解はペアで与えられる.
In[22]:= Take[Solve[(x^5 - x + 11)^2 == 0, x], 4]
Out[22]= 
Mathematicaは明示的に多項式の形式を持たない方程式の解き方も知っている.
これは平方根を含む方程式である.
In[23]:= Solve[ Sqrt[x] + Sqrt[1 + x] == a, x]
Out[23]= 
これは対数を含む方程式である.
In[24]:= Solve[ Log[x] + Log[1 - x] == a, x ]
Out[24]= 
方程式を何らかの多項式の形に簡約できる限り,Mathematicaは常にその解をRootオブジェクトによって表現することができる.しかし,より一般的な,例えば超越関数を含む方程式の場合,Rootオブジェクトを使う系統立った方法はなく,数値近似を求める必要もない.
これはxについての単純な超越方程式である.
In[25]:= Solve[ArcSin[x] == a, x]
Out[25]= 
標準的な関数を使ってこの方程式を解くことはできない.
In[26]:= Solve[Cos[x] == x, x]

Out[26]= 
しかし,Mathematicaはこの場合でも数値解を求めることができる.
In[27]:= FindRoot[Cos[x] == x, {x, 0}]
Out[27]= 
1変数の整方程式は有限個の解を持つ.しかし超越方程式はしばしば無限の解を持つことがある.Sinのような関数が事実上無限の可能な逆方程式を持つから,というのがその理由である.しかし,デフォルトのオプション設定InverseFunctions->Trueだと,Solveはこのような関数には1つの逆関数があると仮定する.この場合,Solveはこの逆関数について特定の解を返すことができる場合がある.
MathematicaはArcSinについて特定の解を返し,あわせて他の解が失われたことを示す警告メッセージを表示する.
In[28]:= Solve[Sin[x] == a, x]

Out[28]= 
ここではProductLogについての解が返される.
In[29]:= Solve[Exp[x] + x + 1 == 0, x]


Out[29]= 
fのような任意の関数を含んだ方程式をSolveに解かせると,デフォルトにより逆関数が使われ形式的な解が構築される.
Solveはデフォルトで関数fの形式的な逆関数を使う.
In[30]:= Solve[f[x] == a, x]

Out[30]= 
これは逆関数の構造である.
In[31]:= InputForm[%]
Out[31]//InputForm= {{x -> InverseFunction[f, 1, 1][a]}}

逆関数
これは明示的な逆関数を返す.
In[32]:= InverseFunction[Tan]
Out[32]= 
Mathematicaは逆関数について形式的な操作を行うことができる.
In[33]:= D[InverseFunction[f][x^2], x]
Out[33]= 
Solveは式の特定の解しか返さないが,Reduceはすべての解のセットの表現を返すことができる.超越方程式の場合は例えば値の範囲がすべての可能な整数に及ぶような新たなパラメータを導入してしまうことがある.
これは解の集合の完全な表現である.
In[34]:= Reduce[Sin[x] == a, x]
Out[34]= 
これは一般的な解の表現である.
In[35]:= Reduce[Exp[x] + x + 1 == 0, x]
Out[35]= 
3.4.9で詳しく説明してあるように,Reduceを使うと変数の領域を制限することができる.これによって超越方程式の具体的な解を生成したり,あるいはそれが存在しないことを示したりできることがある.
xの領域を制限すると,これは有限解を与える.
In[36]:= Reduce[{Sin[x] == 1/2, Abs[x] < 4}, x]
Out[36]= 
xを実数に限ると可能な解は1つになる.
In[37]:= Reduce[Exp[x] + x + 1 == 0, x, Reals]
Out[37]= 
Reduceを使うと解が存在しないことが分かる.
In[38]:= Reduce[{Sin[x] == x, x > 1}, x]
Out[38]= 
|