|
3.7.8 線形系の解法
計算問題の多くに連立1次方程式を解く部分が含まれる .その場合,具体的に方程式を書き出して, Solveを適用するのが便利だろ う.
しかし,問題の性質によっては,まず,連立1次方程式を行列の方程式の形に変換してから,行列操作の手法を使って解くこともあろう.方程式の系が一般的なアルゴリズムの一部としてあり,系がいくつ変数を持つかあらかじめ判明しないときに,このアプローチが有意義になる.
行列を使い,連立1次方程式を で表す. は変数のベクトルとする.
連立1次方程式が疎,つまり,行列 のほとんどの成分がゼロであるなら,行列をSparseArrayオブジェクトとして表すのが最もよいだろう. 3.7.12に説明してあるように,CoefficientArraysを使って記号方程式からSparseArrayオブジェクトに変換することができる.このセクションで説明してある関数はすべて通常の行列とSparseArrayオブジェクトの両方に同じように使うことができる.

線形系を解き解析する
の行列を構成しておく.
In[1]:= m = {{1, 5}, {2, 1}}
Out[1]= 
2つの線形方程式を作っておく.
In[2]:= m . {x, y} == {a, b}
Out[2]= 
Solveでこれらの方程式を直接解くことも可能である.
In[3]:= Solve[ %, {x, y} ]
Out[3]= 
LinearSolveを使ってもベクトル解が求まる.この解は Solveで得た解に等しい.
In[4]:= LinearSolve[m, {a, b}]
Out[4]= 
もう1つ別の解法を見てみよう.まず,行列 mの逆行列を取り,次に, {a, b}に掛け合わせる.正確だが, LinearSolveの効率にはおよばない.
In[5]:= Inverse[m] . {a, b}
Out[5]= 
RowReduceには1種のガウスの消去法が使われており,この関数を使い方程式を解くことも可能である.
In[6]:= RowReduce[{{1, 5, a}, {2, 1, b}}]
Out[6]= 
行列式が0でない正方行列 から行列方程式 を構成したとき,任意の に対して一意的な解が必ず存在する.一方,行列式が0の場合,同方程式を満足させるベクトル は存在しないか,無限に存在する,のいずれかの状況になる.このような状態は, に含まれる線形方程式が独立していない場合に起 る.
ただし, の行列式が0となる場合でも, を満足させる0でないベクトル は必ず存在する.この方程式を満足させるベクトルの集合 は零空間,または,行列 の核をなすという. このベクトルは NullSpace[m]で求まる基底ベクトルの和で表すことができる.
簡単な行列を例にする.これは,2つの同じ線形方程式に対応している.
In[7]:= m = {{1, 2}, {1, 2}}
Out[7]= 
行列式は0になる.
In[8]:= Det[ m ]
Out[8]= 
LinearSolveでは方程式 は解け ない.
In[9]:= LinearSolve[m, {a, b}]

Out[9]= 
mの零空間には単一基底ベクトルが存在 する.
In[10]:= NullSpace[ m ]
Out[10]= 
零空間の基底ベクトルに mを掛け合わせるとゼロベクトルが得られる.
In[11]:= m . %[[1]]
Out[11]= 
mには線形独立の行は1行しかない.
In[12]:= MatrixRank[ m ]
Out[12]= 
NullSpaceとMatrixRankは特定の行列要素の組合せがゼロかどうかを決定しなければならない.近似数値行列の場合,Toleranceオプションを使ってどれくらいゼロに近ければ十分と見なしうるかを指定することができる.厳密な記号行列の場合は記号式がゼロかどうかのテストにより多くのことを行うためにZeroTest->(FullSimplify[#]==0&)のような指定が必要なこともある.
行列式が0になる,シンボルを使った簡単な行列を構成する.
In[13]:= m = {{a, b, c}, {2 a, 2 b, 2 c}, {3 a, 3 b, 3 c}}
Out[13]= 
mの零空間の基底には2つのベクトルがある.
In[14]:= NullSpace[ m ]
Out[14]= 
mにこのベクトルの線形結合を掛けると,それがどんな組合せであってもゼロが返される.
In[15]:= Simplify[m . (x %[[1]] + y %[[2]])]
Out[15]= 
LinearSolveやNullSpaceのような関数の重要な特徴はこれらが「正方」行列だけでなく「長方」行列にも使える点である.
線形方程式を行列方程式 で表すとき, の列数は変数の総数を表し,行数は方程式の総数を表す.連立1次方程式は次のような種類に分類できる.

矩形行列で表された連立1次方程式の分類
矛盾した方程式の組 と を解かせた場合どうなるか見てみる.
In[16]:= LinearSolve[{{1}, {1}}, {1, 0}]

Out[16]= 
この行列は3つの変数からなる2つの方程式を表している.
In[17]:= m = {{1, 3, 4}, {2, 1, 3}}
Out[17]= 
劣決定系に LinearSolveを使う.可能な解の1つは求まる.
In[18]:= v = LinearSolve[m, {1, 1}]
Out[18]= 
行列が劣決定系の方程式を表すとき,行列は自明でない零空間を持つ.この例の零空間は単一ベクトルで与えられる.
In[19]:= NullSpace[m]
Out[19]= 
LinearSolveで求まった解に任意の零空間をなす基底ベクトルの線形合成を加えてもやはり解が得られる.
In[20]:= m . (v + 4 %[[1]])
Out[20]= 
独立した方程式の数は行列MatrixRank[m]の「ランク」である.重複する方程式の数はLength[NullSpace[m]]である.これらの量の合計は常にm中の列の数に一致する.

LinearSolveFunctionオブジェクトの生成
アプリケーションによっては という形式の方程式を, は変えずに だけを変化させて何度も解くことがあるだろう.MathematicaではLinearSolve[m]を使っていくつのベクトルにでも適用できる単一のLinearSolveFunctionを作ることでこれを効率よく行うことができる.
これでLinearSolveFunctionを作る.
In[21]:= f = LinearSolve[{{1, 4}, {2, 3}}]
Out[21]= 
これをベクトルに適用することができる.
In[22]:= f[{5, 7}]
Out[22]= 
LinearSolveの明示的な引数としてベクトルを与えても同じ結果が得られる.
In[23]:= LinearSolve[{{1, 4}, {2, 3}}, {5, 7}]
Out[23]= 
しかしfならいかなるベクトルにも適用できる.
In[24]:= f[{-5, 9}]
Out[24]= 
|