読者です 読者をやめる 読者になる 読者になる

ますはらの日記(?)

無線通信の勉強をしてる陸上部の学生のぼやき(?)

Pythonで数値解析〜行列に関するものに触ってみた〜

Python 数値解析

どうも。

昨日は部活の疲れからか、ほとんど勉強できずに寝落ちしてしまったのでブログを書くことができませんでした(⌒-⌒; )

なので、今日はsympyで可能となる(というより便利になる?)行列演算に関する関数を少しいじってみました!



参考にしたwebページはこちらになるので是非参考にしてみてください!

こちら → Matrices — SymPy 0.7.6.1 documentation


※このページは英語なので英語が苦手な人は用心してください(笑)


さて、いろいろ参考ページなどを読んでいくと結構便利なものが多そうでした。例えば、行列の中の行ベクトルや列ベクトルを消してみたり、逆に追加してみたりできる関数もありますし、単純に行列の積を求めたり行列の累乗を求めたりするのも可能です(しかも、-1乗とすると(元の行列が正則ならば)逆行列を求めてくれます)。そんな様々な関数の中で僕が気に入った(すごいなと思った)関数をいくつか例を挙げながら紹介したいと思います( ̄▽ ̄)

今回は次の行列を例に取り扱います。
 
M=\Biggl(
\begin{array}{ccc}
0 & -1 & -2 \\
2 & 3 & 2 \\
1 & 1 & 3 \\
\end{array} 
\Biggr)


行列式を求める関数det()
この関数は与えた行列の行列式を返してくれる関数です。
早速、例の行列を使って試してみました。

$python3
>>>from sympy import *
>>>M = Matrix([[0,-1,-2],[2,3,2],[1,1,3]])
>>>M.det()
6

これは計算してみるときちんと答えが6になります。


・行列を行基本変形する関数rref()
この関数は与えた行列を行基本変形して階段行列を求めてくれる関数です。それでは、先ほどの続きをしているとして例を書いていきます。

>>>M.rref()
(Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]), [0, 1, 2])

この行基本変形した後の行列の側に書いてある[0, 1, 2]に関しては元の行列(N×N行列としときます)の列を0〜N-1(行列の1列目〜N列目に対応)と、左側から順に割り当てたうち、0番目、1番目、2番目(つまり、1〜3列目)が階段行列の階段の段差の位置となることを指している。


・行列の固有値を求めてくれる関数eigenvals()
この関数は与えた行列の固有値を重複度と共に求めてくれる関数です。

>>>M.eigenvals()
{1: 1, 2: 1, 3: 1}

出力の中で{x:y, … }とあれば、xが固有値を、yが固有値の重複度を表している。


・行列の固有ベクトルを求めてくれる関数eigenvects()
この関数は与えた行列の固有ベクトル固有値と共に求めてくれる関数です。

>>>M.eigenvects()
[(1, 1, [Matrix([
[-1],
[ 1],
[ 0]])]), (2, 1, [Matrix([
[-1],
[ 0],
[ 1]])]), (3, 1, [Matrix([
[-1],
[ 1],
[ 1]])])]

出力は[(x,y,[Matrix{[…と表されるが、xは固有値を、yはそのx(つまり固有値)に対応する固有ベクトルの個数を、以下のMatrixの部分が固有ベクトルを表している。


・行列を対角化する際に用いる行列を求めてくれる関数diagonalize()
この関数は与えた行列Mが正則であれば M = PDP^{-1}を満たすような正則行列Pと対角行列Dを求めてくれる関数です。

>>>P, D = M.diagonalize()
>>>P #正則行列
Matrix([
[-1, -1, -1],
[ 1,  0,  1],
[ 0,  1,  1]])
>>>D #対角行列
Matrix([
[1, 0, 0],
[0, 2, 0],
[0, 0, 3]])

必ず、正則行列→対角行列の順番で表示or代入されるので、そこは忘れない方がいいと思います。


以上、少しではありますが関数を扱って実際に行列に対する操作をしてみました。手計算じゃ絶対に嫌な部分をいろいろとサポートしていて、かつ、分かりやすい、使いやすい、簡単!
これはかなり便利でしょう!線形代数の演習の解答を確認するためにPythonを用いるのは結構アリじゃないかな?と思ってます(笑)

たくさんいじってませんが、きっと固有値に関しては固有値複素数になった場合も対応してるんじゃないかと思ってます。しかし、行列の要素は実数だけでなく複素数にも対応しているのか少し疑問に思っています。
今日は長々と書いてしまい、やる気が起きないので明日など時間があるときに試してみたいと思います( ̄ー ̄)


それでは、また。