「行列式」は、Pythonで簡単に計算することができます。
本記事では、Pythonを使用した行列式の計算方法について、詳しくご説明します。
行列式
行列式(determinant)とは、正方行列に定義される指標で、線形変換による空間の拡大率を表しています。
2次正方行列に対しては、下式のようにたすき掛け(サラスの方法)で計算されます。
\(\begin{vmatrix} ab \\ cd \end{vmatrix}=ad-bc\)
また任意の正方行列の行列式に対し、その転置行列の行列式は等しくなります。
scipy.linalg.det()
SciPyのscipy.linalg.det()を使用すると、引数に指定した行列の行列式を計算することができます。
#input
import numpy as np
from scipy.linalg import det
x = np.array([[ 9, 7],
[-2, 5]])
tx = x.T
det_x = det(x)
det_tx = det(tx)
print("xの行列式 :{}".format(det_x))
print("転置xの行列式:{}".format(det_tx))
#output
xの行列式 :59.0
転置xの行列式:59.0
手計算でも容易に計算可能な、3次正方行列でも確認してみます。
#input
import numpy as np
from scipy.linalg import det
x = np.array([[ 3, -9, 5],
[-2, 5, -6],
[ 7, -2, 1]])
tx = x.T
det_x = det(x)
det_tx = det(tx)
print("xの行列式 :{}".format(det_x))
print("転置xの行列式:{}".format(det_tx))
#output
xの行列式 :184.0
転置xの行列式:184.0
高次元行列の行列式
次に、NumPyのnumpy.random.randint()関数を使用して、高次元行列をランダムに作成し、その行列式を計算してみます。
#input
import numpy as np
from scipy.linalg import det
# 乱数シードを1に設定
np.random.seed(1)
# 5次元正方行列の作成(数値は-99~99)
x = np.random.randint(-99, 100, (5, 5))
print(x)
det_x = det(x)
print("{:.3e}".format(det_x))
#output
[[-62 41 -27 38 34]
[-20 93 45 30 -28]
[ 35 -74 79 -79 2]
[ 47 40 57 58 43]
[-49 -31 -3 -13 42]]
4.250e+08
行列式の値は、その行列が線形独立の場合には上記のように、0以外の値となりますが、線形従属の場合、0を取ります。
以下にランダムな3次正方行列を100万個生成し、そのうち何個が線形従属となるか確認してみます。
#input
import numpy as np
from scipy.linalg import det
# 乱数シードを1に設定
np.random.seed(1)
# jの初期値
j = 0
# 3次元正方行列を100万個作成(数値は-99~99)
for i in range(10**5):
x = np.random.randint(-99, 100, (3, 3))
if det(x) ==0:
j += 1
print("線形従属の個数:{}".format(j))
#output
線形従属の個数:2
指定した数値範囲や乱数シードによりますが、上記条件の場合、線形従属となる行列は、100万個のうち、たった2個であることが検証できました。
まとめ
この記事では、Pythonを使用した行列式の計算方法について、ご説明しました。
本記事を参考に、ぜひ試してみて下さい。
参考
Python学習用おすすめ教材
Pythonの基本を学びたい方向け
統計学基礎を学びたい方向け
Pythonの統計解析を学びたい方向け
おすすめプログラミングスクール
Pythonをはじめ、プログラミングを学ぶなら、TechAcademy(テックアカデミー)がおすすめです。
私も入っていますが、好きな時間に気軽にオンラインで学べますので、何より楽しいです。
現役エンジニアからマンツーマンで学べるので、一人では中々続かない人にも、向いていると思います。
無料体験ができますので、まずは試してみてください!