# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# # 逆行列を求める方法
#
# - `np.linalg` に `inv` という関数がある

import numpy as np

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

np.linalg.inv(a)

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

# 下記の連立方程式を解くには逆行列を求めるよりも `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}

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

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

np.linalg.solve(b, c)

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

# \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}

# scipy を利用
from scipy import linalg

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

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



StarcoderdataJupyterScriptsDedupFiltered