DiffEqCallbacks.jl
A library of useful callbacks for hybrid scientific machine learning (SciML) with augmented differential equation solvers
[DifferentialEquations.jl](https://docs.sciml.ai/DiffEqDocs/stable/) has an expressive callback system which allows for customizable transformations of the solver behavior. DiffEqCallbacks.jl is a library of pre-built callbacks which makes it easy to transform the solver into a domain-specific simulation tool. The project is written primarily in Julia, distributed under the Other license, first published in 2017. Key topics include: callback, dae, dde, differential-equations, julia.
DiffEqCallbacks.jl: Prebuilt Callbacks for extending the solvers of DifferentialEquations.jl
DifferentialEquations.jl has an expressive callback system
which allows for customizable transformations of the solver behavior. DiffEqCallbacks.jl
is a library of pre-built callbacks which makes it easy to transform the solver into a
domain-specific simulation tool.
Tutorials and Documentation
For information on using the package,
see the stable documentation. Use the
in-development documentation for the version of
the documentation, which contains the unreleased features.
Manifold Projection Example
Here we solve the harmonic oscillator:
juliausing OrdinaryDiffEq u0 = ones(2) function f(du, u, p, t) du[1] = u[2] du[2] = -u[1] end prob = ODEProblem(f, u0, (0.0, 100.0))
However, this problem is supposed to conserve energy, and thus we define our manifold
to conserve the sum of squares:
juliafunction g(resid, u, p, t) resid[1] = u[2]^2 + u[1]^2 - 2 end
To build the callback, we call
juliausing DiffEqCallbacks, ADTypes cb = ManifoldProjection(g, autodiff = AutoForwardDiff(), resid_prototype = zeros(1))
Using this callback, the Runge-Kutta method Vern7 conserves energy. Note that the
standard saving occurs after the step and before the callback, and thus we set
save_everystep=false to turn off all standard saving and let the callback
save after the projection is applied.
juliausing Test sol = solve(prob, Vern7(), save_everystep = false, callback = cb) @test sol.u[end][1]^2 + sol.u[end][2]^2 ≈ 2

Contributors
Showing top 12 contributors by commit count.
