私はPythonで複雑な行列を指数化しようとしていますが、何か問題があります。私はscipy.linalg.expm
機能を使用しています、と私は、次のコードをしようとすると、かなり奇妙なエラーメッセージを持っています:Pythonでの行列の指数化
import numpy as np
from scipy import linalg
hamiltonian = np.mat('[1,0,0,0;0,-1,0,0;0,0,-1,0;0,0,0,1]')
# This works
t_list = np.linspace(0,1,10)
unitary = [linalg.expm(-(1j)*t*hamiltonian) for t in t_list]
# This doesn't
t_list = np.linspace(0,10,100)
unitary = [linalg.expm(-(1j)*t*hamiltonian) for t in t_list]
第二の実験が実行されたエラーは次のとおりです。
This works!
Traceback (most recent call last):
File "matrix_exp.py", line 11, in <module>
unitary_t = [linalg.expm(-1*t*(1j)*hamiltonian) for t in t_list]
File "/usr/lib/python2.7/dist-packages/scipy/linalg/matfuncs.py", line 105, in expm
return scipy.sparse.linalg.expm(A)
File "/usr/lib/python2.7/dist- packages/scipy/sparse/linalg/matfuncs.py", line 344, in expm
X = _fragment_2_1(X, A, s)
File "/usr/lib/python2.7/dist- packages/scipy/sparse/linalg/matfuncs.py", line 462, in _fragment_2_1
X[k, k] = exp_diag[k]
TypeError: only length-1 arrays can be converted to Python scalars
これは本当にそうです私が変更したすべてがt
の範囲だったので奇妙です。ハミルトニアンは対角であるからでしょうか?一般的に、ハミルトニアンはそうではありませんが、私はそれが対角線のものでも働きたいと思っています。私は実際にexpm
の仕組みを知らないので、どんな助けでも大歓迎です。
リストの理解の代わりにforループに計算を移動してみてください。それで、あなたは少なくとも、それが失敗している値を見つけ出すことができます。 – Elliot
プログラムが失敗する最初の番号は 't = 2.12121212121'です。完全に任意のようです...プログラムは 'a = 0 'の' t = 2.ax'では動作しません。そして 't = 3.x'では全く動作しません... – anar