1
1

More than 3 years have passed since last update.

【Python演算処理】行列演算の基本②単位行列(Identity Matrix)と逆行列(Inverse Matrix)そして連立一次方程式の解法

Last updated at Posted at 2021-05-28

本当に基礎からの再出発です。Sympyの威力を改めて実感…Tex構文も吐いてくれるしもうR時代に愛用していたYacsには戻れない?もうR時代に愛用していたYacsには戻れない?
Linux で科学しよう! - Yacas - メディアラボ

単位行列(Identity Matrix)

群論(Group Theory)概念からの援用です。
【数理考古学】群論概念(Group Theory Concept)①基本定義
image.gif

高卒~大学数学:単位行列の定義

(乗法=Multiplicative)単位元(Identity Element)eとは集合$M_n$(nは次元数)に含まれる任意の数xに対して右から掛けても左から掛けてもその値を変えない数$l_n$をいう。(乗法)一般に単位元は集合$M_n$(nは次元数)に含まれる任意の数xに対して共通なものが1つだけ定まる(e=l)。

l_n=(\forall x \in M_n:xl_n=l_nx=x)

もちろん演算結果集合としての整数や実数の定義では乗法単位元$l^n=1$なのだが、「分布が不明の」確率密度空間や「ネイピア数の近似が十分とは限らない」指数・対数写像における揺らぎ具合なども考慮するとどうしても「必要にして十分なだけ$l^n$が1に近い場合だけ演算結果集合と観測結果集合が一致し群概念が成立する」といった韜晦表現の使用が不可避になってしまう。

単位行列(Identity Matrix)Eとは任意のn次正方行列(Square Matrix=行要素の数と列要素の数が一致するn行n列の行列)Aに対して右から掛けても左から掛けてもAとなるような行列をという。

E_n=(\forall A_n \in Square Matrix_n:A_nE_n=E_nA_n=A_n)

pythonによる実装

import sympy as sp
sp.init_printing()
display(sp.eye(2)) 
print(sp.latex(sp.eye(2)))
display(sp.eye(3)) 
print(sp.latex(sp.eye(3)))

2行×2列の単位行列

\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]

3行×3列の単位行列

\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]

2行×2列の単位行列の振る舞い

import sympy as sp
a,b,k,l = sp.symbols('a, b,k,l')
a=sp.Matrix([[a,b],[k,l]])
e=sp.eye(2)
sp.init_printing()
display(a)
print(sp.latex(a))
display(e)
print(sp.latex(e))
display(a*e)
print(sp.latex(a*e))
display(e*a)
print(sp.latex(e*a))

出力結果(a)

\left[\begin{matrix}a & b\\k & l\end{matrix}\right]

出力結果(e)

\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]

出力結果(a*e)

\left[\begin{matrix}a & b\\k & l\end{matrix}\right]

出力結果(e*a)

\left[\begin{matrix}a & b\\k & l\end{matrix}\right]

出力結果(合成)

\left[\begin{matrix}a & b\\k & l\end{matrix}\right]\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]=\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]\left[\begin{matrix}a & b\\k & l\end{matrix}\right]=\left[\begin{matrix}a & b\\k & l\end{matrix}\right]

3行×3列の単位行列の振る舞い

import sympy as sp
a,b,c,k,l,m,x,y,z = sp.symbols('a,b,c,k,l,m,x,y,z')
a=sp.Matrix([[a,b,c],[k,l,m],[x,y,z]])
e=sp.eye(3)
sp.init_printing()
display(a)
print(sp.latex(a))
display(e)
print(sp.latex(e))
display(a*e)
print(sp.latex(a*e))

出力結果(a)

\left[\begin{matrix}a & b & c\\k & l & m\\x & y & z\end{matrix}\right]

出力結果(e)

\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]

出力結果(a*e)

\left[\begin{matrix}a & b & c\\k & l & m\\x & y & z\end{matrix}\right]

出力結果(e*a)

\left[\begin{matrix}a & b & c\\k & l & m\\x & y & z\end{matrix}\right]

出力結果(合成)

\left[\begin{matrix}a & b & c\\k & l & m\\x & y & z\end{matrix}\right]\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]=\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}a & b & c\\k & l & m\\x & y & z\end{matrix}\right]=\left[\begin{matrix}a & b & c\\k & l & m\\x & y & z\end{matrix}\right]

ところで単位元は行ベクトル(横ベクトル)と列ベクトル(縦ベクトル)からは合成出来ません?

import sympy as sp
a=sp.Matrix([[1,0]])
b=sp.Matrix([[0],[1]])
sp.init_printing()
display(a) 
print(sp.latex(a))
display(b) 
print(sp.latex(b))
display(a*b) 
print(sp.latex(a*b))

出力結果(a)

\left[\begin{matrix}1 & 0\end{matrix}\right]

出力結果(b)

\left[\begin{matrix}0\\1\end{matrix}\right]

