連立方程式から学ぶ行列・行列式 ―意味と計算の完全理解― (数学のかんどころ 23) | 岡部 恒治, 長谷川 愛美, 村田 敏紀, 飯高 茂, 中村 滋, 岡部 恒治, 桑田 孝泰 |本 | 通販 | Amazon
Amazonで岡部 恒治, 長谷川 愛美, 村田 敏紀, 飯高 茂, 中村 滋, 岡部 恒治, 桑田 孝泰の連立方程式から学ぶ行列・行列式 ―意味と計算の完全理解― (数学のかんどころ 23)。アマゾンならポイント還元本が多数。岡部 恒治, 長谷川 愛美, 村田 敏紀, 飯高 茂, 中村 滋, 岡部 恒治, 桑田 孝泰作品ほか、お急ぎ便対象商品は当日お届けも可能。また連立方程式から学ぶ行列・行列式 ―意味と計算の完全理解― (数学のかんどころ 23)もアマゾン配送商品なら通常配送無料。

はじめに

書籍紹介

連立方程式から学ぶ行列・行列式 ―意味と計算の完全理解― (数学のかんどころ 23) \| 岡部 恒治, 長谷川 愛美, 村田 敏紀, 飯高 茂, 中村 滋, 岡部 恒治, 桑田 孝泰 \|本 \| 通販 \| Amazon(以下、同書)

  • タイトル通り、連立方程式を解くというプロセスを通して行列の性質を(特に文系に向けて)理解させようと試みます。
  • 構成はシンプルで、逆行列から未知数を得ることを目的として、ではいかにして逆行列を求めるかということを中心に論じています。
  • あくまでも行列・行列式の入門書ということで、他の連立方程式の解法についての言及はありません。

本記事は

  • 同書の概要を把握するレベルで内容をまとめたメモです。詳細な説明や証明などは同書をお求めください。
  • 以下での引用はすべて同書からのものです。(句読点や太字の一部等はArakakiが変更した)
  • 以下での脚注はすべてArakakiによるものです。
  • 実験的にpythonのSymPyパッケージを使いながらまとめていきます。なお同書ではpythonのコードなどは一切出てきません。

連立方程式が解を持つ条件

連立方程式の解がただ1つ出てくることを「連立方程式が一意的に解ける」あるいは「連立方程式の解がただ1つにきまる」といいます。

連立方程式の解が1つではなく複数個あることを「不定」といいます。

連立方程式の解が1つも存在しない場合を「不能」といいます。

未知数が2つ($x, y$)の二元連立方程式$\begin{cases} ax + cy = p \;\;(1)\\ bx + dy = q \;\;(2)\\ \end{cases}$で考えてみます。

不定になるのは(1)式が(2)式の定数倍の場合、不能になるのは(1)式と(2)式が並行な直線の場合と考えることができるので、まとめると2つの式の傾きが異なれば解がただ1つにきまりそうです。

$$ \frac{a}{c} \neq \frac{b}{d}\\ ad \neq bc\\ ad - bc \neq 0 $$

詳細は同書に譲って、実際以下が成り立ちます。 $$ 2元連立方程式の解が一意的 \Leftrightarrow ad - bc \neq 0 $$

行列の演算と係数行列

行列演算の確認

簡単に2×2行列$X, Y$で、行列の演算を確認しましょう。

import sympy as sp from sympy import Eq, symbols, Matrix, MatrixSymbol, MatMul t = symbols('t') X = MatrixSymbol('X', 2, 2) Y = MatrixSymbol('Y', 2, 2) Eq(X, X.as_explicit()) Eq(Y, Y.as_explicit())

行列の和

Eq( X+Y, (X+Y).as_explicit() )

すべての行列$X, Y, Z$について、以下のことが成り立ちます.

Ⅰ.$(X + Y) + Z = X + (Y + Z)$
Ⅱ. $X + Y = Y + X$

ここで、Ⅰのことを、行列の加法についての結合法則といいます。また、Ⅱのことを行列の加法についての交換法則といいます。

