Introduction & Contents
Introduction
DynamicalSystems.jl is an awardwinning Julia software library for the exploration of chaos and nonlinear dynamics.
DSWeb Competition 1st place winner
DynamicalSystems.jl has won the first place in the 2018 Software Contest held by the dynamical systems division of SIAM. For more details see the official statement
JuliaDynamics
DynamicalSystems.jl is part of JuliaDynamics, check out our website for more cool stuff!
The documentation you are reading now was built with the following stable versions:
* DelayEmbeddings ........... 1.1.0 * RecurrenceAnalysis ........ 1.0.2 * DynamicalSystemsBase ...... 1.3.0 * ChaosTools ................ 1.7.0 * InteractiveChaos .......... 0.3.2
See the News page for recent updates!
Introductory textbooks
Our library assumes some basic knowledge of nonlinear dynamics and complex systems.
If you are new to the field but want to learn more, we can suggest the following textbooks as introductions:
 Nonlinear Dynamics And Chaos  S. Strogatz
 An Exploration of Dynamical Systems and Chaos  J. Argyris et al.
 Chaos in Dynamical Systems  E. Ott
Jupyter Notebooks / Tutorials
In this repository you can find various Jupyter notebooks that have been used as introductory tutorials for DynamicalSystems.jl!
YouTube tutorial
You can find a tutorial on DynamicalSystems.jl hosted on the official YouTube channel of the Julia language:
Contents
The module DynamicalSystems
reexports all following functionality, grouped into different packages.
DynamicalSystemsBase

Intuitive, consistent APIs for the definition of general dynamical systems, under a unified struct
DynamicalSystem
. The following combinations are possible: Continuous or Discrete systems. Continuous systems use
DifferentialEquations.jl
for solving the ODE problem.  Inplace or outofplace (large versus small systems).
 Autodifferentiated or not (for the Jacobian function).
 Continuous or Discrete systems. Continuous systems use

Automatic "completion" of the dynamics of the system with numerically computed Jacobians, in case they are not provided by the user.
 Robust implementations of all kinds of integrators, that evolve the system, many states of the system, or even deviation vectors. See the advanced documentation for this.
 Library of predefined wellknown dynamical systems that have been used extensively in scientific research.
DelayEmbeddings
Is a package for performing delay coordinate embeddings and finding optimal parameters for doing so.
 Unified & dedicated interface for numerical data:
Dataset
.  Simple and extendable
neighborhood
estimation by interfacingNearestNeighbors
. 
Flexible and abstracted
reconstruct
interface, that creates the delaycoordinates reconstruction of a timeseries efficiently. Supports multiple dimensions and multiple timescales.
 Methods that estimate optimal embedding parameters: the delay time (
estimate_delay
) and the number of temporal neighbors (estimate_dimension
).  Fast calculation of mutual information:
mutualinformation
.
ChaosTools
Is a package that has many algorithms for chaotic dynamical systems. All algorithms are independent of each other but they are also not expansive enough to be a standalone package.
Please see the overview section for a full list of features. Here is a quick summary:
 Poincare S.O.S. and orbit diagrams
 Lyapunov Exponents
 Entropies and Dimensions
 Lyapunov exponent of a timeseries (numerical data)
 Periodic behavior
 Categorizing and distinguishing chaotic and regular behavior
 Nonlinear timeseries analysis
RecurrenceAnalysis
RecurrenceAnalysis
offers tools to compute and analyze Recurrence Plots, a field called Recurrence Quantification Analysis.
 Recurrence, crossrecurrence and jointrecurrence "plots" (they are matrices).

Recurrence quantification analysis (RQA):
 Recurrence rate, determinism, average/maximum diagonal length, divergence, laminarity, trend, entropy, trapping time, average/maximum vertical length.
 Finetuning of the algorithms that compute the above (e.g. Theiler window and many more)
 Windowed versions of the above
InteractiveChaos
InteractiveChaos
is a package that provides applications for interactively exploring dynamical systems. It is an extension of DynamicalSystems.jl and builds upon existing code by hooking up to the DynamicalSystem
structure.
InteractiveChaos
is not installed with DynamicalSystems.jl. To install it do ]add InteractiveChaos Makie
. Makie
is necessary for providing a plotting backend, since InteractiveChaos
does not install one by default.
The functionality of InteractiveChaos
is contained within individual functions, all of which launch a dedicated interactive application. Here is their list:
Videos & Animations
Besides the documentation strings, each interactive function is accompanied with an animation (.gif
or .mp4
file) displayed after the docstring, as well as a video tutorial demonstrating its use. See the individual pages for the video links (by clicking the documentation string links)!
Our Goals
The ultimate goal for DynamicalSystems.jl is to be a useful software library for students and scientists working on chaos, nonlinear dynamics and in general dynamical systems. The word "library" is intended in the literal sense: a place where people go to learn things.
With DynamicalSystems.jl we try to
 Be concise, intuitive, and general. All functions we offer work just as well with any system, whether it is a simple continuous chaotic system, like the Lorenz attractor, or a high dimensional discrete map like coupled standard maps.
 Be accurate, reliable and performant.
 Be transparent with respect to what is happening "under the hood", i.e. be clear about exactly what each function call does. We take care of this aspect in many ways; by being welldocumented, giving references to scientific papers and having clear source code.
Installation
Simply use ]add DynamicalSystems
to install everything. Alternatively you can also do using Pkg; Pkg.add("DynamicalSystems")
.
For more advanced users, you can choose which packages to install and use at a high level. The package DynamicalSystems
serves two purposes: it reexports everything under a single module DynamicalSystems
and it also builds the documentation.
All packages depend on DelayEmbeddings
which defines core numeric data structures and methods. For example RecurrenceAnalysis
and TimeseriesPrediction
depend only on DelayEmbeddings
. Packages that require equations of motion also depend on DynamicalSystemsBase
, like for example ChaosTools
.
If you only need functionality of a specific package you can install only that one, e.g. ]add RecurrenceAnalysis
and only the minimum amount of requirements will be installed.
Citing
There is a (very small) paper associated with DynamicalSystems.jl. If we have helped you in research that led to a publication, please be kind enough to cite it, using the DOI 10.21105/joss.00598
or the following BiBTeX entry:
@article{Datseris2018, doi = {10.21105/joss.00598}, url = {https://doi.org/10.21105/joss.00598}, year = {2018}, month = {mar}, volume = {3}, number = {23}, pages = {598}, author = {George Datseris}, title = {DynamicalSystems.jl: A Julia software library for chaos and nonlinear dynamics}, journal = {Journal of Open Source Software} }
Issues with Bounties
Money that DynamicalSystems.jl obtains from awards, sponsors or donators are converted into bounties for GitHub issues. The full list of issues that have a bounty is available here.
By solving these issues you not only contribute to open source, but you also get some pocket money to boot :)
Contacting
You can join our chatroom for discussions and/or questions about the packages of the JuliaDynamics organization! If you are using the Julia Slack workplace, please join the channel #dynamicsbridged
.
Contributing & Donating
Be sure to visit the Contributor Guide page, because you can help make this package better without having to write a single line of code! Also, if you find this package helpful please consider staring it on GitHub! This gives us an accurate lower bound of users that this package has already helped!
Finally, you can donate for the development of DynamicalSystems.jl. You can do that by adding bounties to existing issues on the GitHub repositories (you can open new issues as well). Every issue has an automatic way to create a bounty using Bountysource, see the first comment of each issue.