出力結果(a*b)

\left[\begin{matrix}0\end{matrix}\right]

出力結果(合成)

\left[\begin{matrix}1 & 0\end{matrix}\right]\left[\begin{matrix}0\\1\end{matrix}\right]=\left[\begin{matrix}0\end{matrix}\right]
import sympy as sp
a=sp.Matrix([[1,1]])
b=sp.Matrix([[0],[0]])
sp.init_printing()
display(a) 
print(sp.latex(a))
display(b) 
print(sp.latex(b))
display(a*b) 
print(sp.latex(a*b))

出力結果(a)

\left[\begin{matrix}1 & 1\end{matrix}\right]

出力結果(b)

\left[\begin{matrix}0\\0\end{matrix}\right]

出力結果(a*b)

\left[\begin{matrix}0\end{matrix}\right]

出力結果(合成)

\left[\begin{matrix}1 & 1\end{matrix}\right]\left[\begin{matrix}0\\0\end{matrix}\right]=\left[\begin{matrix}0\end{matrix}\right]

そしてスカラー1の2次正方行列表現を対角化(Diagonalization)しても対角成分((i, i)-要素)のみを抽出した対角行列(Diagonal Matrix)にはなりません?
対角行列 - Wikipedia
対角化 - Wikipedia

import sympy as sp
a=sp.Matrix([[1,1],[1,1]])
sp.init_printing()
display(a) 
print(sp.latex(a))
display(a.diagonalize()) 
print(sp.latex(a.diagonalize()))

出力結果(a)

\left[\begin{matrix}1 & 1\\1 & 1\end{matrix}\right]

出力結果(aの対角化)

\left( \left[\begin{matrix}-1 & 1\\1 & 1\end{matrix}\right], \  \left[\begin{matrix}0 & 0\\0 & 2\end{matrix}\right]\right)
import sympy as sp
a=sp.Matrix([[1,1,1],[1,1,1],[1,1,1]])
sp.init_printing()
display(a) 
print(sp.latex(a))
display(a.diagonalize()) 
print(sp.latex(a.diagonalize()))

出力結果(a)

\left[\begin{matrix}1 & 1 & 1\\1 & 1 & 1\\1 & 1 & 1\end{matrix}\right]

出力結果(aの対角化)

\left( \left[\begin{matrix}-1 & -1 & 1\\1 & 0 & 1\\0 & 1 & 1\end{matrix}\right], \  \left[\begin{matrix}0 & 0 & 0\\0 & 0 & 0\\0 & 0 & 3\end{matrix}\right]\right)

何が起こったかさっぱり分かりませんが、とりあえず現段階では脇道に過ぎないので先に進みます。
この部分を執筆する時引っ掛かっていたのは以下の考えか?
線形独立とランク

複数のベクトルを集めたとき,その中の一つが他のベクトルを組み合わせて表現できるかどうかということについて考えてみよう。組み合わせるというのは,定数倍したり和を取ったりするということであり、これを「線形和」と呼ぶ.線形和を使って他のベクトルを表現できる場合には「それらのベクトルの集まりは互いに線形従属である」と表現し,出来ない場合には「それらのベクトルの集まりは互いに線形独立である」と表現する(線形独立,線形従属という言葉の代わりに一次独立,一次従属という表現が使われることもある)。

要するに線形従属であるというのは,どれか一つ,あるいは幾つかのベクトルが他のベクトルの組み合わせで代用できるのだから「どれかが無駄に多い」状態なのである.特にどのベクトルが「無駄の張本人」だと指摘できるわけではなくて,互いに似たような奴等が同じグループ内に含まれてしまっている状態である.

このニュアンスにおいて四元数における生因子i,j,kは互いに線形従属の関係にある?
【Rで球面幾何学】ハミルトンの四元数は何を表しているのか?
image.gif

逆行列(Inverse Matrix)

これも群論(Group Theory)概念からの援用です。
【数理考古学】群論概念(Group Theory Concept)①基本定義
image.gif

高卒~大学数学:単位行列の定義

(乗法=Multiplicative)逆元(Inverse Element)$x^{-1}$とは集合$M_n$(nは次元数)に含まれる任意の数x(x≠0)に右から掛けても左から掛けても(乗法)単位元$l_n$となる数をいう。(乗法)逆元は集合$M_n$(nは次元数)に含まれる任意の数xに対応して1つずつ決まり、異なる数の逆元は異なる数になる(例えば演算結果集合としての有理数概念上は2の逆元は$\frac{1}{2}$、3の逆元は$\frac{1}{3}$に一意に定まる)。

x^{-1}=(\forall x(x≠0) \in M_n:xx^{-1}=x^{-1}x=l_n)

