Mathematica >
Mathematicaチュートリアル関数 »

線形系の解法

計算問題の多くに連立1次方程式を解く部分が含まれる.その場合,具体的に方程式を書き出して,Solveを適用するのが便利だろう.
しかし,問題の性質によっては,まず,連立1次方程式を行列の方程式の形に変換してから,行列操作の手法を使って解くこともあろう.方程式の系が一般的なアルゴリズムの一部としてあり,系がいくつ変数を持つかあらかじめ判明しないときに,このアプローチが有意義になる.
行列を使い,連立1次方程式をm.x=b で表す.x は変数のベクトルとする.
連立1次方程式が疎,つまり,行列m のほとんどの成分がゼロであるなら,行列をSparseArrayオブジェクトとして表すのが最もよいだろう.「線形代数:疎な(スパース)配列」に説明してあるように,CoefficientArraysを使って記号方程式からSparseArrayオブジェクトに変換することができる.ここで説明してある関数はすべて通常の行列とSparseArrayオブジェクトの両方に同じように使うことができる.
LinearSolve[m,b]行列方程式 m.xbを満足するベクトルx
NullSpace[m]行列方程式m.x0を満足させる線形結合を持つ基底ベクトルを列挙する
MatrixRank[m]m の線形独立の行の数
RowReduce[m]行を線形結合することでm を簡約する

線形系を解き解析する

2x2の行列を構成しておく.
In[1]:=
Click for copyable input
Out[1]=
2つの線形方程式を作っておく.
In[2]:=
Click for copyable input
Out[2]=
Solveでこれらの方程式を直接解くことも可能である.
In[3]:=
Click for copyable input
Out[3]=
LinearSolveを使ってもベクトル解が求まる.この解はSolveで得た解に等しい.
In[4]:=
Click for copyable input
Out[4]=
もうひとつ別の解法を見てみよう.まず行列mの逆行列を取り,次に,{a, b}に掛け合せる.正確だが,LinearSolveの効率にはおよばない.
In[5]:=
Click for copyable input
Out[5]=
RowReduceには1種のガウスの消去法が使われており,この関数を使い方程式を解くことも可能である.
In[6]:=
Click for copyable input
Out[6]=
行列式が0でない正方行列m から行列方程式m.x=b を構成したとき,任意のb に対して一意的な解が必ず存在する.一方,行列式が0の行列m の場合,任意のb に対して方程式m.x=b を満足させるベクトルx は存在しないか無限に存在するかのいずれかの状況になる.このような状態は,m に含まれる線形方程式が独立していない場合に起る.
ただし,m の行列式が0となる場合でも,m.x=0を満足させる0でないベクトルx は必ず存在する.この方程式を満足させるベクトルの集合x は零空間,または,行列m の核をなすという.このベクトルはNullSpace[m]で求まる基底ベクトルの和で表すことができる.
簡単な行列を例にする.これは,2つの同じ線形方程式に対応している.
In[7]:=
Click for copyable input
Out[7]=
行列式は0になる.
In[8]:=
Click for copyable input
Out[8]=
LinearSolveでは方程式m.x=b は解けない.
In[9]:=
Click for copyable input
Out[9]=
mの零空間には単一基底ベクトルが存在する.
In[10]:=
Click for copyable input
Out[10]=
零空間の基底ベクトルにmを掛け合せると零ベクトルが得られる.
In[11]:=
Click for copyable input
Out[11]=
mには線形独立の行は1 行しかない.
In[12]:=
Click for copyable input
Out[12]=
NullSpaceMatrixRankは特定の行列要素の組合せがゼロかどうかを決定しなければならない.近似数値行列の場合,Toleranceオプションを使ってどれくらいゼロに近ければ十分とみなし得るかを指定することができる.厳密な記号行列の場合は記号式がゼロかどうかのテストにより多くのことを行うためにZeroTest->(FullSimplify[#]0&)のような指定が必要なこともある.
行列式が0になる,シンボルを使った簡単な行列を構成する.
In[13]:=
Click for copyable input
Out[13]=
mの零空間の基底には2つのベクトルがある.
In[14]:=
Click for copyable input
Out[14]=
mにこのベクトルの線形結合を掛けると,それがどんな組合せであってもゼロが返される.
In[15]:=
Click for copyable input
Out[15]=
LinearSolveNullSpaceのような関数の重要な特徴はこれらが「正方」行列だけでなく「長方」行列にも使える点である.
線形方程式を行列方程式m.x=b で表すとき,m の列数は変数の総数を表し,行数は方程式の総数を表す.連立1次方程式は次のような種類に分類できる.
劣決定系(Underdetermined)
方程式の数が変数の数より小さい.解は複数存在する
優決定系(Overdetermined)
方程式の数が変数の数より大きい.解は存在しない可能性がある
非特異系(Nonsingular)
独立した方程式の数が変数の数に等しく,行列式がゼロではない,一意な解が存在する
無矛盾系(Consistent)
解は少なくとも1つ存在する
矛盾系(Inconsistent)
解は存在しない

矩形行列で表された連立1次方程式の分類

矛盾した方程式の組x=1x=0を解かせた場合どうなるか見てみる.
In[16]:=
Click for copyable input
Out[16]=
この行列は3つの変数からなる2つの方程式を表している.
In[17]:=
Click for copyable input
Out[17]=
劣決定系にLinearSolveを使う.可能な解の1つは求まる.
In[18]:=
Click for copyable input
Out[18]=
行列が劣決定系の方程式を表すとき,行列は自明でない零空間を持つ.この例の零空間は単一ベクトルで与えられる.
In[19]:=
Click for copyable input
Out[19]=
LinearSolveで求まった解に任意の零空間をなす基底ベクトルの線形合成を加えてもやはり解が得られる.
In[20]:=
Click for copyable input
Out[20]=
独立した方程式の数は行列MatrixRank[m]の「階数」である.重複する方程式の数はLength[NullSpace[m]]である.これらの量の合計は常にm 中の列の数に一致する.
LinearSolve[m]m.x=b という形式の方程式を解く関数を生成する

LinearSolveFunctionオブジェクトの生成

アプリケーションによってはm.x=b という形式の方程式を,m は変えずにb だけを変化させて何度も解くことがあるだろう.Mathematica ではLinearSolve[m]を使っていくつのベクトルにでも適用できる単一のLinearSolveFunctionを作ることでこれを効率よく行うことができる.
これでLinearSolveFunctionを作る.
In[21]:=
Click for copyable input
Out[21]=
これをベクトルに適用することができる.
In[22]:=
Click for copyable input
Out[22]=
LinearSolveの明示的な第2引数としてベクトルを与えても同じ結果が得られる.
In[23]:=
Click for copyable input
Out[23]=
しかしfならいかなるベクトルにも適用できる.
In[24]:=
Click for copyable input
Out[24]=
LeastSquares[m,b]最小2乗問題m.xb を解くベクトルx を与える

最小2乗問題を解く

次の線形形は矛盾を含んでいる.
In[25]:=
Click for copyable input
Out[25]=
LeastSquaresm.x-b を最小2乗の意味で最小にするベクトルx を見付ける.
In[26]:=
Click for copyable input
Out[26]=