Open-source project
SciML/DifferentialEquations.jl avatar
SciML/DifferentialEquations.jl

DifferentialEquations.jl: one Julia interface for ODEs, SDEs, DAEs and DDEs

Multi-language suite for high-performance solvers of differential equations and scientific machine learning (SciML) components. Ordinary differential equations (ODEs), stochastic differential equations (SDEs), delay differential equations (DDEs), differential-algebraic equations (DAEs), and more in Julia.

3,164 stars255 forksJuliaNOASSERTION

At a glance

What is it?
DifferentialEquations.jl is a Julia suite that puts ordinary, stochastic, delay and differential-algebraic equation solvers behind a single solve call. It is aimed at people who need to switch algorithms, not rewrite models, and it carries a v8 migration cost.
Who is it for?
Adopt DifferentialEquations.jl if your model is a differential equation and you want to change solver algorithms without touching the problem definition, and if your team already works in Julia. Do not adopt it if you need a stable API across a long upgrade cycle without reading migration notes, or if your work is a single well-known ODE that an existing C or Fortran call already handles.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 18 days ago.
What is it written in?
Mainly Julia, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem DifferentialEquations.jl removes: solver lock-in

Most numerical work starts with a method choice that is hard to undo. You write a model against one integrator, tune tolerances for it, and from then on the model and the method are the same artifact. Changing from a fixed-step Runge-Kutta scheme to an implicit solver for a stiff system usually means rewriting the call site, the Jacobian handling and sometimes the state layout.

DifferentialEquations.jl attacks that coupling directly. The README describes a suite that supplies Julia implementations of solvers for discrete equations, ordinary differential equations, split and partitioned ODEs, stochastic ODEs, stochastic differential-algebraic equations, random differential equations, differential algebraic equations, delay differential equations including neutral, retarded and algebraic variants, stochastic delay equations, hybrid equations and jump diffusions, and stochastic partial differential equations with finite difference and finite element methods.

The intended audience is narrower than that list suggests. This is for people who already have a differential equation and need to solve it repeatedly, compare methods, or fit parameters. The README states that solving with different methods from different languages and packages can be done by changing one line of code, which is the actual selling point: the problem object stays fixed while the algorithm changes. If your task is symbolic manipulation or a closed-form derivation, this package is not the instrument.

How the problem and solver split works in practice

The architecture is a separation between a problem type and a solver algorithm. You build a problem that carries the equation, the initial condition, the time span and the parameters. You then pass that problem to solve together with an algorithm chosen from the suite. The README frames this as one line of code changing between methods, which is only true because the problem object is method-agnostic.

Around that core the package integrates with the wider Julia package sphere rather than reimplementing everything. The README lists GPU acceleration through CUDA.jl and DiffEqGPU.jl, automated sparsity detection with Symbolics.jl, automatic Jacobian coloring with SparseDiffTools.jl, specification of linear solvers through LinearSolve.jl, progress meter integration with the Visual Studio Code IDE, automatic plotting of time series and phase plots, built-in interpolations, wrappers for common C and Fortran methods such as Sundials and Hairer's radau, arbitrary precision with BigFloats and Arbfloats, arbitrary array types for matrices and distributed arrays, and unit checked arithmetic with Unitful.

That dependency graph is the real mechanism. When you ask for an implicit method on a large sparse system, the sparsity detection and Jacobian coloring work is delegated to other packages in the ecosystem, and the linear solve is delegated to LinearSolve.jl. The practical consequence is that solver choice is not isolated: it pulls in a set of companion packages whose behaviour you also inherit. The README does not document a fallback path when one of those companion packages fails to resolve a structure, so a sparse Jacobian that Symbolics.jl cannot detect is a case you should test yourself rather than assume.

Installing DifferentialEquations.jl and solving a first ODE

The README does not print an install command or a code example. It points to the stable documentation at https://docs.sciml.ai/DiffEqDocs/stable/ for information on using the package, and to the in-development documentation for unreleased features. Installation therefore goes through the Julia package manager, and the problem types for each equation class are documented on the DiffEqDocs site rather than in the README.

What the README does give is the shape of the workflow: a suite of solvers for ordinary differential equations, stochastic differential equations, delay differential equations and differential algebraic equations, with method changes described as a one-line edit. That means you add the package in Julia, define a problem for your equation class, and call solve with an algorithm. The README does not name the problem constructors, the solver identifiers or a runnable snippet, so any concrete call must be taken from the DiffEqDocs site instead.

Because no command, flag, package name or variable appears in the README, there is nothing here to copy into a shell block. Confirm the package name and the current problem constructors against the stable documentation before you write your first script, and treat the v8 update notice as the version boundary you are targeting.

The v8 breaking changes are the first thing to check

The README opens with a v8 update notice stating that DifferentialEquations.jl v8 had many breaking changes, and it points to the NEWS file in the OrdinaryDiffEq.jl repository for the complete migration story. That is a direct signal that upgrading across the v8 boundary is not a version bump you can do casually.

The reason is structural. The top-level repository is a suite that re-exports and coordinates solver packages, and the release history shows patch and minor releases landing close together: v8.0.3 and v8.1.0 on 2026-08-23, then v8.1.1 on 2026-08-27. A suite that moves this way can change behaviour without changing the problem definition you wrote, which is the same property that makes method swapping pleasant in the first place. The coupling that lets you change one line to change solvers also means a change upstream can reach your code through a dependency you did not touch.

