Skip to content

Commit 873b9cb

Browse files
committed
Added joint PDFs of eigenvalues
1 parent de32c1d commit 873b9cb

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed
File renamed without changes.

src/GaussianEnsembleDistributions.jl

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# Generates joint probability density functions (jpdfs) of eigenvalues
2+
# of finite-dimensional random matrices that are distributed according
3+
# to the classical Gaussian random matrix ensembles
4+
#
5+
# The notation follows closely that in:
6+
#
7+
# Ioana Dumitriu and Alan Edelman, "Matrix Models for Beta Ensembles"
8+
# Journal of Mathematical Physics, vol. 43 no. 11 (2002), pp. 5830--5547
9+
# doi: 10.1063/1.1507823
10+
# arXiv: math-ph/0206043
11+
12+
###
13+
# Joint probability density functions
14+
#
15+
16+
#Calculate Vandermonde determinant term
17+
function VandermondeDeterminant{Eigenvalue<:FloatingPoint}(lambda :: Vector{Eigenvalue}, beta :: Unsigned)
18+
n = length(lambda)
19+
Vandermonde = 1.0
20+
for j=1:n
21+
for i=1:j-1
22+
Vandermonde *= abs(lambda[i] - lambda[j])^beta
23+
end
24+
end
25+
return Vandermonde
26+
end
27+
28+
function HermiteJPDF{Eigenvalue<:FloatingPoint}(lambda :: Vector{Eigenvalue}, beta :: Unsigned)
29+
n = length(lambda)
30+
#Calculate normalization constant
31+
c = (2pi)^(-n/2)
32+
for j=1:n
33+
c *= gamma(1 + beta/2)/gamma(1 + beta*j/2)
34+
end
35+
36+
#Calculate argument of exponential
37+
Energy = sum(lambda.^2/2)
38+
39+
return c * VandermondeDeterminant(lambda, beta) * exp(-Energy)
40+
end
41+
42+
43+
44+
#TODO Check m and ns
45+
function LaguerreJPDF{Eigenvalue<:FloatingPoint}(lambda :: Vector{Eigenvalue}, n :: Unsigned, beta :: Unsigned)
46+
m = length(lambda)
47+
#Laguerre parameters
48+
a = beta*n/2.0
49+
p = 1.0 + beta*(m-1)/2.0
50+
#Calculate normalization constant
51+
c = 2.0^-(m*a)
52+
for j=1:m
53+
z = (a - beta*(m-j)/2.0)
54+
if z < 0 && (int(z) - z) < eps()
55+
#Pole of gamma function, there is no density here no matter what
56+
return 0.0
57+
end
58+
c *= gamma(1 + beta/2)/(gamma(1 + beta*j/2)*gamma(z))
59+
end
60+
61+
#Calculate Laguerre product term
62+
Prod = prod(lambda.^(a-p))
63+
64+
#Calculate argument of exponential
65+
Energy = sum(lambda)/2
66+
67+
return c * VandermondeDeterminant(lambda, beta) * Prod * exp(-Energy)
68+
end
69+
70+
71+
#TODO Check m and ns
72+
function JacobiJPDF{Eigenvalue<:FloatingPoint}(lambda :: Vector{Eigenvalue}, n1 :: Unsigned, n2 :: Unsigned, beta :: Unsigned)
73+
m = length(lambda)
74+
#Jacobi parameters
75+
a1 = beta*n1/2.0
76+
a2 = beta*n2/2.0
77+
p = 1.0 + beta*(m-1)/2.0
78+
#Calculate normalization constant
79+
c = 1.0
80+
for j=1:m
81+
z1 = (a1 - beta*(m-j)/2.0)
82+
if z1 < 0 && (int(z1) - z1) < eps()
83+
#Pole of gamma function, there is no density here no matter what
84+
return 0.0
85+
end
86+
z2 = (a2 - beta*(m-j)/2.0)
87+
if z2 < 0 && (int(z2) - z2) < eps()
88+
#Pole of gamma function, there is no density here no matter what
89+
return 0.0
90+
end
91+
c *= gamma(1 + beta/2)*gamma(a1+a2-beta*(m-j)/2)
92+
c /= gamma(1 + beta*j/2)*gamma(z1)*gamma(z2)
93+
end
94+
95+
#Calculate Laguerre product term
96+
Prod = prod(lambda.^(a1-p))*prod((1-lambda).^(a2-p))
97+
98+
#Calculate argument of exponential
99+
Energy = sum(lambda/2)
100+
101+
return c * VandermondeDeterminant(lambda, beta) * Prod * exp(-Energy)
102+
end
103+
104+
105+

0 commit comments

Comments
 (0)