埃尔米特矩阵的ARPACK的奇怪行为

问题描述:

我想从数值上获得一些厄密矩阵的基态能量(参见下面代码中这个矩阵的定义)并且用矩阵参数“相位” 。埃尔米特矩阵的ARPACK的奇怪行为

import scipy.sparse as sparse 
import scipy 
import numpy 
import numpy as np 
import math 
from scipy.special import binom 
import cmath 
import sympy 
import matplotlib.pyplot as plt 
import pylab 
from copy import * 
from numpy import linalg as LA 



M=5#DIMENSION OF THE MATRIX 


def tunneling(phase):#HAMILTONIAN MATRIX 
    Matrix_hop = [[0 for x in range(M)] for y in range(M)] 
    for i in range(M): 
      if i+1==M: 
       Matrix_hop[i][0] = -1.0 
       Matrix_hop[i][i-1] = -1.0 
     else: 
       Matrix_hop[i][i+1] = -1.0 
       Matrix_hop[i][i-1] = -1.0 
    Matrix_hop[0][M-1]=-1.0*cmath.exp(1j*phase) 
    Matrix_hop[M-1][0]=-1.0*cmath.exp(-1j*phase) 
    return Matrix_hop 

def eigen_system(H): 
    values, vectors = sparse.linalg.eigs(H,2,which='SR') #ARPACK!! 
    energy_ground = values[0] 
    return vectors[:,0], energy_ground 


init = 0.0 
points = 1000 
final_value = 2*math.pi 
steep = (final_value-init)/points 
list_values_phase = np.arange(init,final_value,steep) 
f1 = open("ground_state_energy.dat", "w") 
for i in list_values_phase: 
    phase = i 
    f1.write(str(phase)+" ") 
    H = np.asarray(tunneling(i)) 
    f1.write(str(np.real(eigen_system(H)[1]))+" ") 
    f1.write("\n") 
f1.close() 



datalist = pylab.loadtxt("ground_state_energy.dat") 
pylab.plot(datalist[:,0], datalist[:,1],label="ground state") 
pylab.legend() 
pylab.xlabel("phase") 
pylab.ylabel("Energy") 
pylab.show() 

我已经使用在Python ARPACK为埃尔米特矩阵,其使用sparse.linalg.eigs完成。问题在于,如下图所示,基态能量计算不准确,峰值很多,这意味着基态不能正确找到。实际上似乎对于这个峰值,ARPACK没有找到基态,并且它获得了第一个激发态。 enter image description here 这是一个非常奇怪的问题,因为我使用的这个矩阵(来自量子力学)可以通过使用Mathematica来解决,并且在Python中使用ARPACK不起作用。有人有一些想法,为什么会发生这种情况,如何解决?谢谢

我使用的SciPy的0.19.1

的最后一个版本在这个函数

def eigen_system(H): 
    values, vectors = sparse.linalg.eigs(H,2,which='SR') #ARPACK!! 
    energy_ground = values[0] 
    return vectors[:,0], energy_ground 

找到第特征值,然后拿第一。函数eigs不保证它发现的特征值是有序的,有时第一个不是最小的。

而不是找到最小的两个,为什么不找到最小的?

values, vectors = sparse.linalg.eigs(H, 1, which='SR') # ARPACK!! 

当我做出的改变,我得到这个情节:

plot

+0

哇,我没有注意到这件事......非常感谢你! – Joe