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