## ProbNumDiffEq.jl

ProbNumDiffEq.jl provides probabilistic ODE solvers for the DifferentialEquations.jl ecosystem.

The field of Probabilistic Numerics aims to quantify numerical uncertainty arising from finite computational resources. This package implements ODE filters, a class of probabilistic numerical methods for solving ordinary differential equations. By casting the solution of ODEs as a problem of Bayesian inference, they solve ODEs with methods of Bayesian filtering and smoothing. As a result, the solvers return a posterior probability distribution over ODE solutions and provide estimates of their own numerical approximation error.

## Installation

The package can be installed directly with the Julia package manager:

``````] add ProbNumDiffEq
``````

## Example

``````using ProbNumDiffEq

# ODE definition as in DifferentialEquations.jl
function fitz(u, p, t)
a, b, c = p
return [c*(u[1] - u[1]^3/3 + u[2])
-(1/c)*(u[1] -  a - b*u[2])]
end
u0 = [-1.0; 1.0]
tspan = (0., 20.)
p = (0.2,0.2,3.0)
prob = ODEProblem(fitz, u0, tspan, p)

# Solve the ODE with a probabilistic numerical solver: EK0
sol = solve(prob, EK0(), abstol=1e-1, reltol=1e-2)

# Plot the solution
using Plots
plot(sol, fillalpha=0.15)

# Sample from the solution and plot the samples
samples = ProbNumDiffEq.sample(sol, 100)
for i in 1:100
plot!(sol.t, samples[:, :, i], color=[1 2], label="", linewidth=0.1)
end
``````