【Pythonで学ぶ線形代数学講座(12)】行列形式で表された連立一次方程式の解法
連立一次方程式の解
前回記事で学んだ逆行列を使って、行列形式で表された連立一次方程式 $A\boldsymbol{x}=\boldsymbol{p}$、すなわち
\[\begin{bmatrix}a&b\\c&d\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}=\begin{bmatrix}p\\q\end{bmatrix}\tag{1}\]
を解いてみましょう。
Aに逆行列が存在する場合
$A$ に逆行列が存在する場合、すなわち $\det A\neq 0$ のときは、$A\boldsymbol{x}=\boldsymbol{p}$ の両辺に左から逆行列 $A^{-1}$ を掛けて、
\[\boldsymbol{x}=A^{-1}\boldsymbol{p}\tag{2}\]
という解ベクトルが得られます。成分を使って表すと、(1) より
\[\begin{bmatrix}x\\y\end{bmatrix}=\frac{1}{ad-bc}\begin{bmatrix}d&-b\\-c&a\end{bmatrix}
\begin{bmatrix}p\\q\end{bmatrix}\tag{3}\]
となります。前々回の記事の冒頭で与えられた問題
\[\begin{align*}&5x-y=9\tag{4}\\[6pt]&2x+3y=7\tag{5}\end{align*}\]
を解いてみましょう。この方程式は行列を使って
\[\begin{bmatrix}5&-1\\2&3\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}
=\begin{bmatrix}9\\7\end{bmatrix}\tag{6}\]
と表せます。$A=\begin{bmatrix}5&-1\\2&3\end{bmatrix}$ の逆行列を求めると
\[A^{-1}=\frac{1}{17}\begin{bmatrix}3&1\\-2&5\end{bmatrix}\]
なので、これを (6) の両辺の左から掛けて
\[\begin{bmatrix}x\\y\end{bmatrix}=\frac{1}{17}\begin{bmatrix}3&1\\-2&5\end{bmatrix}
\begin{bmatrix}9\\7\end{bmatrix}=\frac{1}{17}\begin{bmatrix}34\\17\end{bmatrix}
=\begin{bmatrix}2\\1\end{bmatrix}\tag{7}\]
という解が得られます。
Aに逆行列が存在しない場合
それでは、$A$ に逆行列が存在しない場合はどのような状況を表しているでしょう。前々回記事で解説したように、連立一次方程式は行列 $A$ を構成する 2 本のベクトルを使って
\[x\begin{bmatrix}a\\c\end{bmatrix}
+y\begin{bmatrix}b\\d\end{bmatrix}=\begin{bmatrix}p\\q\end{bmatrix}\tag{8}\]
と表せます。$\det A=0$ は、行列式の記事で学んだように、$\begin{bmatrix}a\\c\end{bmatrix}$ と $\begin{bmatrix}b\\d\end{bmatrix}$ がつくる平行四辺形が潰れてしまっている状態、言い換えると 2 本のベクトルが平行であることを意味しています。このとき、下の図に描かれているような 2 種類の状況が考えられます。
1つは図 [A] のように、基底ベクトルの延長線上に目的となる座標 $(p,\ q)$ が存在している状況です。このとき、2 本のベクトルのつなぎ方 ($x$ と $y$ の選び方) は無数にあります。すなわち「解は不定」となります。たとえば、
\[\begin{align*}x+2y=5\tag{9}\\[6pt]3x+6y=15\tag{10}\end{align*}\]
のような方程式です。(10) の両辺を $3$ で約せば $x+2y=5$ となって、(9) と (10) は同じ直線(重なり合う直線)を表しています (普通はこのような 2 式は連立方程式として扱いませんが … )
もう1つは図 [B] のように、基底ベクトルの延長線上に目的となる座標 $(p,\ q)$ が存在していない状況です。このときは基底ベクトルをどのようにつなぎ合わせても目的に辿り着かないので「解なし」となります。直線の傾きが同じで $y$ 切片だけが異なるという状況なので、これも連立方程式の形を見ればすぐにわかります。
scipy.linalg.solve()
scipy.linalg.solve() に行列 a とベクトル b を渡すと、行列形式で表された連立方程式 ax=b の解 x を返します。さきほどの連立方程式
\[\begin{align*}&5x-y=9\tag{4}\\[6pt]&2x+3y=7\tag{5}\end{align*}\]
を scipy.linalg.solve() を使って解いてみます。
# python_simultaneous_linear_equations # In[1] from scipy import linalg # 行列aを定義 a = np.array([[5, -1], [2, 3]]) # ベクトルbを定義 b = np.array([9, 7]) # ax=bの解xを求める x = linalg.solve(a, b) print(x) # [2. 1.]
コメント
下記は誤植と思われるので、ご確認ください。
(8)式の右辺で、|34|→|p|
|17| |q|
助かりました。
ありがとうございます。