埃尔米特矩阵的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没有找到基态,并且它获得了第一个激发态。 这是一个非常奇怪的问题,因为我使用的这个矩阵(来自量子力学)可以通过使用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!!
当我做出的改变,我得到这个情节:
哇,我没有注意到这件事......非常感谢你! – Joe