Обзор DifferentialEquations.jl
Определение задач
Задачи задаются через интерфейс типов. Типы задач разработаны так, чтобы содержать необходимую информацию для полного определения соответствующего дифференциального уравнения. Каждый тип задачи имеет страницу с описанием типа задачи и связанных особенностей. Например, обыкновенное дифференциальное уравнение определяется следующим образом:
за некоторый интервал времени tspan
с некоторым начальным условием u0
, и поэтому ODEProblem
определяется этими компонентами:
prob = ODEProblem(f, u0, tspan)
prob = ODEProblem(f, u0, tspan, p)
Обратите внимание, что числовые типы в решении будут соответствовать типам, указанным в задаче. Например, если использовать Rational{BigInt}
для задания временного диапазона и BigFloat
для задания начального условия, решение будет выполняться с использованием Rational{BigInt}
для временных шагов и BigFloat
для независимых переменных. С решателями совместимы самые разнообразные числовые типы, такие как комплексные числа, единичные числа (через Unitful.jl), десятичные числа (через DecFP), дуальные числа и многие другие, которые, возможно, еще не были протестированы (благодаря силе множественной диспетчеризации). Информацию о совместимости типов можно найти на страницах решателей для конкретных задач.
Решение задач
Каждому типу дифференциальных уравнений соответствует свой тип задачи, что позволяет направлять решатели в нужные методы. Общий интерфейс для вызова решателей выглядит следующим образом:
sol = solve(prob, alg; kwargs)
В команду передается определенная задача дифференциального уравнения prob
, по желанию выбирается алгоритм alg
(если он не выбран, используется заданный по умолчанию) и с помощью именованных аргументов изменяются свойства решателя. Общие аргументы, которые принимаются большинством методов, определены на странице руководства по общим параметрам решателя. Решатель возвращает объект решения sol
, в котором хранятся все детали решения.
Анализ решения
Используя объект решения, вы выполняете анализ так, как вам удобно. Тип решения имеет общий интерфейс, что унифицирует работу с решением для разных типов дифференциальных уравнений. Такие инструменты, как интерполяция, легко встраиваются в интерфейс решения, что упрощает проведение анализа. Этот интерфейс описан на странице руководства по работе с решениями.
Функциональность построения графиков реализуется за счет шаблонов в Plots.jl. Для использования графических решений достаточно вызвать plot(sol)
, и построитель сгенерирует соответствующие графики. Если использовался аргумент save_everystep
, с помощью команды animate(sol)
построители могут генерировать анимации решений эволюционных уравнений. Для настройки графиков можно использовать все именованные аргументы, доступные в Plots.jl. Дополнительные сведения см. в документации по Plots.jl.
Инструменты надстройки
Одной из наиболее привлекательных возможностей DifferentialEquations.jl является то, что общий интерфейс решателей позволяет создавать инструменты, которые не зависят от алгоритмов и задач. Например, один из предоставляемых инструментов позволяет выполнять оценку параметров для ODEProblem
. Поскольку интерфейс solve
одинаков для разных алгоритмов, можно использовать любой из соответствующих алгоритмов решения. Такая модульная структура разрешает сочетать универсальные средства анализа со специализированными алгоритмами для решения конкретной задачи, что обеспечивает высокую производительность при большой функциональной базе. Разве это не исполнение обещания Julia?
Инструменты разработки и тестирования
Наконец, уникальной особенностью DifferentialEquations.jl является наличие функциональности разработки и тестирования алгоритмов. Этот пакет был разработан исследователями в области численных дифференциальных уравнений как для апробации новых идей, так и для распространения готовых результатов среди больших аудиторий. Средства разработки алгоритмов позволяют легко тестировать сходимость, проводить сопоставительный анализ и анализ более высокого порядка (построение графиков устойчивости и т. д.). Это одна из причин, по которой в DifferentialEquations.jl содержится множество уникальных алгоритмов, являющихся результатами последних публикаций. Более подробную информацию об использовании средств разработки можно найти в документации разработчика.
Обратите внимание, что DifferentialEquations.jl допускает распределенную разработку, то есть алгоритмы, подключаемые к экосистеме, не обязательно должны входить в состав основных пакетов. Если вы заинтересованы в том, чтобы добавить свою работу в экосистему, ознакомьтесь с документацией разработчика для получения дополнительной информации.