行列のスカラー倍

Eq( t*X, (t*X).as_explicit() )

全ての行列$X, Y$とすべての実数$a, b$について、以下のことが成り立ちます。

Ⅰ.$a(X + Y) = aX + aY$
Ⅱ.$(a + b)X = aX + bX$
Ⅲ.$(ab)X = a(bX)$
Ⅳ.$1X = X$

特にⅠ、Ⅱのことを、行列の分配法則といいます。

行列の積(乗法)

Eq( X*Y, (X*Y).as_explicit() )

3つの$n$次$(n \times n)$正方行列$X, Y, Z$と定数$a$について、以下のことが成り立ちます。

Ⅰ.$(XY)Z = X(YZ)$
Ⅱ.$(X + Y)Z = XZ + YZ, X(Y + Z) = XY + XZ$
Ⅲ.$(aX)Y = a(XY), X(aY) = a(XY)$

連立方程式への応用

行列とベクトルの積を用いて、連立方程式を以下のように表現できます。

a, b, c, d, e, f, g, h, k, p, q, r, x, y, z = symbols('a b c d e f g h k p q r x y z')

連立方程式$\begin{cases} ax + cy = p \\ bx + dy = q \\ \end{cases}$の場合

mA = Matrix(2, 2, [a, c, b, d]) vX = Matrix([x, y]) vB = Matrix([p, q]) Eq(sp.MatMul(mA, vX), mA*vX)

なので、

Eq(sp.MatMul(mA, vX), vB)

連立方程式$\begin{cases} ax + dy + gz = p \\ bx + ey + hz= q \\ cx + fy + kz= r \\ \end{cases}$の場合

mA = Matrix(3, 3, [a, b, c, d, e, f, g, h, k]).T vX = Matrix([x, y, z]) vB = Matrix([p, q, r]) Eq(sp.MatMul(mA, vX), mA*vX)

なので、

eq = Eq(sp.MatMul(mA, vX), vB) eq

本書では、行列を連立方程式(未知数の個数はいくつでも良い)に出てくる係数の表(この行列のことを特に係数行列といいます)としての見方を中心にしていきます。

逆行列と連立方程式

対角成分

正方行列$A$の第$i$行第$j$列の成分を$a_{ij}$とします。この成分の中で、$i = j$のもの、すなわち$a_{ii}$成分を対角成分といいます。

単位行列

対角成分が1であり、その他の成分がすべて0である正方行列を単位行列といい、$E$と表します。特に$n \times n$単位行列を示したい場合は$E_n$と表します。

すべての正方行列$X$と単位行列$E$との積について、以下のことが成り立ちます。

$XE = EX = X$

逆行列

正方行列$X$に対して、以下の等式が成り立つ正方行列$A$があるとします。

$XA = AX = E$

このとき、正方行列$A$を正方行列$X$の逆行列といい、正方行列$X$の逆行列$A$を$X^{-1}$で表します。

さて、上では行列とベクトルの積を用いて連立方程式を表現しました。
それを以下のように置き換えます。

A = MatrixSymbol('A', 3, 3) B = MatrixSymbol('B', 3, 1) x = MatrixSymbol('x', 3, 1) eq2 = eq.subs(((mA, A), (vX, x), (vB, B))) eq2

すると、$x$を求めるには両辺に$A^{-1}$を左側から掛ければよいことがわかります。

eq3 = Eq(A.inv()*eq2.lhs, A.inv()*eq2.rhs) eq3

このことをsympyを使ったいくつかの方法で確認してみましょう。

inv()で逆行列を求める

inv(method=None, iszerofunc=, try_block_diag=False)

import random # x00, x01の値を変えてお試しください x00 = random.randint(-9, 9) x01 = random.randint(-9, 9) x1 = Matrix(2, 1, [x00, x01]) while True: A1 = Matrix(2, 2, lambda *_: random.randint(-9, 9)) if A1.det(): break; B1 = A1*x1 Eq(MatMul(A1, x1), B1) A1.inv()*B1

subs()で代入

