scipy.linalg.expm hermitian 不是特殊酉
scipy.linalg.expm of hermitian is not special unitary
如果我有一个(真实的)厄密矩阵,例如
H = matrix([[-2. , 0.5, 0.5, 0. ],
[ 0.5, 2. , 0. , 0.5],
[ 0.5, 0. , 0. , 0.5],
[ 0. , 0.5, 0.5, 0. ]])
(这个矩阵是厄密矩阵;它是与外场耦合的2自旋伊辛链的哈密顿量。)
那么存在一个特殊的正交变换O
(保留矩阵的列向量和行向量的长度)s.t.
H = O.transpose() @ D @ O
其中 D
是对角线。对于矩阵指数,这导致
T = expm(1j * H) = O.transpose() @ expm(1j * D) @ O
因此 T
的所有 column/row 向量的长度必须为 1
。
如果我使用 scipy.linalg.expm
这 属性 是违反的:
In [1]: import numpy as np
In [2]: from numpy import matrix
In [3]: from scipy.linalg import expm
In [4]: H = matrix([[-2. , 0.5, 0.5, 0. ],
...: [ 0.5, 2. , 0. , 0.5],
...: [ 0.5, 0. , 0. , 0.5],
...: [ 0. , 0.5, 0.5, 0. ]])
In [5]: T = expm(1j * H)
In [6]: np.sum(np.abs(T[0]))
Out[6]: 1.6099093263121051
In [7]: np.sum(np.abs(T[1]))
Out[7]: 1.609909326312105
In [8]: np.sum(np.abs(T[2]))
Out[8]: 1.7770244703003222
In [9]: np.sum(np.abs(T[3]))
Out[9]: 1.7770244703003222
这是 expm
中的错误还是我在这里犯了错误?
您使用了错误的规范。使用
np.sqrt( np.sum( np.abs(T[0])**2 ) )
或者更短的方式
np.linalg.norm( T[0] )
如果我有一个(真实的)厄密矩阵,例如
H = matrix([[-2. , 0.5, 0.5, 0. ],
[ 0.5, 2. , 0. , 0.5],
[ 0.5, 0. , 0. , 0.5],
[ 0. , 0.5, 0.5, 0. ]])
(这个矩阵是厄密矩阵;它是与外场耦合的2自旋伊辛链的哈密顿量。)
那么存在一个特殊的正交变换O
(保留矩阵的列向量和行向量的长度)s.t.
H = O.transpose() @ D @ O
其中 D
是对角线。对于矩阵指数,这导致
T = expm(1j * H) = O.transpose() @ expm(1j * D) @ O
因此 T
的所有 column/row 向量的长度必须为 1
。
如果我使用 scipy.linalg.expm
这 属性 是违反的:
In [1]: import numpy as np
In [2]: from numpy import matrix
In [3]: from scipy.linalg import expm
In [4]: H = matrix([[-2. , 0.5, 0.5, 0. ],
...: [ 0.5, 2. , 0. , 0.5],
...: [ 0.5, 0. , 0. , 0.5],
...: [ 0. , 0.5, 0.5, 0. ]])
In [5]: T = expm(1j * H)
In [6]: np.sum(np.abs(T[0]))
Out[6]: 1.6099093263121051
In [7]: np.sum(np.abs(T[1]))
Out[7]: 1.609909326312105
In [8]: np.sum(np.abs(T[2]))
Out[8]: 1.7770244703003222
In [9]: np.sum(np.abs(T[3]))
Out[9]: 1.7770244703003222
这是 expm
中的错误还是我在这里犯了错误?
您使用了错误的规范。使用
np.sqrt( np.sum( np.abs(T[0])**2 ) )
或者更短的方式
np.linalg.norm( T[0] )