added codes
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
import scipy as scipy
|
||||
import scipy.special as special
|
||||
import numpy as np
|
||||
import itertools as it
|
||||
from pandas import *
|
||||
import matplotlib.pylab as plt
|
||||
from scipy.integrate import ode
|
||||
import time
|
||||
|
||||
def unique_rows(a):
|
||||
a = np.ascontiguousarray(a)
|
||||
unique_a = np.unique(a.view([('', a.dtype)]*a.shape[1]))
|
||||
return unique_a.view(a.dtype).reshape((unique_a.shape[0], a.shape[1]))
|
||||
|
||||
def hamiltonian(n_pairs,n_basis,delta,g):
|
||||
"""
|
||||
n_pairs - Number of electron pairs
|
||||
n_basis - Number of spacial basis states
|
||||
"""
|
||||
n_SD = int(special.binom(n_basis,n_pairs))
|
||||
print("n = ", n_SD)
|
||||
H_mat = np.zeros((n_SD,n_SD))
|
||||
S = stateMatrix(n_pairs,n_basis)
|
||||
for row in range(n_SD):
|
||||
bra = S[row,:]
|
||||
for col in range(n_SD):
|
||||
ket = S[col,:]
|
||||
if np.sum(np.equal(bra,ket)) == bra.shape:
|
||||
H_mat[row,col] += 2*delta*np.sum(bra - 1) - 0.5*g*n_pairs
|
||||
if n_pairs - np.intersect1d(bra,ket).shape[0] == 1:
|
||||
H_mat[row,col] += -0.5*g
|
||||
return(H_mat)
|
||||
|
||||
|
||||
def stateMatrix(n_pairs,n_basis):
|
||||
L = []
|
||||
states = range(1,n_basis+1)
|
||||
for perm in it.permutations(states,n_pairs):
|
||||
L.append(perm)
|
||||
L = np.array(L)
|
||||
L.sort(axis=1)
|
||||
L = unique_rows(L)
|
||||
return(L)
|
||||
|
||||
|
||||
|
||||
g = 0.5
|
||||
|
||||
H = hamiltonian(4,8,1,g)
|
||||
print("Hamiltonian calculated")
|
||||
|
||||
A = H
|
||||
x = np.zeros(A.shape[0])
|
||||
x[0] = 1
|
||||
|
||||
def f(t,x):
|
||||
return(-(x.T@x)*A@x + (x.T@A@x)*x)
|
||||
|
||||
|
||||
|
||||
r = ode(f)
|
||||
r.set_initial_value(x,0) #langsos algorithm
|
||||
|
||||
t1=10
|
||||
dt=0.1
|
||||
start = time.time()
|
||||
while r.successful() and r.t < t1:
|
||||
r.integrate(r.t+dt)
|
||||
end = time.time()
|
||||
|
||||
|
||||
|
||||
print("RNN eig: ",r.y.T@A@r.y/(r.y.T@r.y))
|
||||
print("calculation time with RNN: ", end - start)
|
||||
|
||||
|
||||
start = time.time()
|
||||
eigvals, eigvecs = np.linalg.eig(H)
|
||||
end = time.time()
|
||||
print("numpy eig: ",np.sort(eigvals))
|
||||
print("calculation time with numpy eig: ", end - start)
|
||||
Reference in New Issue
Block a user