集合$M_n$(nは次元数)に含まれる任意の数x(x≠0)の逆元$x^{-1}$は$\frac{l_n}{x}$なので次の等式が成り立つ。

 \left\{
\begin{array}{l}
x\frac{l_n}{x}=l_n\\
\frac{l_n}{x}x=l_n
\end{array}
\right.

逆行列(Inverse Matrix)$A^{-1}$とは任意のn次正方行列(Square Matrix=行要素の数と列要素の数が一致するn行n列の行列)Aに対して右から掛けても左から掛けても単位行列$E_n$となるような行列をという。

A^{-1}=(\forall A_n \in Square Matrix_n:A_nA_n^{-1}=A_n^{-1}A_n=E_n)
  • 行列の割り算は定義されていないので$\frac{1}{A}$とは書かない.ここでは「−1」という記号を「逆の」という意味でのみ用いているのである。
  • 逆行列正方行列に対してのみ定義でき,正方行列でない行列に対する逆行列は考えない。
  • 逆数が0でない数に対してのみ存在する様に、逆行列は行列式$det(A)$が0とならない行列に対してのみ存在する。その一方で逆行列が存在する行列は正則(Regular)であるといい、その様な行列を正則行列(Regular Matrix)という。

正則行列 - Wikipedia

例えば以下の複素数体$\mathbb{C}$上に置かれた二次正方行列を想定する。

{\displaystyle A={\begin{bmatrix}a&b\\c&d\end{bmatrix}}}

これが正則行列であるのはad−bc≠0が成立する時、かつそのときに限るが、この時逆行列は以下の式で与えられるのである。

{\displaystyle A^{-1}={\frac {1}{ad-bc}}{\begin{bmatrix}d&-b\\-c&a\end{bmatrix}}}

ある体上の同じサイズの正則行列の全体は一般線型群と呼ばれる群を成す。多項式の根として定められる部分群は線形代数群あるいは行列群と呼ばれる代数群の一種で、その表現論は代数的整数論など幅広い範囲に応用される幾何学的対象となる。

pythonによる実装
私にとっては、もはや手計算など思いもよらぬ領域…

2行×2列の正方行列の逆行列

import sympy as sp
a=sp.Matrix([[1,1]])
b=sp.Matrix([[0],[0]])
sp.init_printing()
display(a) 
print(sp.latex(a))
display(b) 
print(sp.latex(b))
display(a*b) 
print(sp.latex(a*b))

出力結果(a)

\left[\begin{matrix}2 & 5\\1 & 3\end{matrix}\right]

出力結果(2行×2列の場合の単位元)

\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]

出力結果(b=aの逆行列a.inv())

\left[\begin{matrix}3 & -5\\-1 & 2\end{matrix}\right]

出力結果(b=aの逆行列a**(-1))

\left[\begin{matrix}3 & -5\\-1 & 2\end{matrix}\right]

出力結果(a*b)

\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]

出力結果(合成)

\left[\begin{matrix}2 & 5\\1 & 3\end{matrix}\right]\left[\begin{matrix}3 & -5\\-1 & 2\end{matrix}\right]=\left[\begin{matrix}3 & -5\\-1 & 2\end{matrix}\right]\left[\begin{matrix}2 & 5\\1 & 3\end{matrix}\right]=\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]

3行×3列の正方行列の逆行列

import sympy as sp
a=sp.Matrix([[1,2,5],[1,-1,1],[0,1,2]])
b=a.inv()
e=sp.eye(2)
sp.init_printing()
display(a) 
print(sp.latex(a))
display(e) 
print(sp.latex(e))
display(b) 
print(sp.latex(b))
display(a*b) 
print(sp.latex(a*b))
display(b*a) 
print(sp.latex(b*a))

出力結果(a)

\left[\begin{matrix}1 & 2 & 5\\1 & -1 & 1\\0 & 1 & 2\end{matrix}\right]

出力結果(3行×3列の場合の単位元)

\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]

出力結果(b=aの逆行列a.inv())

\left[\begin{matrix}\frac{3}{2} & - \frac{1}{2} & - \frac{7}{2}\\1 & -1 & -2\\- \frac{1}{2} & \frac{1}{2} & \frac{3}{2}\end{matrix}\right]

出力結果(a*b)

\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]

出力結果(b*a)

\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]

出力結果(合成)

\left[\begin{matrix}1 & 2 & 5\\1 & -1 & 1\\0 & 1 & 2\end{matrix}\right]\left[\begin{matrix}\frac{3}{2} & - \frac{1}{2} & - \frac{7}{2}\\1 & -1 & -2\\- \frac{1}{2} & \frac{1}{2} & \frac{3}{2}\end{matrix}\right]=\left[\begin{matrix}\frac{3}{2} & - \frac{1}{2} & - \frac{7}{2}\\1 & -1 & -2\\- \frac{1}{2} & \frac{1}{2} & \frac{3}{2}\end{matrix}\right]\left[\begin{matrix}1 & 2 & 5\\1 & -1 & 1\\0 & 1 & 2\end{matrix}\right]=\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]

4行×4列の正方行列の逆行列

