时间演化:scipy.linalg.expm_multiply()还是与np.linalg.eigh()对角化?

2024-05-14 21:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我感兴趣的是用给定的矩阵H计算向量v(初始状态)的时间演化

有两种方法可以做到这一点:

  • 对于矩阵指数exp(-itH),其中H是矩阵(哈密顿量),t是演化时间,i是虚数-->;与scipy.sparse.linalg.expm_multiply()一起使用

  • 对角化H,并在该基(量子力学的能量基)中表示v(初始向量)

    ——>;v=和(特征向量i*ci),
    本征向量t_i=H的本征向量,c_i=复共轭(本征向量t_i)和v的标量积

    ——>;v的时间演化:v_演化=和(exp(-i*t*本征值_i)*本征向量_i*c_i),
    本征值i=H的本征值

然而,当我实现这两种方法时,对于演化状态v_演化,我不会得到相同的结果。我做错了什么


    H = np.array([[-4., -2., -2.,  0., -2.,  0.,  0., -2.],
    [-2.,  0.,  0., -2.,  0., -2., -2.,  0.],
    [-2.,  0.,  0., -2.,  0., -2., -2.,  0.],
    [ 0., -2., -2.,  0., -2.,  0.,  0., -2.],
    [-2.,  0.,  0., -2.,  0., -2., -2.,  0.],
    [ 0., -2., -2.,  0., -2.,  4.,  0., -2.],
    [ 0., -2., -2.,  0., -2.,  0.,  0., -2.],
    [-2.,  0.,  0., -2.,  0., -2., -2.,  0.]])
    v = np.array([1,0,0,0,0,0,0,0])
    t = 100
    
    #method 1: scipy.sparse.linalg.expm_multiply
    
    evolved_1 = scipy.sparse.linalg.expm_multiply(-(1j)*t*H,v)
    
    
    
    
    #mehtod 2: exact diagonalization
    
    eigenval,eigenvect = np.linalg.eigh(H)
    
    evolved_2 = 0
    for i in range(len(eigenval)):
        evolved_2 += np.exp(-1j*eigenval[i]*t)*eigenvect[i]*np.vdot(eigenvect[i],v)
    
    
    
    
    
    print('evolved state method_1: \n',evolved_1, '\n normalization:',np.vdot(evolved_1,evolved_1))
    print('\n')
    print('evolved state method_2: \n',evolved_2, '\n normalization:',np.vdot(evolved_2,evolved_2))



Tags: gtnp时间矩阵scipy向量methodmultiply

热门问题