2017-08-30 1 views
0

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é. enter image description here 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

Répondre

2

Dans cette fonction

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

vous trouverez les premiers deux valeurs propres, puis prendre la première. La fonction eigs ne garantit pas que les valeurs propres qu'elle trouve sont ordonnées, et parfois la première n'est pas la plus petite.

Au lieu de trouver les deux plus petits, pourquoi ne pas simplement trouver le plus petit?

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

Quand je fais ce changement, je reçois ce complot:

plot

+0

wow, je n'a pas remarqué cette chose ... merci beaucoup !! – Joe