import sympy as sp
a=sp.Matrix([[4,4,1,0],[2,3,1,-2],[0,1,-1,2],[5,-1,2,1]])
b=a.inv()
e=sp.eye(4)
d=a.det()
sp.init_printing()
display(a) 
print(sp.latex(a))
display(e) 
print(sp.latex(e))
display(b) 
print(sp.latex(b))
display(d) 
print(sp.latex(d))
display(b*d) 
print(sp.latex(b*d))

出力結果(a)

\left[\begin{matrix}4 & 4 & 1 & 0\\2 & 3 & 1 & -2\\0 & 1 & -1 & 2\\5 & -1 & 2 & 1\end{matrix}\right]

出力結果(4行×4列の場合の単位元)

\left[\begin{matrix}1 & 0 & 0 & 0\\0 & 1 & 0 & 0\\0 & 0 & 1 & 0\\0 & 0 & 0 & 1\end{matrix}\right]

出力結果(aの逆行列a.inv())

\left[\begin{matrix}- \frac{10}{3} & \frac{23}{6} & \frac{19}{6} & \frac{4}{3}\\\frac{5}{3} & - \frac{5}{3} & - \frac{4}{3} & - \frac{2}{3}\\\frac{23}{3} & - \frac{26}{3} & - \frac{22}{3} & - \frac{8}{3}\\3 & - \frac{7}{2} & - \frac{5}{2} & -1\end{matrix}\right]

出力結果(aの行列式a.det())…0でないから逆行列が存在する。

6

出力結果(aの行列式*aの逆行列)

\left[\begin{matrix}-20 & 23 & 19 & 8\\10 & -10 & -8 & -4\\46 & -52 & -44 & -16\\18 & -21 & -15 & -6\end{matrix}\right]

出力結果(合成)

\left[\begin{matrix}4 & 4 & 1 & 0\\2 & 3 & 1 & -2\\0 & 1 & -1 & 2\\5 & -1 & 2 & 1\end{matrix}\right]\left[\begin{matrix}- \frac{10}{3} & \frac{23}{6} & \frac{19}{6} & \frac{4}{3}\\\frac{5}{3} & - \frac{5}{3} & - \frac{4}{3} & - \frac{2}{3}\\\frac{23}{3} & - \frac{26}{3} & - \frac{22}{3} & - \frac{8}{3}\\3 & - \frac{7}{2} & - \frac{5}{2} & -1\end{matrix}\right]=\left[\begin{matrix}- \frac{10}{3} & \frac{23}{6} & \frac{19}{6} & \frac{4}{3}\\\frac{5}{3} & - \frac{5}{3} & - \frac{4}{3} & - \frac{2}{3}\\\frac{23}{3} & - \frac{26}{3} & - \frac{22}{3} & - \frac{8}{3}\\3 & - \frac{7}{2} & - \frac{5}{2} & -1\end{matrix}\right]\left[\begin{matrix}4 & 4 & 1 & 0\\2 & 3 & 1 & -2\\0 & 1 & -1 & 2\\5 & -1 & 2 & 1\end{matrix}\right]=\left[\begin{matrix}1 & 0 & 0 & 0\\0 & 1 & 0 & 0\\0 & 0 & 1 & 0\\0 & 0 & 0 & 1\end{matrix}\right]

そして

det(A)A^{-1}=6A^{-1}=\left[\begin{matrix}-20 & 23 & 19 & 8\\10 & -10 & -8 & -4\\46 & -52 & -44 & -16\\18 & -21 & -15 & -6\end{matrix}\right]

この様に分数は行列式の結果(スカラー)によって割る過程で生じる。
【Python演算処理】行列演算の基本①基本的四則演算と積