subs(*args, **kwargs)

x00 = random.randint(-9, 9) x01 = random.randint(-9, 9) x02 = random.randint(-9, 9) x1 = Matrix(3, 1, [x00, x01, x02]) while True: A1 = Matrix(3, 3, lambda *_: random.randint(-9, 9)) if A1.det(): break; B1 = A1*x1 Eq(MatMul(A1, x1), B1) eq3.subs(((A, A1), (B, B1))).doit()

solve()メソッドで解く

solve(rhs, method='GJ')

A1.solve(B1)

逆行列をもつ条件と行列式(2 × 2行列の場合)

唐突ですが2 × 2行列の逆行列は以下のようになります。

A = MatrixSymbol('A', 2, 2) m2 = Matrix(2, 2, [a, c, b, d]) Eq(A, m2) # 数式をキレイにするため、1/DとDを掛ける m2_inv = MatMul(m2.det()**-1, m2.det()*m2.inv()) Eq(A.inv(), m2_inv) # 確認 Eq(MatMul(m2, m2_inv), (m2*m2_inv).expand())

ここで行列式をとりあえず以下のように定義してみます。

行列式

$A = \begin{bmatrix}a & c \\ b & d\end{bmatrix}$における値$ad-bc$を行列$A$の行列式(determinant) といい、記号$\det A$で表します。
つまり、$\det A = ad-bc$とします。

逆行列$A^{-1}$では$\frac{1}{ad-bc}$が掛けられたかたちになっているので、以下のことが言えそうです。

$\det A \neq 0 \Leftrightarrow 逆行列A^{-1}が存在する$

これは二元連立方程式$\begin{cases} ax + cy = p\\ bx + dy = q\\ \end{cases}$の解がただ1つに決まる条件($ad - bc \neq 0$)と一致することになります。

以下では行列式と逆行列を求める方法を$n \times n$行列の場合に拡張するための検討を行います。

行列式の定義1

まずは用語の定義を行います。

小行列、小行列式、余因子

正方行列$A$の第$i$行の成分と第$j$列の成分をすべて取り除いた行列を行列$A$の$\bm (i, j)$小行列といい、$\Delta_{ij}$と表します。
また、$\det \Delta_{ij}$を行列$A$の$\bm (i, j)$小行列式といいます。
さらに、$(-1)^{i+j} \cdot \det \Delta_{ij}$を行列$A$の$\bm (i, j)$余因子といい、$A_{ij}$と表します。

続いて行列式を以下のように定義します。

$n \times n$行列$A$を$A = \begin{pmatrix} a_{11} & \cdots & a_{1j} & \cdots & a_{1n}\\ \vdots & \ddots & & & \vdots \\ a_{i1} & & a_{ij} & & a_{in} \\ \vdots & & & \ddots & \vdots \\ a_{n1} & \cdots & a_{nj} & \cdots & a_{nn} \end{pmatrix}$とおいたとき、 行列$A$の行列式$\det A$は、$\det A = a_{1j} \cdot A_{1j} + a_{2j} \cdot A_{2j} + \cdots + a_{nj} \cdot A_{nj}$となります。(ただし、$j = 1, 2, \cdots, n$)

このように計算することを、行列式$\det A$をj列目で展開するといいます。

小行列、小行列式、余因子

$3 \times 3$行列$A$を例に順に見ていきましょう。

m3 = Matrix(3, 3, [a, b, c, d, e, f, g, h, k]).T m3

行列$A$の小行列$\Delta_{12}$は

m3.minorMatrix(0, 1)

となります。

$\det \Delta_{12}$は$2 \times 2$行列として計算すればいいので、

m3.minor(0, 1)

となります。

行列$A$の余因子$A_{12}$は、$(-1)^{1+2} = -1$を$\det \Delta_{12}$に掛ければいいので、

m3.cofactor(0, 1)

となります。

行列式の具体例

$2 \times 2$行列の場合

$2 \times 2$行列の行列式を改めて上の定義に当てはめて考えてみます。
そのために$1 \times 1$行列の行列式を以下のように定義しておきましょう。

