Je veux obtenir numériquement l'énergie de l'état fondamental de certaines matrices hermitiennes (voir la définition de cette matrice dans le code suivant) et la représenter en termes de "phase" matrice-parametre .Comportement étrange d'ARPACK pour la matrice hermitienne
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()
J'ai utilisé le ARPACK en Python pour les matrices hermitiennes, qui se fait à l'aide sparse.linalg.eigs
. Le problème est que, comme vous pouvez le voir sur la figure suivante, l'énergie de l'état fondamental n'est pas correctement calculée, il y a beaucoup de pics, ce qui signifie que l'état fondamental n'est pas correctement trouvé. En fait, semble que pour ces pics, ARPACK ne trouve pas l'état fondamental et obtient le premier état excité. C'est un problème très étrange, puisque cette matrice que j'utilise (qui vient de la mécanique quantique) peut être résolue de manière analogique aussi bien qu'en utilisant Mathematica, et avec ARPACK en Python ne fonctionne pas. Quelqu'un a une idée de pourquoi cela se produit et comment peut être résolu ?? Merci
J'utilise la dernière version de scipy 0.19.1
wow, je n'a pas remarqué cette chose ... merci beaucoup !! – Joe