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 имеет встроенные функции анализа, в том числе следующие:
-
Прямой и сопряженный анализ чувствительности (автоматическое дифференцирование) для быстрых градиентных вычислений
-
Нейронные дифференциальные уравнения с DiffEqFlux.jl для эффективного научного машинного обучения (scientific ML) и научного ИИ.
-
Автоматическое распределенное, многопоточное и параллельное ансамблевое моделирование с GPU
Сотрудничество
-
Если вы заинтересованы в участии в проекте, ознакомьтесь с документацией разработчика.
-
См. SciML ColPrac:https://github.com/SciML/ColPrac/blob/master/README.md[]руководство по совместной работе над пакетами сообщества — сведения о PR, проблемах и других вопросах, связанным с участием в разработке в SciML.
-
См. Руководство по стилю SciML с общепринятыми методами кодирования и другими стилевыми решениями.
-
Существует несколько форумов сообщества:
-
Каналы #diffeq-bridged и #sciml-bridged в Julia Slack
-
Каналы #diffeq-bridged и #sciml-bridged в Julia Zulip
-
Форумы обсуждений Julia
-
См. также страницу сообщества SciML
-
Поддержка и цитирование
Программное обеспечение данной экосистемы было разработано в рамках академических исследований. Если вы хотите поддержать его, поставьте звездочку в репозитории, поскольку такие показатели могут помочь нам получить финансирование в будущем. Если вы используете программное обеспечение 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. Дополнительные примеры можно найти в интерактивных скриптах IJulia в папке примеров.
Удаление и уменьшение времени компиляции
В некоторых ситуациях может потребоваться сократить время компиляции, связанное с использованием 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)