Engee documentation

DifferentialEquations.jl: Efficient solution of differential equations in Julia

This is a package for numerical solution of differential equations written in Julia and available for use in Julia, Python and R. The purpose of this package is to provide efficient implementations of Julia solvers for various differential equations. The equations included in the scope of this package include the following:

  • Discrete equations (function maps, discrete stochastic (Gillespie/Markov) simulations)

  • Ordinary Differential Equations (ODES)

  • Splitting and partitioning ODES (symplectic integrators, IMEX methods)

  • Stochastic ordinary differential equations (SODE or SDE)

  • Stochastic Differential Algebraic Equations (SDAE)

  • Random Differential equations (RODE or RDE)

  • Differential Algebraic Equations (DAE)

  • Delayed Differential Equations (DDE)

  • Neutral, delayed differential equations and algebraic delayed differential equations (NDDE, RDDE and DDAE)

  • Stochastic differential Equations with delay (SDDE)

  • Experimental support for stochastic neutral differential equations with delay and algebraic delay (SNDDE, SRDDE and SDDAE)

  • Mixed discrete and continuous equations (hybrid equations, hopping diffusions)

  • (Stochastic) partial differential equations ((S)PDEs) (using both finite difference and finite element methods)

Well-optimized DifferentialEquations solvers are among the fastest implementations, using classical algorithms and algorithms from recent research that surpass the "standard" C/Fortran methods, and also include algorithms optimized for high-precision and high-performance computing applications. At the same time, classical C/Fortran methods are encapsulated in it, which makes it easy to switch to them if necessary. Solving differential equations using various methods from different languages and packages can be done by changing a single line of code, which makes it easy to conduct a comparative analysis and make sure that the fastest possible method is used.

DifferentialEquations.jl integrates with the Julia package scope thanks to the following features:

Also, DifferentialEquations.jl has built-in analysis functions, including the following:

Cooperation

Support and citation

The software of this ecosystem was developed as part of academic research. If you want to support it, you can put an asterisk in the repository. If you use SciML software in your scientific, teaching, or other activities when applying DifferentialEquations.jl or the packages included in it (OrdinaryDiffEq.jl, Sundials.jl, DiffEqDevTools.jl, etc.), you can refer to the article if necessary.:

@article{rackauckas2017differentialequations,
  title={Differential{E}quations.jl--a performant and feature-rich ecosystem for solving differential equations in {J}ulia},
  author={Rackauckas, Christopher and Nie, Qing},
  journal={Journal of Open Research Software},
  volume={5},
  number={1},
  year={2017},
  publisher={Ubiquity Press}
}

In addition, many solvers use new algorithms, and if these algorithms are used, then you can provide links to these methods. For citation recommendations, see the corresponding page.

Getting started

Video Tutorial

Видеоруководство

Removing and reducing compilation time

In some situations, it may be necessary to reduce the compilation time associated with using DifferentialEquations.jl. In this case, two strategies can be applied. One strategy is to https://diffeq.sciml.ai/stable/features/low_dep /[low dependency usage]. DifferentialEquations.jl is a meta package consisting of many smaller packages, so you can directly use one component, for example OrdinaryDiffEq.jl for pure Julia ODE solvers, and reduce compilation time by ignoring the others (note: the interface is exactly the same, only using solvers other than those found in OrdinaryDiffEq.jl, will result in an error). It is recommended that the underlying packages use only the packages they need.

Another strategy is to apply https://julialang .github.io/PackageCompiler.jl/dev/[PackageCompiler.jl] to create a system image that pre-compiles the entire package. To do this, it is enough to do the following.

using PackageCompiler
PackageCompiler.create_sysimage([:DifferentialEquations, :Plots]; replace_default = true)

It should be noted that adding a package to the system image has some disadvantages. For example, the package will not be updated until the system image is manually rebuilt. You can learn more about the consequences. https://julialang .github.io/PackageCompiler.jl/stable/sysimages.html#Drawbacks-to-custom-sysimages [read this part of the PackageCompiler manual].