余因子行列(Adjugate Matrix

余因子行列 - Wikipedia

数学の線形代数学において、可換環$\mathbb{R}$上のn次正方行列$A=(a_{i,j})$における余因子行列(Adjugate Matrix)あるいは古典随伴行列(Classical Adjoint Matrix)とは、(i, j)成分が (i, j)余因子である行列の転置行列のことであり、記号で${\displaystyle \operatorname {adj} (A)}$,${\displaystyle {\widetilde {A}}}$などと表す。これもn次正方行列となる。

単に (i, j)成分が (i, j)余因子である行列(転置をしない)を「余因子行列」と呼ぶ場合もある。随伴行列や随伴作用素とは異なる。

余因子行列により、正則行列の逆行列を具体的に成分表示することができる。

その定義

Aの(i,j)小行列式を$M_{i,j}$で表すことにする。これは、Aの第i行、第j列を除いてできる(n− 1)次小正方行列の行列式である:

{\displaystyle \operatorname {adj} (A)=(b_{i,j}),\quad b_{i,j}=(-1)^{i+j}M_{j,i}}

Aの(i,j)余因子を$\widetilde{a}^{i,j}$で表すと以下となる。

{\displaystyle {\widetilde {a}}_{i,j}=(-1)^{i+j}M_{i,j}}\\
{\displaystyle \operatorname {adj} (A)=(b_{i,j}),\quad b_{i,j}=({\widetilde {a}}_{j,i})}

Aの余因子展開は、Aの余因子行列$\widetilde{A}$により、次のように表せる。ここでIは単位行列である。:

{\displaystyle A{\widetilde {A}}={\widetilde {A}}A=(\det(A))I}

Aが特に正則行列のとき、Aの逆行列余因子行列$\widetilde{A}$で次のように表せる:

{\displaystyle A^{-1}={\frac {1}{\det(A)}}{\widetilde {A}}}

1次余因子行列

1次正方行列A=(a)の余因子行列は、Aが零行列でないときは、以下の1次単位行列である。

{\displaystyle I={\begin{bmatrix}1\end{bmatrix}}}

${\displaystyle \operatorname {adj} (0)}$は慣習上0とする。

2次余因子行列

2次正方行列

{\displaystyle A={\begin{bmatrix}a&b\\c&d\end{bmatrix}}}

の余因子行列は

{\displaystyle \operatorname {adj} (A)={\begin{bmatrix}d&-b\\-c&a\end{bmatrix}}}

なお、この 2次の場合は${\displaystyle \operatorname {adj} \operatorname {adj} A=A}$が成り立つ。

3次余因子行列

3次正方行列

{\displaystyle A={\begin{bmatrix}a_{11}&a_{12}&a_{13}\\a_{21}&a_{22}&a_{23}\\a_{31}&a_{32}&a_{33}\end{bmatrix}}}

の余因子行列を考える。(i, j)成分に (i, j)余因子を並べたものは、

{\displaystyle C={\begin{bmatrix}+{\begin{vmatrix}a_{22}&a_{23}\\a_{32}&a_{33}\end{vmatrix}}&-{\begin{vmatrix}a_{21}&a_{23}\\a_{31}&a_{33}\end{vmatrix}}&+{\begin{vmatrix}a_{21}&a_{22}\\a_{31}&a_{32}\end{vmatrix}}\\&&\\-{\begin{vmatrix}a_{12}&a_{13}\\a_{32}&a_{33}\end{vmatrix}}&+{\begin{vmatrix}a_{11}&a_{13}\\a_{31}&a_{33}\end{vmatrix}}&-{\begin{vmatrix}a_{11}&a_{12}\\a_{31}&a_{32}\end{vmatrix}}\\&&\\+{\begin{vmatrix}a_{12}&a_{13}\\a_{22}&a_{23}\end{vmatrix}}&-{\begin{vmatrix}a_{11}&a_{13}\\a_{21}&a_{23}\end{vmatrix}}&+{\begin{vmatrix}a_{11}&a_{12}\\a_{21}&a_{22}\end{vmatrix}}\end{bmatrix}},}

ここで

{\displaystyle {\begin{vmatrix}a_{im}&a_{in}\\a_{jm}&a_{jn}\end{vmatrix}}=\det {\begin{bmatrix}a_{im}&a_{in}\\a_{jm}&a_{jn}\end{bmatrix}}=\det {\begin{vmatrix}a_{im}&a_{in}\\a_{jm}&a_{jn}\end{vmatrix}}}

である。余因子行列はこれの転置行列であるから、以下となる。

{\displaystyle \operatorname {adj} (A)=C^{\mathsf {T}}={\begin{bmatrix}+{\begin{vmatrix}a_{22}&a_{23}\\a_{32}&a_{33}\end{vmatrix}}&-{\begin{vmatrix}a_{12}&a_{13}\\a_{32}&a_{33}\end{vmatrix}}&+{\begin{vmatrix}a_{12}&a_{13}\\a_{22}&a_{23}\end{vmatrix}}\\&&\\-{\begin{vmatrix}a_{21}&a_{23}\\a_{31}&a_{33}\end{vmatrix}}&+{\begin{vmatrix}a_{11}&a_{13}\\a_{31}&a_{33}\end{vmatrix}}&-{\begin{vmatrix}a_{11}&a_{13}\\a_{21}&a_{23}\end{vmatrix}}\\&&\\+{\begin{vmatrix}a_{21}&a_{22}\\a_{31}&a_{32}\end{vmatrix}}&-{\begin{vmatrix}a_{11}&a_{12}\\a_{31}&a_{32}\end{vmatrix}}&+{\begin{vmatrix}a_{11}&a_{12}\\a_{21}&a_{22}\end{vmatrix}}\end{bmatrix}}}

pythonによる実装

import sympy as sp
a=sp.Matrix([[4,-1],[5,2]])
c=a.adjugate()
b=c.transpose()
i=a.inv()
e=sp.eye(2)
d=a.det()
sp.init_printing()
display(a) 
print(sp.latex(a))
display(b) 
print(sp.latex(b))
display(c) 
print(sp.latex(c))
display(e) 
print(sp.latex(e))
display(d) 
print(sp.latex(d))
display(i) 
print(sp.latex(i))

出力結果(a)

\left[\begin{matrix}4 & -1\\5 & 2\end{matrix}\right]

出力結果(b=aの各成分の余因子、すなわち2×2行列の行列式det(A)=ad−bcを求めた結果)

\left[\begin{matrix}2 & -5\\1 & 4\end{matrix}\right]

出力結果(bの転置行列b.transpose())

\left[\begin{matrix}2 & 1\\-5 & 4\end{matrix}\right]

出力結果(2行×2列の単位行列)

\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]

