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

本当に基礎からの再出発です。Sympyの威力を改めて実感…Tex構文も吐いてくれるしもうR時代に愛用していたYacsには戻れない?もうR時代に愛用していたYacsには戻れない?
[Linux で科学しよう！ - Yacas - メディアラボ](http://www.mlb.co.jp/linux/science/yacas/index.html)

#単位行列(<font color=blue>Identity Matrix</font>)

**群論**(Group Theory)概念からの援用です。
[【数理考古学】群論概念(Group Theory Concept)①基本定義](https://qiita.com/ochimusha01/items/208dc0e68db64805e4f7)
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fo%2Fochimusha01%2F20210411%2F20210411223344.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=9affba695a803e501f0334cb198ae448)

[高卒～大学数学:単位行列の定義](https://www.geisya.or.jp/~mwm48961/linear_algebra/inverse1.htm)

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

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

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

```math
E_n=(\forall A_n \in Square Matrix_n:A_nE_n=E_nA_n=A_n)
```
**pythonによる実装**

```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列の単位行列**

```math
\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]
```
**3行×3列の単位行列**

```math
\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]
```
**2行×2列の単位行列の振る舞い**

```python
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)

```math
\left[\begin{matrix}a & b\\k & l\end{matrix}\right]
```
**出力結果**(e)

```math
\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]
```
**出力結果**(a*e)

```math
\left[\begin{matrix}a & b\\k & l\end{matrix}\right]
```
**出力結果**(e*a)

```math
\left[\begin{matrix}a & b\\k & l\end{matrix}\right]
```
**出力結果**(合成)

```math
\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列の単位行列の振る舞い**

```python
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)

```math
\left[\begin{matrix}a & b & c\\k & l & m\\x & y & z\end{matrix}\right]
```
**出力結果**(e)

```math
\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]
```
**出力結果**(a*e)

```math
\left[\begin{matrix}a & b & c\\k & l & m\\x & y & z\end{matrix}\right]
```
**出力結果**(e*a)

```math
\left[\begin{matrix}a & b & c\\k & l & m\\x & y & z\end{matrix}\right]
```
**出力結果**(合成)

```math
\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]
```
ところで単位元は行ベクトル(横ベクトル)と列ベクトル(縦ベクトル)からは合成出来ません?

```python
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)

```math
\left[\begin{matrix}1 & 0\end{matrix}\right]
```
**出力結果**(b)

```math
\left[\begin{matrix}0\\1\end{matrix}\right]
```
**出力結果**(a*b)

```math
\left[\begin{matrix}0\end{matrix}\right]
```
**出力結果**(合成)

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

```python
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)

```math
\left[\begin{matrix}1 & 1\end{matrix}\right]
```
**出力結果**(b)

```math
\left[\begin{matrix}0\\0\end{matrix}\right]
```
**出力結果**(a*b)

```math
\left[\begin{matrix}0\end{matrix}\right]
```
**出力結果**(合成)

```math
\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](https://ja.wikipedia.org/wiki/%E5%AF%BE%E8%A7%92%E8%A1%8C%E5%88%97)
[対角化 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%AF%BE%E8%A7%92%E5%8C%96)

```python
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)

```math
\left[\begin{matrix}1 & 1\\1 & 1\end{matrix}\right]
```
**出力結果**(aの対角化)

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

```python
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)

```math
\left[\begin{matrix}1 & 1 & 1\\1 & 1 & 1\\1 & 1 & 1\end{matrix}\right]
```
**出力結果**(aの対角化)

```math
\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)
```
何が起こったかさっぱり分かりませんが、とりあえず現段階では脇道に過ぎないので先に進みます。
<font color=green>この部分を執筆する時引っ掛かっていたのは以下の考えか?</font>
[線形独立とランク](https://eman-physics.net/math/linear07.html)

>複数のベクトルを集めたとき,その中の一つが他のベクトルを組み合わせて表現できるかどうかということについて考えてみよう。組み合わせるというのは,定数倍したり和を取ったりするということであり、これを「線形和」と呼ぶ.線形和を使って他のベクトルを表現できる場合には「それらのベクトルの集まりは互いに線形従属である」と表現し,出来ない場合には「それらのベクトルの集まりは互いに線形独立である」と表現する(<font color=blue>線形独立,線形従属という言葉の代わりに一次独立,一次従属という表現が使われることもある</font>)。
>
>要するに線形従属であるというのは,どれか一つ,あるいは幾つかのベクトルが他のベクトルの組み合わせで代用できるのだから「どれかが無駄に多い」状態なのである.特にどのベクトルが「無駄の張本人」だと指摘できるわけではなくて,互いに似たような奴等が同じグループ内に含まれてしまっている状態である.

このニュアンスにおいて四元数における生因子i,j,kは互いに線形従属の関係にある?
[【Rで球面幾何学】ハミルトンの四元数は何を表しているのか？](https://qiita.com/ochimusha01/items/aff8d52f20af01d13bed)
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn-ak.f.st-hatena.com%252Fimages%252Ffotolife%252Fo%252Fochimusha01%252F20210326%252F20210326143809.gif%3Fixlib%3Drb-4.0.0%26auto%3Dformat%26gif-q%3D60%26q%3D75%26w%3D1400%26fit%3Dmax%26s%3D6ae8c73eac17e31d262307bd809859f3?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=95bb694a37a1554dac0e397f394ab43f)

#逆行列(<font color=blue>Inverse Matrix</font>)

これも**群論**(Group Theory)概念からの援用です。
[【数理考古学】群論概念(Group Theory Concept)①基本定義](https://qiita.com/ochimusha01/items/208dc0e68db64805e4f7)
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fo%2Fochimusha01%2F20210411%2F20210411224029.gif?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=e874ec46a8602412dd87b675344ae811)

[高卒～大学数学:単位行列の定義](https://www.geisya.or.jp/~mwm48961/linear_algebra/inverse1.htm)

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

```math
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}$なので次の等式が成り立つ。

