# The Packages

The packages are split into different categories. The core metapackage which uses the functionality together is DifferentialEquations.jl. The following documentation shows how the various components can be used together in DifferentialEquations.jl. The component solvers are the packages which provide the functionality for actually solving differential equations, and the add-ons utilize the common solution interface to provide higher level functionality. Packages for easily specifying more domain-specific models are included to enhance the scope of the ecosystem. Lastly, developer tools help researchers create and test high performance algorithms to add to the ecosystem.

### MetaPackage: DifferentialEquations.jl

DifferentialEquations.jl is a metapackage which brings together the various parts of the ecosystem into one cohesive and ready to use powerhouse of differential equation solving. Using DifferentialEquations.jl, one can perform high level analysis like parameter estimation and sensitivity analysis, while retaining the ability to swap out different ODE solvers between different packages. Offering high-performance native Julia implementations and the well-known C/Fortran algorithms like Sundials or the Hairer algorithms (through ODEInterface.jl) – the mixture of flexibility and performance is unparalleled. This is combined with benchmark-based algorithms for choosing default methods and a common user interface for handling the solutions across different domains, easing the user experience while not compromising performance.

### Documentation Packages

• DiffEqDocs.jl. The documentation for the common interface as provided by DifferentialEquations.jl.
• DiffEqDevDocs.jl. The developer documentation, explaining how to create new components to the JuliaDiffEq ecoystem.
• DiffEqTutorials.jl. Jupyter notebook tutorials explaining how to use various features in the ecosystem.
• DiffEqBenchmarks.jl. Benchmarks showing the performance differences between the implementations.

### Component Solvers

The solver component packages provide the functionality for solving differential equations.

• OrdinaryDiffEq.jl. These Julia implementations offer the largest amount of Julia-specific options, while the benchmarks show that these are some of the fastest ODE solver implementations.
• Sundials.jl. This wrapper to the Sundials package of ODE and DAE solvers allows users to use the famous multistep methods.
• ODE.jl. This is a suite of ODE solvers inspired by MATLAB.
• StochasticDiffEq.jl. This is a suite of stochastic differential equation (SDE) solvers based off of recent research to offer highly efficient adaptive time stepping and high strong order methods.
• DelayDiffEq.jl. This suite builds off of OrdinaryDiffEq.jl to deliver new high-performance algorithms for solving delay differential equations.
• DASSL.jl This is a Julia implementation of the famous DASSL DAE solver.
• DASKR.jl This is a wrapper to the well-known DASKR differential algebraic equation (DAE) solver.
• FiniteElementDiffEq.jl. This package has tools for describing linear finite element meshes and for solving Poisson and Heat equation problems.
• StokesDiffEq.jl. This package has tools for solving the Stationary Stokes Equation.
• MATLABDiffEq.jl. This package has bindings for using MATLAB’s ODE solvers through the common interface via MATLAB.jl. It’s restricted to solving ParameterizedFunctions and is mostly for benchmarking.
• ODEInterfaceDiffEq.jl. This package extends ODEInterface.jl to have the common JuliaDiffEq interface. This allows one to use classic FORTRAN algorithms like dopri5 and radau.

Optionally, the following non-JuliaDiffEq packages can be used through the JuliaDiffEq common interface:

• LSODA.jl. This package wraps the popular LSODA algorithm with automatic switching between non-stiff and stiff solvers.

These packages provide add-on functionality to the differential equation solvers.

• ParameterizedFunctions.jl. ParameterizedFunctions.jl provides an easy way to specify differential equations which will auto-compute various enhancements (Jacobians, inverse Jacobians) to speed up the differential equations solvers. In addition, it provides a way of defining functions with explicit parameters, which gives a way for parameter analyses like parameter estimation to be possible.
• DiffEqParamEstim.jl. This package links the JuliaDiffEq common interface to the various optimization and machine learning packages in order to provide methods for performing parameter estimation.
• DiffEqJump.jl. This package provides the functionality for extending discrete and differential equations to jump equations which can be solved using the DiffEq methods with callbacks.
• DiffEqMonteCarlo.jl. This package provides methods for easily performing parallel Monte Carlo simulations using the DiffEq solvers on clusters and analyze the results.
• DiffEqSensitivity.jl. This package adds sensitivity analysis to the JuliaDiffEq common interface.
• DiffEqBifurcate.jl. This package adds bifurcation analysis to functions defined as a ParameterizedFunction. The core functionality is provided by PyDSTool.jl. This is a work in progress.
• DiffEqUncertainty.jl. This component provides uncertainty analysis tools to the JuliDiffEq common interface. This is a work in progress.
• DiffEqOptimalControl.jl. This component provides methods for translating optimal control problems to relevant differential equations to be solved by the component solvers. This is a work in progress.
• DiffEqCallbacks.jl. This is a library of callback functions which extend the JuliaDiffEq component solvers by adding features like automatic adaptation of tolerances.

### Models Packages

• MultiScaleArrays.jl. This package provides a performant way to define differential equations with a changing hierarchical structure. For example, one can define a differential equation on the proteins of various cells (of different types), where the proteins change continuously (and stochastically) and the cell numbers change discretely.
• DiffEqBiological.jl. This package provides an easy way for creating models of chemical reaction networks in order to simulate them via the DifferentialEquations.jl methods.
• DiffEqFinancial.jl. This package provides an easy way to define the common stochastic differential equations found in mathematical finance.

## Web App

• DiffEqOnline. This repository stores the frontend for the DiffEqOnline webapp.
• DiffEqOnlineServer. This repository stores the backend for the DiffEqOnline webapp.

### Developer Packages

• DiffEqBase.jl. This package provides the core structure of JuliaDiffEq, allowing the packages to offer a standardized interface while reducing the dependencies of the components.
• DiffEqPDEBase.jl. This package provides the core structure of the PDE solvers for JuliaDiffEq. It contains the type definitions associated with PDEs, the tools for finite element meshes, and other utilities which are used to build solvers.
• DiffEqDiffTools.jl. This package provides differentiation tools for the JuliaDiffEq solvers, allowing high-performance algorithms to be written at a high level and automatically make use of user-specified “performance overloads”, symbolic differentiation, and automatic differentiation: all with a fallback to numerical differentiation.
• DiffEqDevTools.jl. This package offers various methods for performing convergence analysis, benchmarking, and testing of the component solvers. Also included are tableau analysis tools like recipes for stability region plots.
• DiffEqProblemLibrary.jl. This package provides a set of premade problems for testing the component solvers.