View Source Integrator
A numerical integrator written in Elixir for the solution of sets of non-stiff ordinary differential equations (ODEs).
installation
Installation
The package can be installed by adding integrator
to your list of dependencies in mix.exs
:
def deps do
[
{:integrator, "~> 0.1"},
]
end
The docs can be found at https://hexdocs.pm/integrator.
description
Description
Two integrator options are available; ode45
which is an adaptation of the Octave
ode45 and Matlab
ode45. The ode45
integrator utilizes the
Dormand-Prince 4th/5th order Runge
Kutta algorithm.
ode23
is an adaptation of the Octave
ode23 and Matlab
ode23 The ode23
integrator uses the
Bogacki-Shampine 3rd order Runge
Kutta algorithm.
Both ode45
(which is the default integrator option) and ode23
utilize an adaptive stepsize
algorithm for computing the integration time step. The time step is computed based on the
satisfaction of a required error tolerance.
This library heavily leverages Elixir Nx; many thanks to the
creators of Nx
, as without it this library
would not have been possible. The GNU Octave code was also
used heavily for inspiration and was used to generate numerical test cases for the Elixir versions
of the algorithms. Many thanks to John W. Eaton for his tremendous work on
Octave. Integrator
has been tested extensively during its development, and has a large and growing
test suite.
usage
Usage
See the Livebook guides for detailed examples of usage. As a simple example, you can integrate the
Van der Pol equation as defined in Integrator.SampleEqns.van_der_pol_fn/2
from time 0 to 20 with an
intial x value of [0, 1]
via:
t_initial = 0.0
t_final = 20.0
x_initial = Nx.tensor([0.0, 1.0])
solution = Integrator.integrate(&SampleEqns.van_der_pol_fn/2, [t_initial, t_final], x_initial)
Then, solution.output_t
contains a list of output times, and solution.output_x
contains a list
of values of x
at these corresponding times.
Options exist for:
- outputting simulation results dynamically via an output function (for applications such as plotting dynamically, or for animating while the simulation is underway)
- generating simulation output at fixed times (such as at
t = 0.1, 0.2, 0.3
, etc.) - interpolating intermediate points via quartic Hermite interpolation (for
ode45
) or via cubic Hermite interpolation (forode23
) - detecting termination events (such as collisions); see the Livebooks for details.
- increasing the simulation fidelity (at the expense of simulation time) via absolute tolerance and relative tolerance settings