出力結果(aの行列式a.det())…0でないから逆行列が存在する。

13

出力結果(aの逆行列)

\left[\begin{matrix}\frac{2}{13} & \frac{1}{13}\\- \frac{5}{13} & \frac{4}{13}\end{matrix}\right]

出力結果(合成)
①行列Aの逆行列$A^{-1}$を求める。

\left[\begin{matrix}4 & -1\\5 & 2\end{matrix}\right]

②元行列Aの余因子、すなわち各成分の行列式ad−bcを求めた結果を転置する。

\left[\begin{matrix}2 & -5\\1 & 4\end{matrix}\right]^T=\left[\begin{matrix}2 & 1\\-5 & 4\end{matrix}\right]

②これを行列全体の余因子ad−bcで割ると逆行列$A^{-1}$が求まる。

A^{-1}=\frac{1}{dat(A)}\left[\begin{matrix}2 & 1\\-5 & 4\end{matrix}\right]=\frac{1}{13}\left[\begin{matrix}2 & 1\\-5 & 4\end{matrix}\right]=\left[\begin{matrix}\frac{2}{13} & \frac{1}{13}\\- \frac{5}{13} & \frac{4}{13}\end{matrix}\right]

③すなわち以下が成立する。

\left[\begin{matrix}4 & -1\\5 & 2\end{matrix}\right]\left[\begin{matrix}\frac{2}{13} & \frac{1}{13}\\- \frac{5}{13} & \frac{4}{13}\end{matrix}\right]=\left[\begin{matrix}\frac{2}{13} & \frac{1}{13}\\- \frac{5}{13} & \frac{4}{13}\end{matrix}\right]\left[\begin{matrix}4 & -1\\5 & 2\end{matrix}\right]=\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]
import sympy as sp
a=sp.Matrix([[1,5,-4],[2,10,-9],[-1,-2,2]])
c=a.adjugate()
b=c.transpose()
i=a.inv()
e=sp.eye(3)
d=a.det()
sp.init_printing()
display(a) 
print(sp.latex(a))
display(b) 
print(sp.latex(b))
display(c) 
print(sp.latex(c))
display(e) 
print(sp.latex(e))
display(d) 
print(sp.latex(d))
display(i) 
print(sp.latex(i))

出力結果(a)

\left[\begin{matrix}1 & 5 & -4\\2 & 10 & -9\\-1 & -2 & 2\end{matrix}\right]

出力結果(b=aの各成分の余因子、すなわち2×2行列の行列式det(A)=ad−bcに符号を付けた結果)

\left[\begin{matrix}2 & 5 & 6\\-2 & -2 & -3\\-5 & 1 & 0\end{matrix}\right]

出力結果(bの転置行列b.transpose())

\left[\begin{matrix}2 & -2 & -5\\5 & -2 & 1\\6 & -3 & 0\end{matrix}\right]

出力結果(3行×3列の単位行列)

\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]

出力結果(aの行列式a.det())…0でないから逆行列が存在する。

3

出力結果(aの逆行列)

\left[\begin{matrix}\frac{2}{3} & - \frac{2}{3} & - \frac{5}{3}\\\frac{5}{3} & - \frac{2}{3} & \frac{1}{3}\\2 & -1 & 0\end{matrix}\right]

出力結果(合成)
①行列Aの逆行列$A^{-1}$を求める。

\left[\begin{matrix}1 & 5 & -4\\2 & 10 & -9\\-1 & -2 & 2\end{matrix}\right]

②元行列Aの余因子、すなわち各成分の行列式ad−bcに符号を付けた結果を転置する。

\left[\begin{matrix}2 & 5 & 6\\-2 & -2 & -3\\-5 & 1 & 0\end{matrix}\right]^T=\left[\begin{matrix}2 & -2 & -5\\5 & -2 & 1\\6 & -3 & 0\end{matrix}\right]

③これを行列全体の余因子で割ると逆行列$A^{-1}$が求まる。

A^{-1}=\frac{1}{dat(A)}\left[\begin{matrix}2 & -2 & -5\\5 & -2 & 1\\6 & -3 & 0\end{matrix}\right]=\frac{1}{3}\left[\begin{matrix}2 & -2 & -5\\5 & -2 & 1\\6 & -3 & 0\end{matrix}\right]=\left[\begin{matrix}\frac{2}{3} & - \frac{2}{3} & - \frac{5}{3}\\\frac{5}{3} & - \frac{2}{3} & \frac{1}{3}\\2 & -1 & 0\end{matrix}\right]