$\det \begin{pmatrix}a\end{pmatrix} = a$

それでは$2 \times 2$行列$\begin{pmatrix}a & c\\b & d\end{pmatrix}$を1列目で展開して行列式を求めてみます。

$$ \begin{aligned} & a \cdot (-1)^{1+1} \cdot d + b \cdot (-1)^{2+1} \cdot c&\\ = \;& ad - bc \end{aligned} $$

2列目で展開でも同様の結果となります。

$$ \begin{aligned} & c \cdot (-1)^{1+2} \cdot b + d \cdot (-1)^{2+2} \cdot a&\\ = \;& ad - bc \end{aligned} $$

$3 \times 3$行列の場合

$3 \times 3$行列の行列式は以下のようになります。

m3 m3.det()

1~3列目で展開した結果も全て一致します。

dets = list() for c in range(m3.cols): det = 0 for r in range(m3.rows): det += m3[r, c] * m3.cofactor(r, c) dets.append(det.expand()) dets[0] == dets[1] == dets[2] == m3.det()

特殊な行列の行列式

上三角行列、下三角行列

上三角行列

下のような形の正方行列を上三角行列といいます。つまり、対角成分より左下の成分がすべて0の行列です。

$\begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n}\\ 0 & a_{22} & \cdots & a_{2n} \\ \vdots & \ddots & \ddots & \vdots \\ 0 & 0 & 0 & a_{nn} \end{pmatrix}$

下三角行列

下のような形の正方行列を上三角行列といいます。つまり、対角成分より右上の成分がすべて0の行列です。

$\begin{pmatrix} a_{11} & 0 & \cdots & 0\\ a_{21} & a_{22} & \ddots & \vdots \\ \vdots & \ddots & \ddots & 0 \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{pmatrix}$

さらに上三角行列の行列式について以下のことが成り立ちます。

上三角行列の行列式

上三角行列$A$を$A = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n}\\ 0 & a_{22} & \cdots & a_{2n} \\ \vdots & \ddots & \ddots & \vdots \\ 0 & 0 & 0 & a_{nn} \end{pmatrix}$とするとき、行列式$\det A$は、$\det A = a_{11}a_{22}\cdots a_{nn}$となります。

$2 \times 2$行列と$3 \times 3$行列で確認してみます。

a, b, c, d, e, f, g, h, k, p, q, r, x, y, z = symbols('a b c d e f g h k p q r x y z') mA = Matrix(2, 2, [a, c, 0, d]) mA mA.det() mA = Matrix(3, 3, [a, d, g, 0, e, h, 0, 0, k]) mA mA.det()

転置行列

転置行列

$n \times n$行列$A$を$A = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n}\\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \ddots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{pmatrix}$とおきます。
ここで$\begin{pmatrix} a_{11} & a_{21} & \cdots & a_{n1}\\ a_{12} & a_{22} & \cdots & a_{n2} \\ \vdots & \ddots & \ddots & \vdots \\ a_{1n} & a_{2n} & \cdots & a_{nn} \end{pmatrix}$を行列$A$の転置行列といいます。

また行列$A$の転置行列を$^t\!A$と表します。

定理:転置行列の行列式はもとの行列の行列式に等しい

正方行列$A$とその転置行列$^t\!A$の行列式$\det A, \det(^tA)$について、$\det (^t\!A) = \det A$が成り立ちます。

m3 m3.T m3.det() == m3.T.det()

この転置行列の定理を用いて、下三角行列の行列式についても上三角行列と同様のことが言えます。

下三角行列の行列式

下三角行列$A$を$A = \begin{pmatrix} a_{11} & 0 & \cdots & 0\\ a_{21} & a_{22} & \ddots & \vdots \\ \vdots & \ddots & \ddots & 0 \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{pmatrix}$とおきます。 このとき行列式$\det A$は、$\det A = a_{11}a_{22}\cdots a_{nn}$となります。

対角行列