```math
 \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}$とは任意のｎ次正方行列(Square Matrix=行要素の数と列要素の数が一致するn行n列の行列)Aに対して右から掛けても左から掛けても単位行列$E_n$となるような行列をという。

```math
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](https://ja.wikipedia.org/wiki/%E6%AD%A3%E5%89%87%E8%A1%8C%E5%88%97)

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

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

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

```math
{\displaystyle A^{-1}={\frac {1}{ad-bc}}{\begin{bmatrix}d&-b\\-c&a\end{bmatrix}}}
```
>ある体上の同じサイズの正則行列の全体は**一般線型群**と呼ばれる群を成す。多項式の根として定められる部分群は**線形代数群**あるいは**行列群**と呼ばれる代数群の一種で、その表現論は**代数的整数論**など幅広い範囲に応用される幾何学的対象となる。

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

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

```python
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)

```math
\left[\begin{matrix}2 & 5\\1 & 3\end{matrix}\right]
```
**出力結果**(2行×2列の場合の単位元)

```math
\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]
```
**出力結果**(b=aの逆行列a.inv())

```math
\left[\begin{matrix}3 & -5\\-1 & 2\end{matrix}\right]
```
**出力結果**(b=aの逆行列a**(-1))

```math
\left[\begin{matrix}3 & -5\\-1 & 2\end{matrix}\right]
```
**出力結果**(a*b)

```math
\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]
```
**出力結果**(合成)

```math
\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列の正方行列の逆行列**

```python
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)

```math
\left[\begin{matrix}1 & 2 & 5\\1 & -1 & 1\\0 & 1 & 2\end{matrix}\right]
```
**出力結果**(3行×3列の場合の単位元)

```math
\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]
```
**出力結果**(b=aの逆行列a.inv())

```math
\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)

```math
\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]
```
**出力結果**(b*a)

```math
\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]
```
**出力結果**(合成)

```math
\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列の正方行列の逆行列**

```python
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)

```math
\left[\begin{matrix}4 & 4 & 1 & 0\\2 & 3 & 1 & -2\\0 & 1 & -1 & 2\\5 & -1 & 2 & 1\end{matrix}\right]
```
**出力結果**(4行×4列の場合の単位元)

```math
\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())

```math
\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でないから逆行列が存在する。

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

```math
\left[\begin{matrix}-20 & 23 & 19 & 8\\10 & -10 & -8 & -4\\46 & -52 & -44 & -16\\18 & -21 & -15 & -6\end{matrix}\right]
```
**出力結果**(合成)

```math
\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]
```
そして