④すなわち以下が成立する。

\left[\begin{matrix}1 & 5 & -4\\2 & 10 & -9\\-1 & -2 & 2\end{matrix}\right]\left[\begin{matrix}\frac{2}{3} & - \frac{2}{3} & - \frac{5}{3}\\\frac{5}{3} & - \frac{2}{3} & \frac{1}{3}\\2 & -1 & 0\end{matrix}\right]=\left[\begin{matrix}\frac{2}{3} & - \frac{2}{3} & - \frac{5}{3}\\\frac{5}{3} & - \frac{2}{3} & \frac{1}{3}\\2 & -1 & 0\end{matrix}\right]\left[\begin{matrix}1 & 5 & -4\\2 & 10 & -9\\-1 & -2 & 2\end{matrix}\right]=\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]

連立1次方程式を解く

これでやっと以下の続きについて触れる準備が整いました。
【Python演算処理】行列演算の基本①基本的四則演算と積

そう、線形代数概念の中核はまさにこれとも。
線形代数とは何か

要するに線形代数とは「連立一次方程式」についての学問なのである.正体が分かってしまうだけで随分と気が楽になるだろう

Python (SymPy) による行列の計算

以下の連立1次方程式について考えます。

~ a_{11}x_1 + a_{12} x_2 + \dots + a_{1n} x_n=y_1 \\ ~ a_{21}x_1 + a_{22} x_2 + \dots + a_{2n} x_n=y_2 \\ ~~ \vdots \\ ~ a_{n1}x_1 + a_{n2} x_2 + \dots + a_{nn} x_n=y_n

これは行列を使って以下の様に表す事が出来ます。

\displaystyle{~\begin{pmatrix} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ \vdots & \vdots & \dots & \vdots \\ a_{n1} & a_{n2} & \dots & a_{nn} \end{pmatrix}\begin{pmatrix} x_1 \\ x_2 \\ \dots \\ x_n \end{pmatrix}=\begin{pmatrix} y_1 \\ y_2 \\ \dots \\ y_n \end{pmatrix}}

その解は、行列$A_n$の逆行列$A_n^{−1}$(いまは逆行列は存在するものと仮定します)を使って以下の様に求めることが出来るのです。

\displaystyle{~A_n=\begin{pmatrix} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ \vdots & \vdots & \dots & \vdots \\ a_{n1} & a_{n2} & \dots & a_{nn} \end{pmatrix}}\\
\displaystyle{~\begin{pmatrix} x_1 \\ x_2 \\ \dots \\ x_n \end{pmatrix}=A_n^{-1}\begin{pmatrix} y_1 \\ y_2 \\ \dots \\ y_n \end{pmatrix}}

例題

3変数x、y、zの連立1次方程式

~ ax+by+cz=j \\ ~ dx+ey+fz=k \\ ~ gx+hy+iz=l

これは以下の逆行列を求めるのに等しい。

\displaystyle{~A_3=\begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix}}

pythonによる実装

import sympy as sp
a,b,c,d,e,f,g,h,i= sp.symbols('a,b,c,d,e,f,g,h,i')
a=sp.Matrix([[a,b,c],[d,e,f],[g,h,i]])
c=a.adjugate()
b=c.transpose()
i=a.inv()
d=a.det()
sp.init_printing()
display(a) 
print(sp.latex(a))
display(b) 
print(sp.latex(b))
display(c) 
print(sp.latex(c))
display(d) 
print(sp.latex(d))
display(i) 
print(sp.latex(i))

出力結果(a)

\left[\begin{matrix}a & b & c\\d & e & f\\g & h & i\end{matrix}\right]

出力結果(b=aの各成分の余因子、すなわち2×2行列の行列式det(A)=ad−bcに符号を付けた結果)

\left[\begin{matrix}e i - f h & - d i + f g & d h - e g\\- b i + c h & a i - c g & - a h + b g\\b f - c e & - a f + c d & a e - b d\end{matrix}\right]

出力結果(bの転置行列b.transpose())

\left[\begin{matrix}e i - f h & - b i + c h & b f - c e\\- d i + f g & a i - c g & - a f + c d\\d h - e g & - a h + b g & a e - b d\end{matrix}\right]

出力結果(aの行列式a.det())…0でない限り逆行列が存在する。

a e i - a f h - b d i + b f g + c d h - c e g

出力結果(aの逆行列)

