行列力学用・Python3でのややマニアックな行列演算まとめ

量子力学の計算(行列力学)をするとき、これまではMATLABを使っていたんだけど、何かとPythonのほうが応用がききそうなので乗り換えつつある。(あと何と言ってもMATLABは高い。。。)

MATLABに実装されているたいていの処理はPythonでも実行可能なのだが、やはり少し勝手が違う。他の技術ブログとかではまとまってなかったところに限って、(半分自分のために)まとめておこうと思う。

【随時更新予定】

行列の積

Pythonでは、+, -, *, /の四則演算子(記号で演算が済むもの)は、対応する要素同士の演算である。つまり、MATLABにおけるA.*BPythonでのA*Bが対応している。

ゆえに、内積numpy.dot(A, B)で、外積numpy.cross(A, B)で計算する。

ハミルトニアンの次元を拡張するとき等に使う「クロネッカー積」は、MATLABではkron(A, B)で、Pythonではnumpy.kron(A, B)である。

行列の複素共役転置

MATLABでは、行列Aに対してA'とすれば転置行列を返してくれる。さらに、行列要素に複素数が入っている場合は暗黙のうちに複素共役をとってくれる。

一方Pythonは、転置行列を返すメソッド(hoge.T)と、複素共役をとってくれる関数(numpy.conjugate(hoge))が別々に定義されている。したがって、

# MATLABでは
A'
# Pythonでは
numpy.conjugate(A.T)

が等価。

行列の指数

[tex:{ \displaystyle

e^{-iHt} }]

のように、ハミルトニアンHで時間発展する波動関数(行列)への作用(演算子)を計算したいときがあって、 こういうときには、『行列の指数』を計算しないといけない。

MATLABではexpm(H)という関数で済むのだけど、Pythonの場合はScipyで定義されているexpmを使わないといけないので、次のようにする。

import scipy.expm
# あるいは、
# from scipy import expm

scipy.expm(A)

「行列の指数」で探すと、他にもNumpyの中のexpm1()とかmatrix_power()とか 似たようなものがいっぱいあるが、ちゃんとMATLABexpmと同じ結果を返す関数はコレだった。 探し出すのにそこそこ苦労したので他の人の参考になれば嬉しい。

ちなみに、MATLABでは「3i」のようにすると暗黙のうちにi虚数単位として複素数のデータ型で計算してくれるが、Pythonではiではなくjを使う(特に宣言せずとも虚数単位と解釈してくれるのは同じ)ので少し注意が必要。

その他

MATLABPythonで置換しようという動きはおそらく数値計算をしている人にとっては当然の発想であるので、 必然的に両者を比較したサイトは多い。

中でも使えそうなサイトを列挙しておくので、参考にしてほしい。

MATLABユーザー向け

Pythonにおける行列操作・演算の基本について