nathanaelbosch / ProbNumDiffEq.jl

Probabilistic Numerical Differential Equation solvers via Bayesian filtering and smoothing
MIT License
118 stars 15 forks source link
differential-equations hacktoberfest julia ode ode-solver probabilistic-models probabilistic-numerics

ProbNumDiffEq.jl

Stable Development Build Status Coverage Benchmarks

Banner

ProbNumDiffEq.jl provides probabilistic numerical ODE solvers to the DifferentialEquations.jl ecosystem. The implemented ODE filters solve differential equations via Bayesian filtering and smoothing. The filters compute not just a single point estimate of the true solution, but a posterior distribution that contains an estimate of its numerical approximation error.

For a short intro video, check out the ProbNumDiffEq.jl poster presentation at JuliaCon2021.

Installation

Run Julia, enter ] to bring up Julia's package manager, and add the ProbNumDiffEq.jl package:

julia> ]
(v1.8) pkg> add ProbNumDiffEq

Example: Solving the FitzHugh-Nagumo ODE

using ProbNumDiffEq

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

# Solve the ODE with a probabilistic numerical solver: EK1
sol = solve(prob, EK1())

# Plot the solution with Plots.jl
using Plots
plot(sol, color=["#CB3C33" "#389826" "#9558B2"])

Fitzhugh-Nagumo Solution

In probabilistic numerics, the solution also contains error estimates - it just happens that they are too small to be visible in the plot above. But we can just plot them directly:

using Statistics
stds = std.(sol.pu)
plot(sol.t, hcat(stds...)', color=["#CB3C33" "#389826" "#9558B2"],
     label=["std(u1(t))" "std(u2(t))"], xlabel="t", ylabel="standard-deviation")

Fitzhugh-Nagumo Standard-Deviations

Contributing

Contributions are very welcome! Check the existing issues for ideas on how to contribute to the package. If you want to implement a new functionality/algorithm, open an issue to start a discussion.

Please open issues liberally! If there is anything that's unclear or doesn't work, we would very much like to know about it. This includes not just bugs and feature requests but also general questions about the software, feedback and suggestions.

Related packages