\left[\begin{matrix}\frac{e i - f h}{a e i - a f h - b d i + b f g + c d h - c e g} & - \frac{b i - c h}{a e i - a f h - b d i + b f g + c d h - c e g} & \frac{b f - c e}{a e i - a f h - b d i + b f g + c d h - c e g}\\- \frac{d i - f g}{a e i - a f h - b d i + b f g + c d h - c e g} & \frac{a i - c g}{a e i - a f h - b d i + b f g + c d h - c e g} & - \frac{a f - c d}{a e i - a f h - b d i + b f g + c d h - c e g}\\\frac{d h - e g}{a e i - a f h - b d i + b f g + c d h - c e g} & - \frac{a h - b g}{a e i - a f h - b d i + b f g + c d h - c e g} & \frac{a e - b d}{a e i - a f h - b d i + b f g + c d h - c e g}\end{matrix}\right]

出力結果(合成)
①行列$A_3$の逆行列$A_3^{-1}$を求める。

\left[\begin{matrix}a & b & c\\d & e & f\\g & h & i\end{matrix}\right]

②元行列Aの余因子、すなわち各成分の行列式ad−bcに符号を付けた結果を転置する。

\left[\begin{matrix}e i - f h & - d i + f g & d h - e g\\- b i + c h & a i - c g & - a h + b g\\b f - c e & - a f + c d & a e - b d\end{matrix}\right]^T=\left[\begin{matrix}e i - f h & - b i + c h & b f - c e\\- d i + f g & a i - c g & - a f + c d\\d h - e g & - a h + b g & a e - b d\end{matrix}\right]

③これを行列全体の余因子で割ると逆行列$A^{-1}$が求まる。

A_3^{-1}=\frac{1}{dat(A)}\left[\begin{matrix}e i - f h & - b i + c h & b f - c e\\- d i + f g & a i - c g & - a f + c d\\d h - e g & - a h + b g & a e - b d\end{matrix}\right]=\frac{1}{a e i - a f h - b d i + b f g + c d h - c e g}\left[\begin{matrix}e i - f h & - b i + c h & b f - c e\\- d i + f g & a i - c g & - a f + c d\\d h - e g & - a h + b g & a e - b d\end{matrix}\right]=\left[\begin{matrix}\frac{e i - f h}{a e i - a f h - b d i + b f g + c d h - c e g} & - \frac{b i - c h}{a e i - a f h - b d i + b f g + c d h - c e g} & \frac{b f - c e}{a e i - a f h - b d i + b f g + c d h - c e g}\\- \frac{d i - f g}{a e i - a f h - b d i + b f g + c d h - c e g} & \frac{a i - c g}{a e i - a f h - b d i + b f g + c d h - c e g} & - \frac{a f - c d}{a e i - a f h - b d i + b f g + c d h - c e g}\\\frac{d h - e g}{a e i - a f h - b d i + b f g + c d h - c e g} & - \frac{a h - b g}{a e i - a f h - b d i + b f g + c d h - c e g} & \frac{a e - b d}{a e i - a f h - b d i + b f g + c d h - c e g}\end{matrix}\right]

最後はこの逆行列にベクトル

\displaystyle{~Y=\begin{pmatrix} j \\ k \\ l \end{pmatrix}}

を掛け合わせれば解が得られる:

\displaystyle{~\begin{pmatrix} x \\ y \\ z \end{pmatrix} = A_3^{-1}Y= \frac{1}{\det A_3}\begin{pmatrix} j(ei-fh)  -k(bi-ch) +l(bf-ce) \\ -j(𝑑𝑖−𝑓𝑔) +k( 𝑎𝑖−𝑐𝑔)  -l(𝑎𝑓−𝑐𝑑) \\ j(𝑑ℎ−𝑒𝑔)  -k(𝑎ℎ−𝑏𝑔) +l( 𝑎𝑒−𝑏𝑑) \end{pmatrix}}\\
ただし\displaystyle{~\det A_3=a(ei-fh)-b(di-fg)+c(dh-eg)}

これをsolveを使って求めた解と見比べてみる:

import sympy as sp
a,b,c,d,e,f,g,h,i,j,k,l,x,y,z= sp.symbols('a,b,c,d,e,f,g,h,i,j,k,l,x,y,z')
eq1=sp.Eq(a*x+b*y+c*z, j)
eq2=sp.Eq(d*x+e*y+f*z, k)
eq3=sp.Eq(g*x+h*y+i*z, l)
sp.init_printing()
display(sp.solve ([eq1, eq2, eq3], [x, y, z]))
print(sp.latex(sp.solve ([eq1, eq2, eq3], [x, y, z])))
\displaystyle \left\{ x : \frac{j \left(e i - f h\right) - k \left(b i - c h\right) + l \left(b f - c e\right)}{a e i - a f h - b d i + b f g + c d h - c e g}, \  y : \frac{- j \left(d i - f g\right) + k \left(a i - c g\right) - l \left(a f - c d\right)}{a e i - a f h - b d i + b f g + c d h - c e g}, \  z : \frac{j \left(d h - e g\right) - k \left(a h - b g\right) + l \left(a e - b d\right)}{a e i - a f h - b d i + b f g + c d h - c e g}\right\}

確かに一致している。

そんな感じで以下続報…

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1