上三角行列、下三角行列の行列式から、下記の対角行列の行列式についても同様のことが言えます。

対角行列

下のような対角成分以外の成分がすべて0である正方行列を対角行列といいます。

$\begin{pmatrix} a_{11} & 0 & \cdots & 0\\ 0 & a_{22} & \ddots & \vdots \\ \vdots & \ddots & \ddots & 0 \\ 0 & \cdots & 0 & a_{nn} \end{pmatrix}$

行列式は$a_{11}a_{22}\cdots a_{nn}$となります。

行列式の行展開

上では行列式を列での展開によって定義しましたが、転置行列の定理を用いて以下のように計算することもできます。

$n \times n$行列を$A$とおいたとき、行列$A$の行列式$\det A$は、$\det A = a_{i1} \cdot A_{i1} + a_{i2} \cdot A_{i2} + \cdots + a_{in} \cdot A_{in}$となります。(ただし、$i = 1, 2, \cdots, n$)

行列式$\det A$を$\bm i$行目で展開するといいます

行列式の計算の工夫

基本行列2

基本行列

$n \times n$単位行列$E$の対角成分以外の$(i, j)$成分に、実数$\alpha$を1つだけ付け加えた行列を基本行列といい、$C_{i, j}(\alpha)$と表します。
条件より、$i \neq j$です。

基本行列の性質

$n \times n$行列$A$に$n \times n$基本行列$C_{i, j}(\alpha)$を右から掛けた行列の積$AC_{i, j}(\alpha)$は、行列$A$の「$j$列目に$i$列目の$\alpha$倍を足した」行列になります。

$n \times n$行列$A$に$n \times n$基本行列$C_{i, j}(\alpha)$を左から掛けた行列の積$C_{i, j}(\alpha)A$は、行列$A$の「$i$行目に$j$行目の$\alpha$倍を足した」行列になります。

具体的に確認してみましょう。

基本行列を右から掛ける

$3 \times 3$行列で2列目に1列目の3倍を足した行列を得たい場合には、$C_{1, 2}(3)$を右から掛けます。

mC = sp.eye(3, 3) mC[0, 1] = 3 mC Eq(MatMul(m3, mC), m3*mC)

基本行列を左から掛ける

上の基本行列を左から掛けた場合、1行目に2行目の3倍を足した行列が得られます。

Eq(MatMul(mC, m3), mC*m3)

基本行列の行列式

基本行列は対角成分が全て1の三角行列なので、その行列式は1になります。
$\bm \det C_{i, j}(\alpha) = 1$

また、2つの$n \times n$行列$A, B$の行列式$\det A, \det B$について以下のことが成り立ちます。
$\bm \det (AB) = (\det A)(\det B)$

これらのことから、以下の知見が得られます。

正方行列$A$の第$i$列(行)に第$j$列(行)の$\alpha$倍を足した行列を$A'$とすると、$\det A = \det A'$です。
すなわち、この操作で行列式は変化しません。

上の例で確認してみます。

(m3*mC).det() == (mC*m3).det() == m3.det()

入れ替え行列

入れ替え行列

単位行列$E$の第$i$列と第$j$列を入れ替えた行列(ただし、$i \neq j$とする)を入れ替え行列といい、$D_{i,j}$と表します。
一般に、$D_{i,j} = D_{j,i}$で、どちらを使っても構いません。

入れ替え行列の性質

$n \times n$行列$A$に$n \times n$入れ替え行列$D_{i,j}$を右から掛けた行列の積$AD_{i,j}$は、行列$A$の$i$列目と$j$列目を入れ替えた行列になります。

$n \times n$行列$A$に$n \times n$入れ替え行列$D_{i,j}$を左から掛けた行列の積$AD_{i,j}$は、行列$A$の$i$行目と$j$行目を入れ替えた行列になります。

以下$3 \times 3$行列と$4 \times 4$行列で確認します。

