線形系の解法
計算問題の多くに連立一次方程式を解く部分が含まれる.その場合,具体的に方程式を書き出して,Solveを適用するのが便利だろう.
しかし,問題の性質によっては,まず,連立一次方程式を行列の方程式の形に変換してから,行列操作の手法を使って解くこともあろう.方程式の系が一般的なアルゴリズムの一部としてあり,系がいくつ変数を持つかあらかじめ判明しないときに,このアプローチが有意義になる.
行列を使い,連立一次方程式を
で表す.ここで
は変数のベクトルとする.
連立一次方程式が疎,つまり行列
のほとんどの成分がゼロであるなら,行列をSparseArrayオブジェクトとして表すのが最もよいだろう.「線形代数:疎な(スパース)配列」に説明してあるように,CoefficientArraysを使って記号方程式からSparseArrayオブジェクトに変換することができる.ここで説明してある関数はすべて通常の行列とSparseArrayオブジェクトの両方に同じように使うことができる.
| LinearSolve[m,b] | 行列方程式 |
| NullSpace[m] | 行列方程式 |
| MatrixRank[m] | |
| RowReduce[m] | 行を線形結合することで |
| In[1]:= |
| Out[1]= |
| In[2]:= |
| Out[2]= |
| In[3]:= |
| Out[3]= |
| In[4]:= |
| Out[4]= |
| In[5]:= |
| Out[5]= |
| In[6]:= |
| Out[6]= |
行列式が0でない正方行列
から行列方程式
を構成したとき,任意の
に対して一意的な解が必ず存在する.一方,行列式が0の行列
の場合,任意の
に対して方程式
を満足させるベクトル
は,存在しないか無限に存在するかのいずれかの状況になる.このような状態は,
に含まれる線形方程式が独立していない場合に起る.
ただし,
の行列式が0となる場合でも,
を満足させる0でないベクトル
は必ず存在する.この方程式を満足させるベクトルの集合
は零空間,または,行列
の核をなすという.このベクトルはNullSpace[m]で求まる基底ベクトルの和で表すことができる.
| In[7]:= |
| Out[7]= |
| In[8]:= |
| Out[8]= |
| In[10]:= |
| Out[10]= |
| In[11]:= |
| Out[11]= |
| In[12]:= |
| Out[12]= |
NullSpaceとMatrixRankは特定の行列要素の組合せがゼロかどうかを決定しなければならない.近似数値行列の場合,Toleranceオプションを使ってどれくらいゼロに近ければ十分とみなし得るかを指定することができる.厳密な記号行列の場合は記号式がゼロかどうかのテストにより多くのことを行うためにZeroTest->(FullSimplify[#]==0&)のような指定が必要なこともある.
| In[13]:= |
| Out[13]= |
| In[14]:= |
| Out[14]= |
| In[15]:= |
| Out[15]= |
LinearSolveやNullSpaceのような関数の重要な特徴はこれらが「正方」行列だけでなく「長方」行列にも使える点である.
線形方程式を行列方程式
で表すとき,
の列数は変数の総数を表し,行数は方程式の総数を表す.連立一次方程式は次のような種類に分類できる.
劣決定系(Underdetermined) | 方程式の数が変数の数より小さい.解は複数存在する |
優決定系(Overdetermined) | 方程式の数が変数の数より大きい.解は存在しない可能性がある |
非特異系(Nonsingular) | 独立した方程式の数が変数の数に等しく,行列式がゼロではない,一意な解が存在する |
無矛盾系(Consistent) | 解は少なくとも1つ存在する |
矛盾系(Inconsistent) | 解は存在しない |
| In[17]:= |
| Out[17]= |
| In[18]:= |
| Out[18]= |
| In[19]:= |
| Out[19]= |
| In[20]:= |
| Out[20]= |
独立した方程式の数は行列MatrixRank[m]の「階数」である.重複する方程式の数はLength[NullSpace[m]]である.これらの量の合計は常に m 中の列の数に一致する.
| LinearSolve[m] |
LinearSolveFunctionオブジェクトの生成
アプリケーションによっては
という形式の方程式を,
は変えずに
だけを変化させて何度も解くことがあるだろう.Mathematica ではLinearSolve[m]を使っていくつのベクトルにでも適用できる単一のLinearSolveFunctionを作ることでこれを効率よく行うことができる.
| In[21]:= |
| Out[21]= |
| In[22]:= |
| Out[22]= |
| In[23]:= |
| Out[23]= |
| In[24]:= |
| Out[24]= |
| LeastSquares[m,b] | 最小二乗問題 |
| In[26]:= |
| Out[26]= |
