package owl-ode
Install
Dune Dependency
Authors
Maintainers
Sources
md5=4e46481a58735ccbc5f9ca0978862553
sha512=0cbbaec0520e9efd7578d1a46760a9c5e0ecbc1dc62d11fc1ad63402f2b6e1dfe42be64a089d371c85248c3ba7393ae32999a56b0af45ca790caaf82049c3c8f
doc/tutorial.html
Tutorial
Owl_ode is a lightweight package for solving ordinary differential equations. Built on top of Owl’s numerical library, Owl_ode was designed with extensibility and ease of use in mind and includes a number of classic ode solvers (e.g. Euler and Runge-Kutta, in both adaptive and fixed-step variants) and symplectic sovlers (e.g. Leapfrog), with more to come.
This library provides a collection of solvers for the initial value problem for ordinary differential equation systems.
You can jump to the interface of the Ode library.
Example of use
Let's solve the linear initial value problem \(\dot{y} = Ay\), with \(y(t_0) = y_0\). Say that A is the matrix ((1;-1); (2;3)), and the initial conditions are given by y(0) = (-1;1).
We begin by defining a function \(f(y, t)\) that corresponds to the RHS of the differential equation
let f y t =
let a = [|[|1.; -1.|];
[|2.; -3.|]|]
|> Owl.Mat.of_arrays
in
Owl.Mat.(a *@ y)
and the initial condition $y0$
let y0 = Mat.of_array [|-1.; 1.|] 2 1
Before being able to actually call the integrating function, we need to define the time specification for the problem at hand
let tspec = Owl_ode.Types.(T1 {t0 = 0.; duration = 2.; dt=1E-3})
This in particular allows us to specify also that \(t_0=0\). Here, we construct a record using the constructor Owl_ode.Types.tspec.T1
, which includes the start time \(t_0\), the time duration for the numerical solution, and a step size dt.
Finally we can call
let ts, ys = Owl_ode.odeint (module Owl_ode.Native.D.RK4) f y0 tspec ()
to get an array with the approximate value of the vector y at the times ts. As you can see from the snippet above, you have to specify the algorithm used for the integration by providing its module in the function call. Here, we integrated the dynamical system with Owl_ode.Native.D.RK4
, a fixed-step double-precision Runge-Kutta solver. In Owl_ode, we provide a number of ocaml-based double-precision solvers in the Owl_ode.Native.D
modeuoe and single-precision ones in Owl_ode.Native.S
. Additional integrators are provided by external and third party libraries.
The solution can be easily plotted using Owl_plplot
or any other owl-compatible plotting library, for example
let open Owl_plplot in
let h = Plot.create "myplot.png" in
Plot.plot ~h ~spec:[ RGB (0,0,255); LineStyle 1 ] ts (Mat.col ys 0);
Plot.output h;
You can refer to the examples in the source repository for more complex examples.