【Python入門】行列の対角化|対角化関数を実装する

行列の対角化|対角化関数を実装する_アイキャッチ プログラミング

※ 当サイトはアフィリエイト広告を利用しています。

levtech-ad
スポンサーリンク

行列の対角化は、Pythonで簡単に実装することができます。

本記事では、Pythonを使用した行列の対角化関数の実装方法について、詳しくご説明します。

こんな人に読んでほしい
  • Python初心者の人
  • Pythonを使用した行列の対角化関数の実装方法について学びたい人
levtech-ad

行列の対角化

行列の対角化(diagonalization)とは、線形変換により、正方行列を対角行列に変形することを言います。

ある行列\(A\)に対し、対角化行列\(P\)とその逆行列\(P^{-1}\)を用いると、固有値を対角成分に持つ行列(対角行列)\(D\)が下式のように得られます。

\(P^{-1}AP=D\)

diagonalization()

NumPyのnumpy.linalg.eig()を使用して、固有値を対角成分に持つ行列(対角行列)を出力する、diagonalization()関数を実装してみます。

#input
import numpy as np

def diagonalization(x):
    eig = np.linalg.eig(x)
    e = np.diag(eig[0])
    p = eig[1]
    return e, p

上記実装した関数を使用して、固有値を対角成分に持つ行列(対角行列)を出力してみます。

#input
np.random.seed(7)
np.set_printoptions(precision=3)

A = np.random.randint(0,10,(2,2))
print("行列A:\n{}\n".format(A))

D = diagonalization(A)

d = D[0]
p = D[1]

print("D:\n{}\n".format(d))
print("P:\n{}".format(p))
#output
行列A:
[[4 9]
 [6 3]]

D:
[[10.865  0.   ]
 [ 0.    -3.865]]

P:
[[ 0.795 -0.753]
 [ 0.607  0.658]]

\(P\)の逆行列\(P^{-1}\)を使用して、上でご説明した算式が成り立つか確認してみます。

#input
p_inv = np.linalg.inv(p)

D_ = p_inv @ A @ p

print("D(確認):\n{}".format(D_))
#output
D(確認):
[[ 1.087e+01 -1.776e-15]
 [-4.441e-16 -3.865e+00]]

誤差はありますが、\(D\)とほぼ等しい結果となりました。

トレースの確認

行列\(A\)のトレースと対角行列\(D\)のトレースは等しくなります。

NumPyを使用して、上記確認した例をご紹介します。

#input
import numpy as np

np.random.seed(7)

A = np.random.randint(0,10,(7,7))
print("行列A:\n{}\n".format(A))

D = diagonalization(A)
d = D[0]

A_tr = np.trace(A)
D_tr = np.trace(d)
print("行列Aのトレース:\n{}\n".format(A_tr))
print("行列Dのトレース:\n{}".format(D_tr))
#output
行列A:
[[4 9 6 3 3 7 7]
 [9 7 8 9 8 7 6]
 [4 0 7 0 7 6 3]
 [5 8 8 7 5 0 0]
 [2 8 9 6 4 9 7]
 [3 3 8 3 0 1 0]
 [0 6 7 7 9 3 0]]

行列Aのトレース:
30

行列Dのトレース:
(30.00000000000003+0j)

行列式の確認

行列\(A\)の行列式と対角行列\(D\)の行列式も等しくなります。

NumPyを使用した確認した例をご紹介します。

#input
import numpy as np

np.random.seed(7)

A = np.random.randint(0,10,(7,7))
print("行列A:\n{}\n".format(A))
det_A = np.linalg.det(A)

D = diagonalization(A)
d = D[0]
det_d = np.linalg.det(d)

print("行列Aの行列式:\n{}\n".format(det_A))
print("行列Dの行列式:\n{}".format(det_d))
#output
行列Aの行列式:
75729.99999999972

行列Dの行列式:
(75730.00000000041+0j)

まとめ

この記事では、Pythonを使用した行列の対角化関数の実装方法について、ご説明しました。

本記事を参考に、ぜひ試してみて下さい。

参考

Python学習用おすすめ教材

Pythonの基本を学びたい方向け

統計学基礎を学びたい方向け

Pythonの統計解析を学びたい方向け

おすすめプログラミングスクール

Pythonをはじめ、プログラミングを学ぶなら、TechAcademy(テックアカデミー)がおすすめです。

私も入っていますが、好きな時間に気軽にオンラインで学べますので、何より楽しいです。

現役エンジニアからマンツーマンで学べるので、一人では中々続かない人にも、向いていると思います。

無料体験ができますので、まずは試してみてください!

\まずは無料体験!/
スポンサーリンク
タイトルとURLをコピーしました