The README does not document a rollback procedure, and it does not describe a compatibility shim for pre-v8 code. The only migration reference it gives is the NEWS file in the OrdinaryDiffEq.jl repository. If you are pinning versions in a long-running project, read that file before you move, and expect to test your problem definitions rather than your model equations.

Where DifferentialEquations.jl is the wrong choice

The strongest argument against it is language commitment. The README says the suite is written in Julia and available for use in Julia, Python and R, but the efficient implementations it describes are Julia implementations. If your production system is Python or R and you only need one stiff ODE solved once, adding a Julia runtime to that pipeline is a large cost for a small task, and the wrapper path is the part of the story the README spends the least space on.

The second limit is scope. The README lists stochastic partial differential equations with finite difference and finite element methods, but it also labels the stochastic neutral, retarded and algebraic delay differential equations as experimental support. That word matters: an experimental equation class is not a place to put a regulated or long-lived simulation without your own validation.

The third is the analysis layer. Sensitivity analysis, parameter estimation and Bayesian analysis, neural differential equations, ensemble simulations, global sensitivity analysis and uncertainty quantification are all listed as features, but each points at a separate package in the SciML ecosystem. The README does not describe how those packages version together with the core suite. If your reason for adopting this is the scientific machine learning side, you are adopting a constellation, not a single library, and you should check the release cadence of the companion packages before you assume the whole set moves in step.

How it compares with a direct Sundials or Fortran call

The most honest alternative is not another Julia package. It is calling a C or Fortran solver directly, for example Sundials or Hairer's radau, which the README says this package wraps. The difference in approach is who owns the interface. With a direct call you write the integration against that library's API, its error codes and its state conventions, and you get exactly one method family with no indirection. With DifferentialEquations.jl you write a problem object and let the suite choose or accept an algorithm, which the README describes as making it easy to switch over to the classic C and Fortran methods whenever necessary.

That wrapping is the real comparison point. The suite does not replace Sundials or radau; it puts them behind the same problem type as the Julia-native solvers, so the cost of trying a different method drops to a line of code. The benefit is benchmarking breadth, and the README explicitly frames the one-line switch as enabling benchmarking to ensure you are using the fastest method possible. The cost is an extra layer between you and the library, plus the dependency graph described above.

If your problem is fixed, your method is settled and your team already knows the C API, the wrapper buys you little. If you are still choosing a method, or you need to move between explicit, implicit and stochastic solvers across a project, the wrapper is the reason to be here.

Maintenance, licence and upgrade cost

The repository is not archived, and the last push was on 2026-09-11, which is recent. Releases are frequent: v8.1.1 on 2026-08-27, v8.1.0 and v8.0.3 on 2026-08-23. For a suite that coordinates many solver packages, that cadence is the maintenance reality you are signing up for. Budget for reading release notes, not just for writing model code.

The licence field on the repository is reported as NOASSERTION, which means the licence could not be identified automatically from the repository metadata. The repository does contain a LICENSE.md at the top level, so the terms are stated there rather than in the metadata. Read that file yourself before you depend on the package in a product; this is a factual pointer, not legal advice, and the terms in LICENSE.md govern.

The upgrade cost concentrates at major versions. The README's v8 notice and its pointer to the OrdinaryDiffEq.jl NEWS file are the only migration guidance it offers. There is no documented rollback path and no stated long-term support branch. If you need a frozen solver for a decade-long study, pin your versions and keep the NEWS file for the version you pinned.

Editorial conclusion

Adopt DifferentialEquations.jl if your model is a differential equation and you want to change solver algorithms without touching the problem definition, and if your team already works in Julia. Do not adopt it if you need a stable API across a long upgrade cycle without reading migration notes, or if your work is a single well-known ODE that an existing C or Fortran call already handles. Before committing, check the v8 breaking changes in the OrdinaryDiffEq.jl NEWS file, confirm which solver family your equation type maps to, and read the licence file in the repository, which GitHub reports as NOASSERTION.

Frequently asked questions

How do I solve differential equations in Julia with DifferentialEquations.jl?

The README does not give a runnable example. It points to the stable documentation at https://docs.sciml.ai/DiffEqDocs/stable/ for information on using the package, and describes a suite of solvers where switching methods is a one-line change. The concrete problem constructors and solver names are documented on that site rather than in the README.

Which equation types does DifferentialEquations.jl cover?

The README lists discrete equations, ordinary differential equations, split and partitioned ODEs, stochastic ODEs, stochastic differential-algebraic equations, random differential equations, differential algebraic equations, delay differential equations including neutral, retarded and algebraic variants, stochastic delay equations, hybrid equations and jump diffusions, and stochastic partial differential equations with finite difference and finite element methods.

Does DifferentialEquations.jl support GPU acceleration and ensemble simulations?

Yes. The README lists GPU acceleration through CUDA.jl and DiffEqGPU.jl, and automatic distributed, multithreaded and GPU parallel ensemble simulations. Both are documented in the SciML documentation rather than in the README itself.

What changed in DifferentialEquations.jl v8?

The README states that v8 had many breaking changes and points to the NEWS file in the OrdinaryDiffEq.jl repository for the complete migration story. The README does not document rollback, so the migration reference it gives is that NEWS file.

Official sources

  1. Issues
  2. Project website
  3. README
  4. Releases
  5. SciML/DifferentialEquations.jl on GitHub
For maintainers

Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/sciml-differentialequations-jl.svg)](https://hysenlabs.com/projects/sciml-differentialequations-jl)
Community notes

Community notes