```math
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演算処理】行列演算の基本①基本的四則演算と積](https://qiita.com/ochimusha01/items/b4a456b6ab12a5ea57f6)

#余因子行列（<font color=blue>Adjugate Matrix</font>）
[余因子行列 - Wikipedia](https://ja.wikipedia.org/wiki/%E4%BD%99%E5%9B%A0%E5%AD%90%E8%A1%8C%E5%88%97)

>数学の線形代数学において、可換環$\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)次小正方行列の行列式である：

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

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

```math
{\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は単位行列である。：

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

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

```math
{\displaystyle A^{-1}={\frac {1}{\det(A)}}{\widetilde {A}}}
```
**1次余因子行列**

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

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

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

**2次余因子行列**

>2次正方行列

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

>の余因子行列は

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

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

**3次余因子行列**

>3次正方行列

```math
{\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)余因子を並べたものは、

```math
{\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}},}
```

ここで

```math
{\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}}}
```

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

```math
{\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による実装**

```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)

```math
\left[\begin{matrix}4 & -1\\5 & 2\end{matrix}\right]
```
**出力結果**(b=aの各成分の余因子、すなわち２×２行列の行列式det(A)=ad−bcを求めた結果)

```math
\left[\begin{matrix}2 & -5\\1 & 4\end{matrix}\right]
```
**出力結果**(bの転置行列b.transpose())

```math
\left[\begin{matrix}2 & 1\\-5 & 4\end{matrix}\right]
```
**出力結果**(2行×2列の単位行列)

```math
\left[\begin{matrix}1 & 0\\0 & 1\end{matrix}\right]
```
**出力結果**(aの行列式a.det())…0でないから逆行列が存在する。

```math
13
```
**出力結果**(aの逆行列)

```math
\left[\begin{matrix}\frac{2}{13} & \frac{1}{13}\\- \frac{5}{13} & \frac{4}{13}\end{matrix}\right]
```
**出力結果**(合成)
①行列Aの逆行列$A^{-1}$を求める。

```math
\left[\begin{matrix}4 & -1\\5 & 2\end{matrix}\right]
```
②元行列Aの**余因子**、すなわち各成分の行列式ad−bcを求めた結果を転置する。

```math
\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}$が求まる。

```math
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]
```
③すなわち以下が成立する。

```math
\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]
```

```python
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)

```math
\left[\begin{matrix}1 & 5 & -4\\2 & 10 & -9\\-1 & -2 & 2\end{matrix}\right]
```
**出力結果**(b=aの各成分の余因子、すなわち２×２行列の行列式det(A)=ad−bcに符号を付けた結果)

```math
\left[\begin{matrix}2 & 5 & 6\\-2 & -2 & -3\\-5 & 1 & 0\end{matrix}\right]
```
**出力結果**(bの転置行列b.transpose())

```math
\left[\begin{matrix}2 & -2 & -5\\5 & -2 & 1\\6 & -3 & 0\end{matrix}\right]
```
**出力結果**(3行×3列の単位行列)

```math
\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]
```
**出力結果**(aの行列式a.det())…0でないから逆行列が存在する。

```math
3
```
**出力結果**(aの逆行列)

```math
\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}$を求める。

```math
\left[\begin{matrix}1 & 5 & -4\\2 & 10 & -9\\-1 & -2 & 2\end{matrix}\right]
```
②元行列Aの**余因子**、すなわち各成分の行列式ad−bcに符号を付けた結果を転置する。

```math
\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}$が求まる。

```math
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]
```
④すなわち以下が成立する。

```math
\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]
```
#連立１次方程式を解く
これでやっと以下の続きについて触れる準備が整いました。
[【Python演算処理】行列演算の基本①基本的四則演算と積](https://qiita.com/ochimusha01/items/b4a456b6ab12a5ea57f6)

そう、線形代数概念の中核はまさにこれとも。
[線形代数とは何か](https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%9E%8B%E6%96%B9%E7%A8%8B%E5%BC%8F%E7%B3%BB)

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

[Python (SymPy) による行列の計算](https://pianofisica.hatenablog.com/entry/2019/04/08/070020)

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

```math
~ 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
```

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

```math
\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}$（いまは逆行列は存在するものと仮定します）を使って以下の様に求めることが出来るのです。

```math
\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}}
```
###例題
３変数x、y、zの連立１次方程式

```math
~ ax+by+cz=j \\ ~ dx+ey+fz=k \\ ~ gx+hy+iz=l
```
これは以下の逆行列を求めるのに等しい。

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

**pythonによる実装**

```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)

```math
\left[\begin{matrix}a & b & c\\d & e & f\\g & h & i\end{matrix}\right]
```
**出力結果**(b=aの各成分の余因子、すなわち２×２行列の行列式det(A)=ad−bcに符号を付けた結果)

```math
\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())

```math
\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でない限り逆行列が存在する。

```math
a e i - a f h - b d i + b f g + c d h - c e g
```
**出力結果**(aの逆行列)

```math
\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}$を求める。

```math
\left[\begin{matrix}a & b & c\\d & e & f\\g & h & i\end{matrix}\right]
```
②元行列Aの**余因子**、すなわち各成分の行列式ad−bcに符号を付けた結果を転置する。

```math
\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}$が求まる。

```math
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]
```

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

```math
\displaystyle{~Y=\begin{pmatrix} j \\ k \\ l \end{pmatrix}}
```
を掛け合わせれば解が得られる：

```math
\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を使って求めた解と見比べてみる：

```python
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])))
```

```math
\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\}
```
確かに一致している。

そんな感じで以下続報…