【发布时间】:2016-05-30 21:37:07
【问题描述】:
我正在尝试在 Python 中对一个复杂的矩阵求幂,但遇到了一些麻烦。我正在使用scipy.linalg.expm 函数,当我尝试以下代码时出现了一个相当奇怪的错误消息:
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 循环而不是列表理解。然后你至少可以弄清楚它失败的 t 值。
-
程序失败的第一个数字是
t=2.12121212121。这似乎完全是任意的......该程序不适用于t=2.ax,其中a > 0。而且它根本不适用于t=3.x...
标签: python numpy scipy linear-algebra