-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathspectral_density_GUE.py
More file actions
58 lines (47 loc) · 2.26 KB
/
spectral_density_GUE.py
File metadata and controls
58 lines (47 loc) · 2.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# Calcul de la distribution des valeurs propres des matrices de l'ensemble unitaire gaussien (GUE).
# Comparaison du resultat avec la loi du demi-cercle de Wigner.
import numpy as np
import matplotlib.pyplot as plt
def W_SCircle(x): # Wigner semicircle law
n = np.size(x)
rez = np.zeros(n)
for i in range(n):
if 4-x[i]**2 >= 0:
rez[i] = np.sqrt(4 - x[i]**2)/(2*np.pi)
return rez
def dag(m):
return np.transpose(np.conjugate(m))
N = 500 # nombre de tirages
m = 20 # taille de la matrice
evals = np.array([]) # contiendra N*m elements (valeurs propres des matrices aleatoires de taille mxm sur N tirages)
for i in range(N):
# cas GUE
g = np.random.normal(0, 1./np.sqrt(2.), (m,m))+1j*np.random.normal(0, 1./np.sqrt(2.), (m,m))
h = (g + dag(g))/np.sqrt(2.) # h matrice hermitienne
# cas GOE
#g = np.random.normal(0,1,(m,m))
#h = (g + g.T)/np.sqrt(2.) # h reelle symetrique (cas GOE)
evals = np.append(evals, np.linalg.eigvalsh(h)) # valeurs propres de h
# Mise a l'echelle du spectre : eval <- eval/sqrt(n*sigma²) ou
# n: taille de la matrice et sigma: variance des elements non diagonaux de la matrice
evals = np.sort(np.real(evals))
evals = evals/np.sqrt(m)
x = np.linspace(-3, 3, num=200, endpoint=True)
proba = W_SCircle(x)
plt.figure(1)
plt.plot(x, proba, 'r-', linewidth=2, label='Wigner semicircle law')
plt.hist(evals, bins=35, range=(-2.3, 2.3), density=True, facecolor='green', alpha=0.3, edgecolor = 'white')
plt.legend(fontsize=13, loc='upper right')
plt.xlabel(r'$\lambda/\sqrt{n \sigma^2}$', size=14)
plt.ylabel(r'$\langle \rho \rangle$', size=20)
plt.ylim(ymax=0.37)
plt.xlim(-2.5, 2.5)
plt.title('Spectral density of GUE (n=%s, %s samples)'%(m, N), size=15)
plt.tight_layout()
plt.show()
# On obtient le même resultat pour le tirage d'une seule matrice h (N=1) pourvu que m soit grand.
# Une seule realisation d'une grande matrice est representative de l'ensemble,
# parce que les fluctuations diminuent avec la taille de la matrice.
# On observe la convergence vers la loi du demi-cercle egalement pour GOE et GSE.
#
# En pratique, il vaut mieux travailler avec des matrices pas trop grandes et en faire plusieurs tirages.