Gaussian random walk by Mersenne Twister in GSL

This example shows simple random walk implemented by Merseene Twister in gsl-ocaml, a binding of GNU Scientific Library (GSL).


In [1]:
#require "gsl" ;;
#use "archimedes_iocaml.ml" ;;


/home/opam/.opam/4.04.1/lib/ocaml/unix.cma: loaded
/home/opam/.opam/4.04.1/lib/ocaml/bigarray.cma: loaded
/home/opam/.opam/4.04.1/lib/gsl: added to search path
/home/opam/.opam/4.04.1/lib/gsl/gsl.cma: loaded
/home/opam/.opam/4.04.1/lib/easy-format: added to search path
/home/opam/.opam/4.04.1/lib/easy-format/easy_format.cmo: loaded
/home/opam/.opam/4.04.1/lib/biniou: added to search path
/home/opam/.opam/4.04.1/lib/biniou/biniou.cma: loaded
/home/opam/.opam/4.04.1/lib/yojson: added to search path
/home/opam/.opam/4.04.1/lib/yojson/yojson.cmo: loaded
/home/opam/.opam/4.04.1/lib/ocaml/str.cma: loaded
/home/opam/.opam/4.04.1/lib/atd: added to search path
/home/opam/.opam/4.04.1/lib/atd/atd.cma: loaded
/home/opam/.opam/4.04.1/lib/atdgen: added to search path
/home/opam/.opam/4.04.1/lib/atdgen/atdgen.cma: loaded
/home/opam/.opam/4.04.1/lib/bytes: added to search path
/home/opam/.opam/4.04.1/lib/result: added to search path
/home/opam/.opam/4.04.1/lib/result/result.cma: loaded
/home/opam/.opam/4.04.1/lib/lwt: added to search path
/home/opam/.opam/4.04.1/lib/lwt/lwt.cma: loaded
/home/opam/.opam/4.04.1/lib/lwt/lwt-log.cma: loaded
/home/opam/.opam/4.04.1/lib/lwt/lwt-unix.cma: loaded
/home/opam/.opam/4.04.1/lib/ctypes: added to search path
/home/opam/.opam/4.04.1/lib/ctypes/ctypes.cma: loaded
/home/opam/.opam/4.04.1/lib/ctypes/ctypes-top.cma: loaded
/home/opam/.opam/4.04.1/lib/ctypes/ctypes-foreign-base.cma: loaded
/home/opam/.opam/4.04.1/lib/ctypes/ctypes-foreign-unthreaded.cma: loaded
/home/opam/.opam/4.04.1/lib/iocaml-kernel: added to search path
/home/opam/.opam/4.04.1/lib/iocaml-kernel/iocaml_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/cairo2: added to search path
/home/opam/.opam/4.04.1/lib/cairo2/cairo2.cma: loaded
/home/opam/.opam/4.04.1/lib/ocaml/dynlink.cma: loaded
/home/opam/.opam/4.04.1/lib/ocaml/camlp4: added to search path
/home/opam/.opam/4.04.1/lib/archimedes: added to search path
/home/opam/.opam/4.04.1/lib/archimedes/archimedes_internals.cma: loaded
/home/opam/.opam/4.04.1/lib/archimedes/archimedes_toploop.cma: loaded
Module Archimedes loaded and aliased as A.
/home/opam/.opam/4.04.1/lib/archimedes/archimedes_cairo.cma: loaded
module Archimedes_iocaml : sig  end

In [2]:
let random_walk ~rng ~sigma n =
  Array.init n (fun _ -> Gsl_randist.gaussian ~sigma rng)
  |> Array.fold_left (fun (ws, w) z -> let w' = w +. z in (w' :: ws, w')) ([], 0.0)
  |> fst
  |> List.rev


Out[2]:
val random_walk : rng:Gsl_rng.t -> sigma:float -> int -> float list = <fun>

In [3]:
let rng = Gsl_rng.make Gsl_rng.MT19937 ;; (* Mersenne Twister *)

let vp = A.init ~w:760. ~h:300. ["iocaml"] in
A.Axes.box vp ;
A.set_color vp A.Color.red ;
A.List.y ~style:`Lines vp (random_walk ~rng ~sigma:0.01 1000) ;
A.set_color vp A.Color.blue ;
A.List.y ~style:`Lines vp (random_walk ~rng ~sigma:0.01 1000) ;
A.set_color vp A.Color.green ;
A.List.y ~style:`Lines vp (random_walk ~rng ~sigma:0.01 1000) ;
A.set_color vp A.Color.magenta ;
A.List.y ~style:`Lines vp (random_walk ~rng ~sigma:0.01 1000) ;
A.set_color vp A.Color.cyan ;
A.List.y ~style:`Lines vp (random_walk ~rng ~sigma:0.01 1000) ;
A.close vp


Out[3]:
val rng : Gsl_rng.t = <abstr>
Out[3]:
- : unit = ()

In [ ]: