# Solvers and Options

ProbNumDiffEq.jl provides mainly the following two solvers, both based on extended Kalman filtering and smoothing. For the best results we suggest using `EK1`

, but note that it requires that the Jacobian of the vector field is defined.

`ProbNumDiffEq.EK1`

— Type`EK1(; prior=:ibm, order=3, diffusionmodel=:dynamic, smooth=true)`

**Gaussian ODE filtering with first order extended Kalman filtering.**

Currently, only the integrated Brownian motion prior `:ibm`

is supported. For the diffusionmodel, chose one of `[:dynamic, :dynamicMV, :fixed, :fixedMV, :fixedMAP]`

.

See also: `EK0`

**References:**

- N. Bosch, P. Hennig, F. Tronarp:
**Calibrated Adaptive Probabilistic ODE Solvers**(2021) - F. Tronarp, H. Kersting, S. Särkkä, and P. Hennig:
**Probabilistic Solutions To Ordinary Differential Equations As Non-Linear Bayesian Filtering: A New Perspective**(2019)

`ProbNumDiffEq.EK0`

— Type`EK0(; prior=:ibm, order=3, diffusionmodel=:dynamic, smooth=true)`

**Gaussian ODE filtering with zeroth order extended Kalman filtering.**

Currently, only the integrated Brownian motion prior `:ibm`

is supported. For the diffusionmodel, chose one of `[:dynamic, :dynamicMV, :fixed, :fixedMV, :fixedMAP]`

.

See also: `EK1`

**References:**

- N. Bosch, P. Hennig, F. Tronarp:
**Calibrated Adaptive Probabilistic ODE Solvers**(2021) - F. Tronarp, H. Kersting, S. Särkkä, and P. Hennig:
**Probabilistic Solutions To Ordinary Differential Equations As Non-Linear Bayesian Filtering: A New Perspective**(2019) - M. Schober, S. Särkkä, and P. Hennig:
**A Probabilistic Model for the Numerical Solution of Initial Value Problems**(2018)

#### Experimental: Iterated extended Kalman smoothing

We do not recommend using the following solver, but if you are interested feel free to open an issue!

`ProbNumDiffEq.IEKS`

— Type`IEKS(; prior=:ibm, order=1, diffusionmodel=:dynamic, linearize_at=nothing)`

**Gaussian ODE filtering with iterated extended Kalman smoothing.**

To use it, use `solve_ieks(prob, IEKS(), args...)`

instead of `solve(prob, IEKS(), args...)`

, since it is implemented as an outer loop around the solver.

Currently, only the integrated Brownian motion prior `:ibm`

is supported. For the diffusionmodel, chose one of `[:dynamic, :dynamicMV, :fixed, :fixedMV, :fixedMAP]`

. Just like the `EK1`

it requires that the Jacobian of the rhs function is available.

See also: `EK0`

, `EK1`

, `solve_ieks`

**References:**

- F. Tronarp, S. Särkkä, and P. Hennig:
**Bayesian ODE Solvers: The Maximum A Posteriori Estimate**

`ProbNumDiffEq.solve_ieks`

— Function`solve_ieks(prob::AbstractODEProblem, alg::IEKS, args...; iterations=10, kwargs...)`

Solve method to be used with the `IEKS`

. The IEKS works essentially by solving the ODE multiple times. `solve_ieks`

therefore wraps a call to the standard `solve`

method, passing `args...`

and `kwargs...`

.

Currently, this method is very simplistic - it iterates for a fixed numer of times and does not use a stopping criterion.