I illustrate \eqref{eq:20151124b} in the case \( n = 5 \). The Mathematica code I use is
Clear[RandomMatrixGUE]
(* This code calculates a random matrix from the GUE *)
RandomMatrixGUE[NN_] := Module[{A, B, H},
A = RandomVariate[NormalDistribution[], {NN, NN}];
B = RandomVariate[NormalDistribution[], {NN, NN}];
H = 1/2 (A + Transpose[A]) + I / 2 (B - Transpose[B]);
H]
(* Simulates a path of the Dyson Brownian motion
in:
The dimension of the matrices is size x size.
T is the maximum time to simulate.
NSteps is in how many steps you simulate.
out: a list of matrices X_t
*)
SimulateOnePath[Size_, T_, NSteps_] :=
Module[{dt = T/NSteps , path},
path = Table[RandomMatrixGUE[Size] Sqrt[dt], {NSteps}];
path = Accumulate[path];
path = Prepend[path, ConstantArray[0, {Size, Size}]];
path]
(* plot all eigenvalues of the path X_t *)
(* the code contains an ugly double loop *)
PlotEigenValues[X_, dt_] :=
Module[{t = 0 , i, j, lambdapath, eig, NSteps = Length[X],
n = Length[X[[1]]]},
lambdapath = ConstantArray[{}, n];
For[i = 1, i <= NSteps, i++,
eig = Eigenvalues[X[[i]]];
eig = Sort[eig];
For[ j = 1, j <= n, j++,
lambdapath[[j]] = Append[lambdapath[[j]], {t, eig[[j]]}]];
t = t + dt];
ListPlot[lambdapath, Joined -> True]]
T = 1;
NSteps = 1000;
X = SimulateOnePath[5, T, NSteps];
PlotEigenValues[X, T/NSteps]
This produces the following graph.
The eigenvalues \( \lambda_1, \lambda_2, \ldots, \lambda_5 \) as function of time |
5 paths of the Brownian motion |
Further reading
- A proof of \eqref{eq:20151124b} follows quite easily if one uses 1st and 2nd order perturbation formulas from quantum mechanics on the expansion \( \lambda_i ( X_t + H \sqrt{dt} ) \). Details can for example be found in this blog post by Terence Tao.
- In the next post I perform a similar simulation for the Ornstein-Uhlenbeck process \begin{equation*} dX_t = -\alpha X_t dt + H \sqrt{dt} \end{equation*} There the repulsive effect is even more striking because the process tries to move \( X_t \) back to \( 0\) if \( \alpha > 0 \) .
No comments:
Post a Comment