OrdinaryDiffEq.jl is part of the SciML common interface, but can be used independently of DifferentialEquations.jl. The only requirement is that the user passes an OrdinaryDiffEq.jl algorithm to solve
. For example, we can solve the ODE tutorial from the docs using the Tsit5()
algorithm:
using OrdinaryDiffEq
+f(u, p, t) = 1.01 * u
+u0 = 1 / 2
+tspan = (0.0, 1.0)
+prob = ODEProblem(f, u0, tspan)
+sol = solve(prob, Tsit5(), reltol = 1e-8, abstol = 1e-8)
+using Plots
+plot(sol, linewidth = 5, title = "Solution to the linear ODE with a thick line",
+ xaxis = "Time (t)", yaxis = "u(t) (in μm)", label = "My Thick Line!") # legend=false
+plot!(sol.t, t -> 0.5 * exp(1.01t), lw = 3, ls = :dash, label = "True Solution!")
That example uses the out-of-place syntax f(u,p,t)
, while the inplace syntax (more efficient for systems of equations) is shown in the Lorenz example:
using OrdinaryDiffEq
+function lorenz(du, u, p, t)
+ du[1] = 10.0(u[2] - u[1])
+ du[2] = u[1] * (28.0 - u[3]) - u[2]
+ du[3] = u[1] * u[2] - (8 / 3) * u[3]
+end
+u0 = [1.0; 0.0; 0.0]
+tspan = (0.0, 100.0)
+prob = ODEProblem(lorenz, u0, tspan)
+sol = solve(prob, Tsit5())
+using Plots;
+plot(sol, vars = (1, 2, 3));
Very fast static array versions can be specifically compiled to the size of your model. For example:
using OrdinaryDiffEq, StaticArrays
+function lorenz(u, p, t)
+ SA[10.0(u[2] - u[1]), u[1] * (28.0 - u[3]) - u[2], u[1] * u[2] - (8 / 3) * u[3]]
+end
+u0 = SA[1.0; 0.0; 0.0]
+tspan = (0.0, 100.0)
+prob = ODEProblem(lorenz, u0, tspan)
+sol = solve(prob, Tsit5())
For “refined ODEs”, like dynamical equations and SecondOrderODEProblem
s, refer to the DiffEqDocs. For example, in DiffEqTutorials.jl we show how to solve equations of motion using symplectic methods:
function HH_acceleration(dv, v, u, p, t)
+ x, y = u
+ dx, dy = dv
+ dv[1] = -x - 2x * y
+ dv[2] = y^2 - y - x^2
+end
+initial_positions = [0.0, 0.1]
+initial_velocities = [0.5, 0.0]
+prob = SecondOrderODEProblem(HH_acceleration, initial_velocities, initial_positions, tspan)
+sol2 = solve(prob, KahanLi8(), dt = 1 / 10);
Other refined forms are IMEX and semi-linear ODEs (for exponential integrators).
For the list of available solvers, please refer to the DifferentialEquations.jl ODE Solvers, Dynamical ODE Solvers, and the Split ODE Solvers pages.