A = MatrixSymbol("A", 3, 3) D02 = sp.eye(3, 3) D02[:, 0], D02[:, 2] = D02[:, 2], D02[:, 0] # 右から掛けて1,3列目を入れ替える Eq(MatMul(A.as_explicit(), D02), (A*D02).as_explicit()) # 左から掛けて1,3行目を入れ替える Eq(MatMul(D02, A.as_explicit()), (D02*A).as_explicit()) A = MatrixSymbol("A", 4, 4) D02 = sp.diag(D02, 1) # 右から掛けて1,3列目を入れ替える Eq(MatMul(A.as_explicit(), D02), (A*D02).as_explicit()) # 左から掛けて1,3行目を入れ替える Eq(MatMul(D02, A.as_explicit()), (D02*A).as_explicit())

入れ替え行列の行列式

$n \times n$入れ替え行列$D_{i,j}$の行列式$\det D_{i,j}$は、$\det D_{i,j} = -1$となります。

正方行列$A$の第$i$行(列)と第$j$行(列)を入れ替えた行列$A'$における行列式$\det A$ともとの行列$A$の行列式$\det A$について、以下の等式が成り立ちます。

$\det A' = - \det A$

このことから以下の知見が得られます。

$n \times n$行列$A$のある行(列)の成分が全て0であるとき、その行列式$\det A$について、$\det A = 0$が成り立ちます。

$n \times n$行列$A$の第$i$行(列)と第$j$行(列)がベクトルとして互いに等しいとき、その行列$A$の行列式$\det A$について、$\det A = 0$が成り立ちます。

行列式の列展開と余因子行列と逆行列

行列式の展開と余因子の関係

前述の行列式の定義では、行列式を各列(行)で展開した結果が一致することを確認しました。
$3 \times 3$行列での例を再掲します。

m3 # 再掲 dets = list() for c in range(m3.cols): det = 0 for r in range(m3.rows): det += m3[r, c] * m3.cofactor(r, c) dets.append(det.expand()) # 再掲 dets[0] == dets[1] == dets[2] == m3.det()

この列展開は、もとの行列の列をベクトルに分解し、対応する余因子を並べた行ベクトルを左から掛ける操作とも考えることができます。

# 各列を列ベクトルに変換 cols = [m3.col(c) for c in range(3)] # 各列に対応する余因子の行ベクトル cofs = [Matrix(1, 3, [m3.cofactor(r, c) for r in range(3)]) for c in range(3)] # 1列目での展開と同等 Eq(MatMul(cofs[0], cols[0]), cofs[0]*cols[0]) dets = [] for c in range(3): dets.append((cofs[c]*cols[c])[0, 0].expand()) dets[0] == dets[1] == dets[2] == m3.det()

ここで、列ベクトルと対応しない余因子ベクトルを掛けるとどうなるでしょうか。
例として1列目の列ベクトルと、2列目・3列目に対応する余因子ベクトルを掛けてみます。

# 1列目と2列目に対応する余因子ベクトルの積 Eq( MatMul(cofs[1], cols[0]), (cofs[1]*cols[0]).expand() ) # 1列目と3列目に対応する余因子ベクトルの積 Eq( MatMul(cofs[2], cols[0]), (cofs[2]*cols[0]).expand() )

どちらも0になりました。
それもそのはずで、上記はそれぞれ以下の計算を行うのと同じ意味になるからです。

行列$\begin{bmatrix}a & a & g\\b & b & h\\c & c & k\end{bmatrix}$の行列式を2列目で展開して求める

行列$\begin{bmatrix}a & d & a\\b & e & b\\c & f & c\end{bmatrix}$の行列式を3列目で展開して求める

これらの行列の行列式が0となるのは、前述の入れ替え行列の性質より得られた知見から明らかです。

また、このことは列展開以外の全ての組み合わせに当てはまります。

余因子行列と逆行列

以上のことを踏まえて、余因子ベクトルを垂直に重ねた行列について考えてみます。

cofm = Matrix.vstack(*cofs) cofm

このような行列を余因子行列といいます。

余因子行列3

