|
| 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