# 逆行列を求める方法

- `np.linalg` に `inv` という関数がある


```python
import numpy as np
```


```python
a = np.array([[3, 1, 1], [1, 2, 1], [0, -1, 1]])
```


```python
np.linalg.inv(a)
```




    array([[ 0.42857143, -0.28571429, -0.14285714],
           [-0.14285714,  0.42857143, -0.28571429],
           [-0.14285714,  0.42857143,  0.71428571]])



# ひとつの連立方程式を解く方法

下記の連立方程式を解くには逆行列を求めるよりも `solve` 関数を使うほうが良い。(高速かつ数値安定的なアルゴリズムを背後で利用しているため)

\begin{equation}
\begin{pmatrix}
3& 1& 1\\
1& 2& 1\\
0& -1& 1
\end{pmatrix}
\begin{pmatrix}
x \\ y\\ z
\end{pmatrix}
=
\begin{pmatrix}
1 \\ 2 \\ 3
\end{pmatrix}
\end{equation}


```python
b = np.array([[3, 1, 1], [1, 2, 1], [0, -1, 1]])
```


```python
c = np.array([1, 2, 3])
```


```python
np.linalg.solve(b, c)
```




    array([-0.57142857, -0.14285714,  2.85714286])



# 同じ係数行列からなく複数の連立方程式を解く方法

\begin{equation}
Ax=b_1, Ax=b_2, \dots, Ax=b_m
\end{equation}
となる連立方程式があったときは、 $A^{-1}$ を計算することで、

\begin{equation}
A^{-1}b_1, A^{-1}b_2, \dots, A^{-1}b_m
\end{equation}

と解が計算できる。しかし、もっと良い方法がある。

## LU分解

$A=PLU$ の形に分解することで連立方程式を高速かつ数値安定的に解くことができる。

ここで $L$ は下三角行列で対角成分が $1$ となるもの、 $U$ は上三角行列、 $P$ は各行に $1$ となる成分がただひとつだけある行列でそのほかの成分は $0$(置換行列)

\begin{equation}
PLUx = b
\end{equation}

という連立方程式は次の3つの方程式を逐次的に解くことで解 $x$ を求めることができる。

\begin{align}
Uz &= b \\
Ly &= z \\
Px &= y
\end{align}


```python
# scipy を利用
from scipy import linalg
```


```python
a = np.array([[3, 1, 1], [1, 2, 1], [0, -1, 1]])
b = np.array([1, 2, 3])
```


```python
lu, p = linalg.lu_factor(a)
linalg.lu_solve((lu, p), b)
```




    array([-0.57142857, -0.14285714,  2.85714286])




```python

```

3c7d876a06b6931b103f45efa16f6673a3092cdc
ipynb
Jupyter Notebook
notebooks/linear_equations.ipynb
515hikaru/essence-of-machine-learning
7f46be9316d227626f27a06deac64b43191cb4d7
MIT
notebooks/linear_equations.ipynb
515hikaru/essence-of-machine-learning
7f46be9316d227626f27a06deac64b43191cb4d7
MIT
2018-10-04T14:33:15.000Z
2018-10-09T13:40:35.000Z
notebooks/linear_equations.ipynb
515hikaru/essence-of-machine-learning
7f46be9316d227626f27a06deac64b43191cb4d7
MIT
Qwen/Qwen-72B
1. YES
2. YES