$n \times n$行列$A$における第$(i, j)$余因子$A_{i,j}$を、それぞれ$(j, i)$成分に並べた行列を行列$A$の余因子行列といい、$\tilde{A}$と表します。

余因子行列$\tilde{A}$と元の行列$A$との積$\tilde{A}A$は、対角成分が列展開の組み合わせで行列式となり、それ以外は上で見たとおり0になるので、

$\tilde{A}A = (\det A)E$

となります。

# 確認 Eq( MatMul(cofm, m3), MatMul(m3.det(), m3.det()**-1*(cofm*m3).expand()) # 整形のためDと1/Dを掛ける )

余因子行列$\tilde{A}$を元の行列$A$に右から掛けた積$A\tilde{A}$は、対角成分が行展開の組み合わせで行列式となり、それ以外は0になるので、

$A\tilde{A} = (\det A)E$

となります。

# 確認 Eq( MatMul(m3, cofm), MatMul(m3.det(), m3.det()**-1*(m3*cofm).expand()) )

以上のことから、
$\tilde{A}A = A\tilde{A} = (\det A)E$
すなわち、
$\big(\frac{1}{\det A}\tilde{A}\big)A = A\big(\frac{1}{\det A}\tilde{A}\big) = E$
が成り立ちます。

このことは$n \times n$正方行列についても同様に示すことができ、逆行列の求め方としてまとめると以下にようになります。

$n \times n$行列$A$の行列式$\det A$について、$\det A \neq 0$が成り立つとき、余因子行列$\tilde{A}$を用いて、行列$A$の逆行列$A^{-1}$は、以下のように表されます。

$A^{-1} = \big(\frac{1}{\det A}\big)\tilde{A}$

逆行列を利用して連立方程式を解く

行列式と余因子行列によって求めた逆行列を利用して連立方程式を解いてみます。

sympyでは余因子行列を求めるためにadjugateメソッドを使います。

2×2行列

# x00, x01の値を変えてお試しください x00 = random.randint(-9, 9) x01 = random.randint(-9, 9) x1 = Matrix(2, 1, [x00, x01]) while True: A1 = Matrix(2, 2, lambda *_: random.randint(-9, 9)) if A1.det(): break; B1 = A1*x1 Eq(MatMul(A1, x1), B1) A1.det()**-1*A1.adjugate()*B1

3×3行列

x00 = random.randint(-9, 9) x01 = random.randint(-9, 9) x02 = random.randint(-9, 9) x1 = Matrix(3, 1, [x00, x01, x02]) while True: A1 = Matrix(3, 3, lambda *_: random.randint(-9, 9)) if A1.det(): break; B1 = A1*x1 Eq(MatMul(A1, x1), B1) A1.det()**-1*A1.adjugate()*B1

7×7行列

これぐらいからadjugate()のブラウザでの実行時間が増してきます。
nを増やしてご確認ください。

n = 7 x1 = Matrix(n, 1, lambda *_: random.randint(-9, 9)) while True: A1 = Matrix(n, n, lambda *_: random.randint(-9, 9)) if A1.det(): break; B1 = A1*x1 Eq(MatMul(A1, x1), B1) A1.det()**-1*A1.adjugate()*B1

終わりに

同書を通読して行列・行列式の基本的な内容を理解しました。(入門の入門レベルだと思いますが…)
また、逆行列の求め方と利用法を知りました。

ところで、逆行列を用いて連立方程式を解くことはできましたが、その計算はなかなかに煩雑でした。
ここでの方法以外で、計算量や誤差等を減らす連立方程式の解法はあるのでしょうか?
次回以降でこの点を掘り下げていこうと思います。


  1. 定義というより計算方法ですが、同書に倣います。
    このような計算方法を余因子展開といいます。参照:余因子展開 - Wikipedia
     

  2. 一般には、ここで紹介する「基本行列」と「入れ替え行列」、加えて「単位行列の (i, i) 成分を c にした行列」をまとめて基本行列と呼ぶようです。
    参照:行列の基本変形 - WikipediaElementary matrix - Wikipedia
     

  3. 余因子行列 - Wikipedia