DifferentialEquations.jl: эффективное решение дифференциальных уравнений в Julia

Это пакет для численного решения дифференциальных уравнений, написанный на языке Julia и доступный для использования в Julia, Python и R. Цель этого пакета — предоставить эффективные реализации Julia решателей для различных дифференциальных уравнений. К уравнениям, входящим в сферу действия данного пакета, относятся следующие:

  • Дискретные уравнения (карты функций, дискретные стохастические (Гиллеспи/Маркова) моделирования)

  • Обыкновенные дифференциальные уравнения (ODE)

  • ODE с расщеплением и разбиением (симплектические интеграторы, методы IMEX)

  • Стохастические обыкновенные дифференциальные уравнения (SODE или SDE)

  • Стохастические дифференциально-алгебраические уравнения (SDAE)

  • Случайные дифференциальные уравнения (RODE или RDE)

  • Дифференциально-алгебраические уравнения (DAE)

  • Дифференциальные уравнения с задержкой (DDE)

  • Нейтральные, дифференциальные уравнения с задержкой и алгебраические дифференциальные уравнения с задержкой (NDDE, RDDE и DDAE)

  • Стохастические дифференциальные уравнения с задержкой (SDDE)

  • Экспериментальная поддержка стохастических нейтральных дифференциальных уравнений с задержкой и алгебраической задержкой (SNDDE, SRDDE и SDDAE)

  • Смешанные дискретные и непрерывные уравнения (гибридные уравнения, прыжковые диффузии)

  • (Стохастические) дифференциальные уравнения в частных производных ((S)PDE) (с использованием как конечно-разностных методов, так и методов конечных элементов)

Хорошо оптимизированные решатели DifferentialEquations являются одними из самых быстрых реализаций, используют классические алгоритмы и алгоритмы из последних исследований, которые превосходят «стандартные» методы C/Fortran, а также включают алгоритмы, оптимизированные для приложений высокой точности и высокопроизводительных вычислений. В то же время в него инкапсулированы классические методы C/Fortran, что позволяет легко переключиться на них в случае необходимости. Решение дифференциальных уравнений с помощью различных методов из разных языков и пакетов может быть выполнено путем изменения одной строки кода, что позволяет легко провести сравнительный анализ и убедиться в том, что используется самый быстрый метод из возможных.

DifferentialEquations.jl интегрируется со сферой пакета Julia благодаря следующим возможностям:

  • GPU-ускорение с помощью CUDA.jl и DiffEqGPU.jl

  • Автоматическое определение разреженности с помощью Symbolics.jl

  • Автоматическая раскраска якобианов с помощью SparseDiffTools.jl, позволяющая быстро решать задачи с разреженными или структурированными (тридиагональными, ленточными, блочно-ленточными и т. д.) якобианами

  • Возможность задания линейных решателей для достижения максимальной эффективности с помощью LinearSolve.jl.

  • Интеграция индикатора хода выполнения с IDE Visual Studio Code для оценки времени решения

  • Автоматическое построение временных рядов и фазовых графиков

  • Встроенные интерполяции

  • Оболочки для распространенных методов C/Fortran, таких как Sundials и радо Хайрера

  • Произвольная точность с BigFloats и Arbfloats

  • Произвольные типы массивов, позволяющие определять дифференциальные уравнения в матрицах и распределенных массивах

  • Арифметика с проверкой единиц с Unitfu

Кроме того, DifferentialEquations.jl имеет встроенные функции анализа, в том числе следующие:

Сотрудничество

Поддержка и цитирование

Программное обеспечение данной экосистемы было разработано в рамках академических исследований. Если вы хотите поддержать его, поставьте звездочку в репозитории, поскольку такие показатели могут помочь нам получить финансирование в будущем. Если вы используете программное обеспечение SciML в своей научной, преподавательской или иной деятельности, мы будем признательны, если при применении DifferentialEquations.jl или пакетов, входящих в его состав (OrdinaryDiffEq.jl, Sundials.jl, DiffEqDevTools.jl и др.), вы будете при необходимости ссылаться на наши работы.

@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}
}

Кроме того, многие решатели применяют новые алгоритмы, и если эти алгоритмы используются, мы просим приводить ссылки на эти методы. Рекомендации по цитированию см. на соответствующей странице.

Начало работы

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

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

Удаление и уменьшение времени компиляции

В некоторых ситуациях может потребоваться сократить время компиляции, связанное с использованием DifferentialEquations.jl. В этом случае можно применить две стратегии. Одна из стратегий заключается в низком использовании зависимостей. DifferentialEquations.jl — это метапакет, состоящий из множества более мелких пакетов, поэтому можно напрямую использовать один компонент, например OrdinaryDiffEq.jl для чистых решателей ODE Julia, и сократить время компиляции, игнорируя остальные (обратите внимание: интерфейс точно такой же, только использование решателей, отличных от тех, что находятся в OrdinaryDiffEq.jl, приведет к ошибке). Рекомендуется, чтобы нижележащие пакеты использовали только те пакеты, которые им необходимы.

Другая стратегия заключается в применении PackageCompiler.jl для создания образа системы, который предварительно компилирует весь пакет. Для этого достаточно сделать следующее.

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

Следует отметить, что добавление пакета в образ системы имеет некоторые недостатки. Например, пакет не будет обновляться до тех пор, пока вы не перестроите образ системы вручную. Подробнее о последствиях можно прочитать в этой части руководства по PackageCompiler.

Основы

На этих страницах содержатся вводные сведения о DifferentialEquations.jl и общем интерфейсе. В указанной части описывается общий порядок работы, общедоступные опции и общие инструменты для анализа.

Типы задач

На этих страницах описывается построение типов задач для определения дифференциальных уравнений для решателей, а также рассматриваются особенности различных типов решений.

Дополнительные функции

В этих разделах рассматриваются дополнительные возможности повышения производительности, обработка событий и другие особенности.

Дополнительные сведения

Это лишь некоторые дополнительные пояснения для любопытных пользователей.

Благодарности

Основные авторы

JuliaDiffEq и DifferentialEquations.jl — это результат совместной работы многих людей. Значительный вклад внесли следующие лица:

 — Крис Ракаукас (Chris Rackauckas) (@ChrisRackauckas) (ведущий разработчик)  — Йингбо Ма (Yingbo Ma) (@YingboMa)  — Дэвид Видманн (David Widmann) (@devmotion)  — Хендрик Раноча (Hendrik Ranocha) (@ranocha)  — Этан Левиен (Ethan Levien) (@elevien)  — Том Шорт (Tom Short) (@tshort)  — @dextorious  — Самуэль Айзексон (Samuel Isaacson) (@isaacsas)

Выпускники программы Google Summer of Code

 — Йингбо Ма (Yingbo Ma) (@YingboMa)  — Шивин Шривастава (Shivin Srivastava) (@shivin9)  — Аюш Панди (Ayush Pandey) (@Ayush-iitkgp)  — Синьцзянь Го (Xingjian Guo) (@MSeeker1340)  — Шубхам Маддхашия (Shubham Maddhashiya) (@sipah00)  — Вайбхав Кумар Диксит (Vaibhav Kumar Dixit) (@Vaibhavdixit02)