Документация Engee

Решатели ODE

solve(prob::ODEProblem,alg;kwargs)

Решает ODE, указанное в аргументе prob, с использованием алгоритма alg. Если алгоритм не указан, будет выбран алгоритм по умолчанию.

Рекомендуемые методы

Для выбора алгоритма рекомендуется использовать именованный аргумент alg_hints. Однако в некоторых случаях может требоваться какой-то определенный алгоритм или у вас может возникнуть желание поэкспериментировать. Это руководство поможет вам в выборе подходящего алгоритма.

Задачи с неизвестной жесткостью

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

Если достаточно погрешностей по умолчанию, хорошим выбором будет AutoTsit5(Rosenbrock23()). Для более низких погрешностей может подойти решатель AutoVern7 или AutoVern9 с Rodas4, KenCarp4 или Rodas5P в зависимости от задачи. Для очень больших систем (>1000 ODEs?) рекомендуется использовать lsoda.

Нежесткие задачи

Для нежестких задач собственные алгоритмы OrdinaryDiffEq.jl гораздо более эффективны, чем другие варианты. Для большинства нежестких задач мы рекомендуем Tsit5. Если требуется более точно контролировать погрешности, хорошим вариантом будет BS5. Если при умеренных погрешностях очень важна погрешность интерполяции, обратите внимание на метод OwrenZen5. Для быстрого решения с более высокими погрешностями мы рекомендуем использовать BS3 (или OwrenZen3, если важна погрешность интерполяции). Для обеспечения высокой точности в диапазоне Float64 (~1e-8-1e-12) в качестве эффективных вариантов мы рекомендуем Vern6, Vern7 или Vern8. Для очень небольших нежестких ODE существует решатель SimpleATsit5() (входит в состав пакета SimpleDiffEq), который представляет собой упрощенную реализацию Tsit5, позволяющую избежать лишних накладных расходов и рекомендуемую в подобных сценариях.

Для решения нежестких ODE с высокой точностью (BigFloat с погрешностями на уровне <1e-12) мы рекомендуем метод Vern9. Если требуется метод высокого порядка с интерполянтом высокого порядка, следует использовать решатель Vern9, имеющий порядок 9 с интерполянтом порядка 9. Если нужна очень высокая точность (<1e-30), но в интерполянте нет необходимости, попробуйте метод Feagin12 или Feagin14. Имейте в виду, что методы Фиджина — это единственные оптимизированные методы высокого порядка без интерполянта высокого порядка (при необходимости в них включается эрмитова интерполяция третьего порядка). Обратите внимание, что эти методы Рунге-Кутты высокого порядка более надежны в точках разрыва, чем методы Адамса-Башфорта высокого порядка, обеспечивают очень высокую точность и гораздо эффективнее, чем экстраполяционные методы. Однако метод VCABM может обеспечивать высокую точность, когда система уравнений очень большая (>1,000 ODE), вычисление функции требует больших затрат либо решение очень гладкое.

Если требуются строгие границы погрешности, необходимы адаптивные методы с контролем дефектов. Контроль дефектов предполагает измерение погрешности на интерполяционном многочлене для более точного определения погрешности на всем интервале. Для расчетов средней точности хорошим выбором будет RK4.

Жесткие задачи

Для жестких задач с большими погрешностями (>1e-2) рекомендуется использовать Rosenbrock23 или TRBDF2. Это надежные методы для задач с колебаниями и высокой жесткостью, хотя эффективны они, только когда требуется низкая точность. Решатель Rosenbrock23 более эффективен для небольших систем, повторное вычисление и разложение якобиана которых не требует слишком больших затрат. Для достаточно больших систем решатель TRBDF2 будет эффективнее. QNDF или FBDF могут оказаться самыми эффективными методами для очень больших систем или функций f, вычисление которых требует наибольших затрат.

При средних погрешностях (>1e-8) рекомендуется использовать Rodas5P, Rodas4P (первый вариант эффективнее, а второй надежнее), Kvaerno5 или KenCarp4. Так как это собственные решатели DifferentialEquations.jl, они поддерживают многие числовые типы Julia (такие как BigFloats, ArbFloats или DecFP). Когда уравнение определено посредством макроса @ode_def, они будут наиболее эффективны.

Для более быстрого решения задач с малыми погрешностями (<1e-9) при использовании Vector{Float64} применяйте radau.

Для асимптотически больших систем ODE (N>1000) с очень высокой вычислительной сложностью f и минимальными комплексными собственными значениями (слабые колебания) наиболее эффективными будут методы QNDF и FBDF. QNDF и FBDF также могут показывать неожиданно хорошие результаты, если решение гладкое. Однако данные методы хуже справляются с жесткостью по сравнению с другими методами, а ньютоновы итерации могут не достигать результата в ситуациях низкой точности. В этом режиме другими методами, на которые стоит обратить внимание, являются CVODE_BDF и lsoda.

Особые свойства жестких интеграторов

ImplicitMidpoint — это симметричный симплектический интегратор. Trapezoid — это симметричный (почти симплектический) интегратор с адаптивными временными шагами. ImplicitEuler — это расширение стандартного алгоритма с адаптивными временными шагами и эффективным повторным использованием квазиньютоновского якобиана, который полностью сохраняет сильную устойчивость в случае с гиперболическими PDE.

Имейте в виду, что Rodas4 теряет точность при дискретизации нелинейных параболических PDE, поэтому в случае с такими уравнениями третьего порядка рекомендуется использовать вместо него Rodas4P. То же самое касается решателей Rodas5 и Rodas5P. ROS3P является решателем третьего порядка и достигает третьего порядка при решении таких задач, поэтому в подобных случаях может быть более эффективным.

Преобразования из MATLAB/Python/R

Пользователи, знакомые с MATLAB, Python или R, могут ориентироваться на следующие сопоставления методов стандартной библиотеки:

  • ode23

BS3()

  • ode45/dopri5

DP5(), хотя в большинстве случаев Tsit5() эффективнее

  • ode23s

Rosenbrock23(), хотя в большинстве случаев Rodas4() эффективнее

  • ode113

VCABM(), хотя во многих случаях Vern7() эффективнее

  • dop853

DP8(), хотя в большинстве случаев Vern7() эффективнее

  • ode15s/vode

QNDF() или FBDF(), хотя во многих случаях Rodas4(), KenCarp4(), TRBDF2() или RadauIIA5() эффективнее

  • ode23t

Trapezoid()

  • ode23tb

TRBDF2()

  • lsoda

lsoda(), хотя AutoTsit5(Rosenbrock23()) или AutoVern7(Rodas5()) могут быть эффективнее. Обратите внимание, что решателю lsoda() требуется расширение LSODA.jl, которое можно добавить посредством ]add LSODA; using LSODA.

  • ode15i

IDA() или DFBDF(), хотя во многих случаях Rodas4() может обрабатывать DAE и работает гораздо эффективнее.

Полный список методов

OrdinaryDiffEq.jl для нежестких уравнений

Если не указано иное, все алгоритмы OrdinaryDiffEq поставляются с эрмитовой полиномиальной интерполяцией третьего порядка. Алгоритмам, обозначенным как имеющие «свободную» интерполяцию, не требуются дополнительные шаги для интерполяции. Для функций более высокого порядка с несвободной интерполяцией дополнительные шаги выполняются «ленивым» способом (то есть не во время решения).

Алгоритмы OrdinaryDiffEq.jl обеспечивают наиболее высокую производительность в случае с нежесткими уравнениями и в то же время являются наиболее универсальными: они принимают большинство типов на базе Julia, поддерживают сложную обработку событий и т. д. В случае с жесткими ODE эти алгоритмы также стабильно показывают высокие результаты. OrdinaryDiffEq.jl рекомендуется для большинства задач ODE.

Явные методы Рунге — Кутты

  • Euler — канонический прямой метод Эйлера. Только фиксированный временной шаг.

  • Midpoint — метод средней точки второго порядка. В целях адаптивности применяется встроенный метод Эйлера.

  • Heun — метод Гойна второго порядка. В целях адаптивности применяется встроенный метод Эйлера.

  • Ralston — оптимизированный метод средней точки второго порядка. В целях адаптивности применяется встроенный метод Эйлера.

  • RK4 — канонический метод Рунге — Кутты четвертого порядка. Для обеспечения адаптивных временных шагов используется контроль дефектов с максимальной погрешностью по всему интервалу.

  • BS3 — метод Богацкого — Шампина третьего и второго порядков.

  • OwrenZen3 — оптимизированный интерполяционный метод Оурена — Зеннаро третьего и второго порядков (свободный интерполянт третьего порядка).

  • OwrenZen4 — оптимизированный интерполяционный метод Оурена — Зеннаро четвертого и третьего порядков (свободный интерполянт четвертого порядка).

  • OwrenZen5 — оптимизированный интерполяционный метод Оурена — Зеннаро пятого и четвертого порядков (свободный интерполянт пятого порядка).

  • DP5 — метод Дорманда — Принса пятого и четвертого порядков (вариант метода Рунге — Кутты) (свободный интерполянт четвертого порядка).

  • Tsit5 — метод Цитураса пятого и четвертого порядков (вариант метода Рунге — Кутты) (свободный интерполянт четвертого порядка).

  • Anas5(w) — метод Рунге — Кутты четвертого порядка для периодических задач. Требует оценки периодичности w: если она точна, метод становится методом пятого порядка (в противном случае он будет методом четвертого порядка с меньшей погрешностью для более точных результатов).

  • FRK65(w=0) — метод Рунге — Кутты шестого порядка с нулевым рассеянием. Принимает необязательный аргумент w для фазы периодичности; в этом случае метод дает нулевое числовое рассеяние.

  • PFRK87(w=0) — метод Рунге — Кутты восьмого порядка с подбором фазы. Принимает необязательный аргумент w для фазы периодичности; в этом случае метод дает нулевое числовое рассеяние.

  • RKO65 — 6-этапный метод Цитураса пятого порядка (вариант метода Рунге — Кутты — Оливера). Это надежный метод для задач с особой точкой при t=0.

  • TanYam7 — метод Танаки — Ямашиты седьмого порядка (вариант метода Рунге — Кутты).

  • DP8 — адаптация метода Дорманда — Принса (вариант метода Рунге — Кутты) от Хайрера с порядком 8/5/3 (интерполянт седьмого порядка).

  • TsitPap8 — метод Цитураса — Папакостаса восьмого и седьмого порядков (вариант метода Рунге — Кутты).

  • Feagin10 — метод Фиджина десятого порядка (вариант метода Рунге — Кутты).

  • Feagin12 — метод Фиджина двенадцатого порядка (вариант метода Рунге — Кутты).

  • Feagin14 — метод Фиджина четырнадцатого порядка (вариант метода Рунге — Кутты).

  • MSRK5 — метод Степанова пятого порядка (вариант метода Рунге — Кутты).

  • MSRK6 — метод Степанова шестого порядка (вариант метода Рунге — Кутты).

  • Stepanov5 — адаптивный метод Степанова пятого порядка (вариант метода Рунге — Кутты).

Пример использования:

alg = Tsit5()
solve(prob, alg)

Кроме того, следующие алгоритмы имеют «ленивый» интерполянт.

  • BS5 — метод Богацкого — Шампина пятого и четвертого порядков (вариант метода Рунге — Кутты) («ленивый» интерполянт пятого порядка).

  • Vern6 — «наиболее эффективный» метод Вернера шестого и пятого порядков (вариант метода Рунге — Кутты) («ленивый» интерполянт шестого порядка).

  • Vern7 — «наиболее эффективный» метод Вернера седьмого и шестого порядков (вариант метода Рунге — Кутты) («ленивый» интерполянт седьмого порядка).

  • Vern8 — «наиболее эффективный» метод Вернера восьмого и седьмого порядков (вариант метода Рунге — Кутты) («ленивый» интерполянт восьмого порядка)

  • Vern9 — «наиболее эффективный» метод Вернера девятого и восьмого порядков (вариант метода Рунге — Кутты) («ленивый» интерполянт девятого порядка).

Эти методы требуют нескольких дополнительных шагов для вычисления интерполяции высокого порядка, но они выполняются только при использовании интерполяции. При «ленивом» использовании этих методов предполагается, что вектор параметров p не изменяется с момента решения на интервале и до интерполяции. Если p изменяется в ContinuousCallback либо изменяется в DiscreteCallback при использовании непрерывного решения после полного решения, задайте lazy=false.

Пример:

solve(prob, Vern7()) # по умолчанию «ленивое» выполнение
solve(prob, Vern7(lazy = false))

Параллельные явные методы Рунге — Кутты

  • KuttaPRK2p5 — явный метод Рунге — Кутты пятого порядка со степенью параллелизма 5, выполняемый на двух процессорах.

Эти методы используют многопоточность при вызовах f с целью распараллеливания задачи. При этом требуется, чтобы одновременные вызовы f были потокобезопасными.

Явные методы Рунге — Кутты сохранения сильной устойчивости для гиперболических PDE (законы сохранения)

  • SSPRK22 — двухэтапный метод Чу и Ошера второго порядка с сохранением сильной устойчивости (SSP) (коэффициент SSP 1, свободный интерполянт SSP второго порядка). Только фиксированный временной шаг.

  • SSPRK33 — трехэтапный метод Чу и Ошера третьего порядка с сохранением сильной устойчивости (SSP) (коэффициент SSP 1, свободный интерполянт SSP второго порядка). Только фиксированный временной шаг.

  • SSPRK53 — пятиэтапный метод Руута третьего порядка с сохранением сильной устойчивости (SSP) (коэффициент SSP 2,65, свободный эрмитов интерполянт третьего порядка). Только фиксированный временной шаг.

  • SSPRK63 — шестиэтапный метод Руута третьего порядка с сохранением сильной устойчивости (SSP) (коэффициент SSP 3,518, свободный эрмитов интерполянт третьего порядка). Только фиксированный временной шаг.

  • SSPRK73 — семиэтапный метод Руута третьего порядка с сохранением сильной устойчивости (SSP) (коэффициент SSP 4,2879, свободный эрмитов интерполянт третьего порядка). Только фиксированный временной шаг.

  • SSPRK83 — восьмиэтапный метод Руута третьего порядка с сохранением сильной устойчивости (SSP) (коэффициент SSP 5,107, свободный эрмитов интерполянт третьего порядка). Только фиксированный временной шаг.

  • SSPRK432 — пятиэтапный адаптивный метод третьего и второго порядков с сохранением сильной устойчивости (SSP) (коэффициент SSP 2, свободный интерполянт SSP второго порядка).

  • SSPRK43 — пятиэтапный адаптивный метод третьего и второго порядков с сохранением сильной устойчивости (SSP) (коэффициент SSP 2, свободный интерполянт SSP второго порядка). Основной метод такой же, как и у SSPRK432, но встроенный метод имеет более широкую область устойчивости.

  • SSPRK932 — девятиэтапный адаптивный метод третьего и второго порядков с сохранением сильной устойчивости (SSP) (коэффициент SSP 6, свободный интерполянт SSP третьего порядка).

  • SSPRK54 — пятиэтапный метод Спитери и Руута четвертого порядка с сохранением сильной устойчивости (SSP) (коэффициент SSP 1,508, свободный эрмитов интерполянт третьего порядка). Только фиксированный временной шаг.

  • SSPRK104 — десятиэтапный метод Кетчесона четвертого порядка с сохранением сильной устойчивости (SSP) (коэффициент SSP 6, свободный эрмитов интерполянт третьего порядка). Только фиксированный временной шаг.

  • SSPRKMSVS32 — трехэтапный линейный многошаговый метод второго порядка, оптимальный по SSP (коэффициент SSP 0,5, эрмитов интерполянт третьего порядка). Только фиксированный временной шаг.

  • SSPRKMSVS43 — четырехэтапный линейный многошаговый метод третьего порядка, оптимальный по SSP (коэффициент SSP 0,33, эрмитов интерполянт третьего порядка). Только фиксированный временной шаг.

Коэффициенты SSP методов можно запросить с помощью ssp_coefficient(alg). Явные методы SSP принимают два необязательных аргумента: SSPXY(stage_limiter!, step_limiter!), где stage_limiter! и step_limiter — функции, принимающие аргументы вида limiter!(u, integrator, p, t). Здесь u — новое значение решения (обновляемое на месте) после явного этапа Эйлера или всего временного шага, integrator — интегратор ODE, а t — текущее время. С помощью этих ограничителей можно применять физические ограничения, например ограничители сохранения положительности Чжана и Чу (Чжан, Сянсюн и Чи-Ванг Чу: Maximum-principle-satisfying and positivity-preserving high-order schemes for conservation laws: survey and new developments (Соответствующие принципу максимума и сохраняющие положительность схемы высокого порядка для законов сохранения: обзор и новые результаты). Труды Лондонского королевского общества, серия A: математика, физические и инженерные науки. The Royal Society, 2011 г.).

Методы с низкой емкостью

  • ORK256 — пятиэтапный метод второго порядка с низкой емкостью для уравнений распространения волны. Только фиксированный временной шаг. Как и методы SSPRK, ORK256 также принимает необязательные аргументы stage_limiter! и step_limiter!, где stage_limiter! и step_limiter! — функции вида limiter!(u, integrator, p, t).

  • SSPRK53_2N1 и SSPRK53_2N2 — пятиэтапные методы третьего порядка с низкой емкостью и большими коэффициентами SSP (коэффициенты SSP 2,18 и 2,15, эрмитов интерполянт третьего порядка). Только фиксированный временной шаг.

  • CarpenterKennedy2N54 — пятиэтапный метод Карпентера и Кеннеди четвертого порядка с низкой емкостью (свободный эрмитов интерполянт третьего порядка). Только фиксированный временной шаг. Предназначен для гиперболических PDE (свойства устойчивости). Как и методы SSPRK, CarpenterKennedy2N54 также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • NDBLSRK124 — двенадцатиэтапный метод четвертого порядка с низкой емкостью и оптимизированными областями устойчивости для задач с доминирующей ролью адвекции. Только фиксированный временной шаг. Как и методы SSPRK, NDBLSRK124 также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • NDBLSRK134 — тринадцатиэтапный метод четвертого порядка с низкой емкостью и оптимизированными областями устойчивости для задач с доминирующей ролью адвекции. Только фиксированный временной шаг. Как и методы SSPRK, NDBLSRK134 также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • NDBLSRK144 — четырнадцатиэтапный метод четвертого порядка с низкой емкостью и оптимизированными областями устойчивости для задач с доминирующей ролью адвекции. Только фиксированный временной шаг. Как и методы SSPRK, NDBLSRK144 также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • CFRLDDRK64 — шестиэтапная схема четвертого порядка с низкой емкостью, слабым рассеянием и слабой дисперсией. Только фиксированный временной шаг.

  • TSLDDRK74 — семиэтапная схема четвертого порядка с низкой емкостью, слабым рассеянием и слабой дисперсией, обладающая максимальными точностью и пределом устойчивости по мнимым осям. Только фиксированный временной шаг.

  • DGLDDRK73_C — семиэтапная схема третьего порядка с низкой емкостью, слабым рассеянием и слабой дисперсией для дискретизации разрывных пространств Галёркина, применяемая к задачам распространения волны и оптимизированная для дискретизации PDE с малым максимальным пространственным шагом вследствие геометрических характеристик расчетной области. Только фиксированный временной шаг. Как и методы SSPRK, DGLDDRK73_C также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • DGLDDRK84_C — восьмиэтапная схема четвертого порядка с низкой емкостью, слабым рассеянием и слабой дисперсией для дискретизации разрывных пространств Галёркина, применяемая к задачам распространения волны и оптимизированная для дискретизации PDE с малым максимальным пространственным шагом вследствие геометрических характеристик расчетной области. Только фиксированный временной шаг. Как и методы SSPRK, DGLDDRK84_C также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • DGLDDRK84_F — восьмиэтапная схема четвертого порядка с низкой емкостью, слабым рассеянием и слабой дисперсией для дискретизации разрывных пространств Галёркина, применяемая к задачам распространения волны и оптимизированная для дискретизации PDE с неограниченным максимальным размером пространственного шага. Только фиксированный временной шаг. Как и методы SSPRK, DGLDDRK84_F также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • SHLDDRK64 — шестиэтапная схема четвертого порядка с низкой емкостью, слабым рассеянием и слабой дисперсией. Только фиксированный временной шаг. Как и методы SSPRK, SHLDDRK64 также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • RK46NL — шестиэтапная схема четвертого порядка с низкой емкостью, слабым рассеянием и слабой дисперсией. Только фиксированный временной шаг.

  • ParsaniKetchesonDeconinck3S32 — трехэтапная схема второго порядка (3S) с низкой емкостью, оптимизированная для метода спектрального различия, который применяется к задачам распространения волны.

  • ParsaniKetchesonDeconinck3S82 — восьмиэтапная схема второго порядка (3S) с низкой емкостью, оптимизированная для метода спектрального различия, который применяется к задачам распространения волны.

  • ParsaniKetchesonDeconinck3S53 — пятиэтапная схема третьего порядка (3S) с низкой емкостью, оптимизированная для метода спектрального различия, который применяется к задачам распространения волны.

  • ParsaniKetchesonDeconinck3S173 — семнадцатиэтапная схема третьего порядка (3S) с низкой емкостью, оптимизированная для метода спектрального различия, который применяется к задачам распространения волны.

  • ParsaniKetchesonDeconinck3S94 — девятиэтапная схема четвертого порядка (3S) с низкой емкостью, оптимизированная для метода спектрального различия, который применяется к задачам распространения волны.

  • ParsaniKetchesonDeconinck3S184 — восемнадцатиэтапная схема четвертого порядка (3S) с низкой емкостью, оптимизированная для метода спектрального различия, который применяется к задачам распространения волны.

  • ParsaniKetchesonDeconinck3S105 — десятиэтапная схема пятого порядка (3S) с низкой емкостью, оптимизированная для метода спектрального различия, который применяется к задачам распространения волны.

  • ParsaniKetchesonDeconinck3S205 — двадцатиэтапная схема пятого порядка (3S) с низкой емкостью, оптимизированная для метода спектрального различия, который применяется к задачам распространения волны.

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

  • CKLLSRK54_3C — пятиэтапная схема четвертого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK95_4S — девятиэтапная схема пятого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK95_4C — девятиэтапная схема пятого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK95_4M — девятиэтапная схема пятого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK54_3C_3R — пятиэтапная схема четвертого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK54_3M_3R — пятиэтапная схема четвертого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK54_3N_3R — пятиэтапная схема четвертого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK85_4C_3R — восьмиэтапная схема пятого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK85_4M_3R — восьмиэтапная схема пятого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK85_4P_3R — восьмиэтапная схема пятого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK54_3N_4R — пятиэтапная схема четвертого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK54_3M_4R — пятиэтапная схема четвертого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK65_4M_4R — шестиэтапная схема пятого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK85_4FM_4R — восьмиэтапная схема пятого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • CKLLSRK75_4M_5R — семиэтапная схема пятого порядка с низкой емкостью, оптимизированная для уравнений Навье — Стокса для сжимаемого газа.

  • RDPK3Sp35 — пятиэтапная схема третьего порядка с низкой емкостью и встроенным средством оценки погрешности, оптимизированная для задач механики сжимаемых жидкостей. Как и методы SSPRK, этот метод также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • RDPK3SpFSAL35 — пятиэтапная схема третьего порядка с низкой емкостью и встроенным средством оценки погрешности, оптимизированная для задач механики сжимаемых жидкостей. Как и методы SSPRK, этот метод также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • RDPK3Sp49 — девятиэтапная схема четвертого порядка с низкой емкостью и встроенным средством оценки погрешности, оптимизированная для задач механики сжимаемых жидкостей. Как и методы SSPRK, этот метод также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • RDPK3SpFSAL49 — девятиэтапная схема четвертого порядка с низкой емкостью и встроенным средством оценки погрешности, оптимизированная для задач механики сжимаемых жидкостей. Как и методы SSPRK, этот метод также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • RDPK3Sp510 — десятиэтапная схема пятого порядка с низкой емкостью и встроенным средством оценки погрешности, оптимизированная для задач механики сжимаемых жидкостей. Как и методы SSPRK, этот метод также принимает необязательные аргументы stage_limiter! и step_limiter!.

  • RDPK3SpFSAL510 — десятиэтапная схема пятого порядка с низкой емкостью и встроенным средством оценки погрешности, оптимизированная для задач механики сжимаемых жидкостей. Как и методы SSPRK, этот метод также принимает необязательные аргументы stage_limiter! и step_limiter!.

ПРИМЕЧАНИЕ. Все методы 2N (ORK256, CarpenterKennedy2N54, NDBLSRK124, NDBLSRK134, NDBLSRK144, DGLDDRK73_C, DGLDDRK84_C, DGLDDRK84_F и SHLDDRK64) основаны на том базовом принципе, что они могут выполнять шаг S1 = S1 + F(S2) всего в двух регистрах. Для достижения этого теоретического предела (при задании alias_u0) был реализован ряд оптимизаций, однако они предполагают одно ограничение: переменная du всегда должна находиться в левой части (только при присваивании).

Пример недопустимой реализации для методов 2N:

function f(du, u, p, t)
    du[1] = u[1] * u[2]
    du[2] = du[1] * u[2] # du находится в правой части
end

Если вы не хотите использовать оптимизации и вам нужно поставить переменную du в правую часть, присвойте именованному аргументу williamson_condition значение false в алгоритме (по умолчанию он имеет значение true). В таком случае потребуется три регистра памяти.

Пример:

alg = CarpenterKennedy2N54(; williamson_condition = false)

В таком виде представленная выше реализация f будет допустима.

Параллельные явные методы Рунге — Кутты

Ниже перечислены экстраполяционные методы адаптивного порядка с адаптивным размером шага.

  • AitkenNeville — экстраполяция Эйлера с использованием алгоритма Айткена-Невилла с последовательностью Ромберга.

  • ExtrapolationMidpointDeuflhard — экстраполяция средней точки с использованием барицентрических координат.

  • ExtrapolationMidpointHairerWanner — экстраполяция средней точки с использованием барицентрических координат и адаптивностью согласно алгоритму Хайрера ODEX.

У этих методов есть аргументы max_order, min_order и init_order, связанные с алгоритмом адаптивного порядка. sequence_factor указывает, какое четное кратное последовательности следует взять при вычислении внутренних дискретизаций. threading указывает, следует ли автоматически производить вычисление f в многопоточном режиме, что обеспечивает более высокую степень параллелизма внутри метода. Значения по умолчанию:

  • max_order=10

  • min_order=1, кроме метода ExtrapolationMidpointHairerWanner, для которого принято значение 2.

  • init_order=5

  • threading=true

  • sequence_factor = 2

Кроме того, у методов ExtrapolationMidpointDeuflhard и ExtrapolationMidpointHairerWanner есть дополнительные аргументы:

  • sequence: последовательность номеров шагов, также называемая последовательностью разбиения. Возможные значения: :harmonic, :romberg и :bulirsch. Значение по умолчанию — :harmonic.

Чтобы переопределить его, используйте именованные аргументы. Например:

alg = ExtrapolationMidpointDeuflhard(max_order = 7, min_order = 4, init_order = 4,
                                     sequence = :bulirsch, threading = false)
solve(prob, alg)

Обратите внимание, что под порядком понимается порядок экстраполяции. Для AitkenNeville это порядок метода; в остальных случаях порядок экстраполяции n соответствует порядку метода 2(n+1).

Явные многошаговые методы

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

Явные методы Адамса — Башфорта

Эти методы требуют выбора dt.

  • AB3 — трехшаговый метод третьего порядка. Для расчета начальных значений применяется метод Ралстона второго порядка.

  • AB4 — четырехшаговый метод четвертого порядка. Для расчета начальных значений применяется метод Рунге — Кутты четвертого порядка.

  • AB5 — пятишаговый метод пятого порядка. Для расчета начальных значений применяется метод Рунге — Кутты четвертого порядка.

  • ABM32 — метод третьего порядка. В ABM32 AB3 выступает в роли предиктора, а двухшаговый метод Адамса — Мултона — в роли корректора. Для расчета начальных значений применяется метод Ралстона второго порядка.

  • ABM43 — метод четвертого порядка. В ABM43 AB4 выступает в роли предиктора, а трехшаговый метод Адамса — Мултона — в роли корректора. Для расчета начальных значений применяется метод Рунге — Кутты четвертого порядка.

  • ABM54 — метод пятого порядка. В ABM54 AB5 выступает в роли предиктора, а четырехшаговый метод Адамса — Мултона — в роли корректора. Для расчета начальных значений применяется метод Рунге — Кутты четвертого порядка.

Явные методы Адамса — Башфорта с адаптивным размером шага

  • VCAB3 — метод Адамса третьего порядка. Для расчета начальных значений применяется метод Богацкого — Шампина третьего и второго порядков.

  • VCAB4 — метод Адамса четвертого порядка. Для расчета начальных значений применяется метод Рунге — Кутты четвертого порядка.

  • VCAB5 — метод Адамса пятого порядка. Для расчета начальных значений применяется метод Рунге — Кутты четвертого порядка.

  • VCABM3 — метод Адамса — Мултона третьего порядка. Для расчета начальных значений применяется метод Богацкого — Шампина третьего и второго порядков.

  • VCABM4 — метод Адамса — Мултона четвертого порядка. Для расчета начальных значений применяется метод Рунге — Кутты четвертого порядка.

  • VCABM5 — метод Адамса — Мултона пятого порядка. Для расчета начальных значений применяется метод Рунге — Кутты четвертого порядка.

  • VCABM — метод Адамса — Мултона адаптивного порядка с адаптивным временем. Применяется алгоритм адаптивного порядка, взятый из метода Шампина DDEABM.

  • AN5 — адаптивный метод Адамса пятого порядка с фиксированным ведущим коэффициентом в форме Нордсика.

  • JVODE_Adams — метод Адамса адаптивного порядка с адаптивным временем и фиксированным ведущим коэффициентом в форме Нордсика. Алгоритм адаптивного порядка взят из метода Sundials CVODE_Adams. В разработке.

OrdinaryDiffEq.jl для жестких уравнений

Методы SDIRK

  • ImplicitEuler — неявный решатель первого порядка. A-, B- и L-устойчивый. Адаптивная дискретизация по времени благодаря оценке разделенных разностей с помощью памяти. Сохранение сильной устойчивости (SSP).

  • ImplicitMidpoint — A-устойчивый симплектический симметричный неявный решатель второго порядка. Подходит для крайне жестких уравнений, требующих симплектического интегрирования.

  • Trapezoid — A-устойчивый симметричный метод ESDIRK второго порядка. «Почти симплектический» без численного затухания. Также известен как метод Кранка — Николсон, когда применяется к дифференциальным уравнениям в частных производных (PDE). Адаптивная дискретизация по времени с помощью разделенных разностей в памяти. Подходит для крайне жестких уравнений, не являющихся осцилляционными.

  • TRBDF2 — A-, B-, L- и S-устойчивый одношаговый метод ESDIRK второго порядка. Включает надежную с точки зрения жесткости оценку погрешности для точной адаптивной дискретизации по времени, а также сглаженные производные для очень жестких осцилляционных задач.

  • SDIRK2 — A-, B- и L-устойчивый метод SDIRK второго порядка

  • Kvaerno3 — A- и L-устойчивый очень точный метод ESDIRK третьего порядка

  • KenCarp3 — A- и L-устойчивый очень точный метод ESDIRK третьего порядка с разбиением

  • Cash4 — A- и L-устойчивый метод SDIRK четвертого порядка

  • Hairer4 — A- и L-устойчивый метод SDIRK четвертого порядка

  • Hairer42 — A- и L-устойчивый метод SDIRK четвертого порядка

  • Kvaerno4 — A- и L-устойчивый очень точный метод ESDIRK четвертого порядка

  • KenCarp4 — A- и L-устойчивый очень точный метод ESDIRK четвертого порядка с разбиением

  • KenCarp47 — A- и L-устойчивый очень точный семиэтапный метод ESDIRK четвертого порядка с разбиением

  • Kvaerno5 — A- и L-устойчивый очень точный метод ESDIRK пятого порядка

  • KenCarp5 — A- и L-устойчивый очень точный метод ESDIRK пятого порядка с разбиением

  • KenCarp58 — A- и L-устойчивый очень точный восьмиэтапный метод ESDIRK пятого порядка с разбиением

  • ESDIRK54I8L2SA — A- и L-устойчивый очень точный восьмиэтапный метод ESDIRK пятого порядка

  • ESDIRK436L2SA2 — A- и L-устойчивый очень точный шестиэтапный метод ESDIRK четвертого порядка

  • ESDIRK437L2SA — A- и L-устойчивый очень точный семиэтапный метод ESDIRK четвертого порядка

  • ESDIRK547L2SA2 — A- и L-устойчивый очень точный семиэтапный метод ESDIRK пятого порядка

Полностью неявные методы Рунге-Кутты (FIRK)

  • RadauIIA3 — A-, B- и L-устойчивый полностью неявный метод Рунге — Кутты с внутренним табличным методом для комплексного преобразования базиса с целью повышения эффективности.

  • RadauIIA5 — A-, B- и L-устойчивый полностью неявный метод Рунге — Кутты с внутренним табличным методом для комплексного преобразования базиса с целью повышения эффективности.

Параллельные диагональные неявные методы Рунге — Кутты

  • PDIRK44 — неявный метод четвертого порядка без диагональной адаптивности для двух процессоров.

У этих методов, как и у методов SDIRK, есть параметр nlsolve. Эти методы также требуют, чтобы функция f была потокобезопасной. Вызовы nlsolve распараллеливаются внутри метода.

Методы Розенброка

  • ROS3P — A- и жестко устойчивый метод Розенброка третьего порядка. Сохраняет высокую точность при дискретизации нелинейных параболических дифференциальных уравнений в частных производных (PDE).

  • Rodas3 — A- и жестко устойчивый метод Розенброка третьего порядка.

  • RosShamp4 — A-устойчивый метод Розенброка четвертого порядка.

  • Veldd4 — D-устойчивый метод Розенброка четвертого порядка.

  • Velds4 — A-устойчивый метод Розенброка четвертого порядка.

  • GRK4T — эффективный метод Розенброка четвертого порядка.

  • GRK4A — A-устойчивый метод Розенброка четвертого порядка. В целом «анти-L-устойчивый», но эффективный.

  • Ros4LStab — L-устойчивый метод Розенброка четвертого порядка.

  • Rodas4 — A- и жестко устойчивый метод Розенброка четвертого порядка с жестко совместимым интерполянтом третьего порядка

  • Rodas42 — A- и жестко устойчивый метод Розенброка четвертого порядка с жестко совместимым интерполянтом третьего порядка

  • Rodas4P — A- и жестко устойчивый метод Розенброка четвертого порядка с жестко совместимым интерполянтом третьего порядка. Четвертого порядка для линейно-параболических задач и третьего порядка точности для нелинейно-параболических задач (в противопоставление более низкому порядку, если не исправлено).

  • Rodas4P2 — L- и жестко устойчивый метод Розенброка четвертого порядка с жестко совместимым интерполянтом третьего порядка. Четвертого порядка для линейно-параболических задач и третьего порядка точности для нелинейно-параболических задач. Это улучшение Roadas4P и в случае неточных якобианов метод W второго порядка.

  • Rodas5 — A- и жестко устойчивый метод Розенброка пятого порядка с жестко совместимым интерполянтом четвертого порядка.

  • Rodas5P — A- и жестко устойчивый метод Розенброка пятого порядка с жестко совместимым интерполянтом четвертого порядка. Имеет улучшенную стабильность в реализации адаптивной дискретизации по времени.

Методы Розенброка — Ваннера

  • Rosenbrock23 — L-устойчивый метод Розенброка W второго и третьего порядков, хорошо подходящий для очень жестких уравнений с осцилляциями при низких погрешностях. Жестко совместимая интерполяция второго порядка.

  • Rosenbrock32 — A-устойчивый метод Розенброка W третьего и второго порядков, хорошо подходящий для умеренно жестких уравнений без осцилляций при низких погрешностях. Обратите внимание, что этот метод имеет тенденцию к неустойчивости в присутствии осцилляций, поэтому используйте его с осторожностью. Жестко совместимая интерполяция второго порядка.

  • RosenbrockW6S4OS — L-устойчивый метод Розенброка W четвертого порядка (только фиксированный шаг).

  • ROS34PW1a — L-устойчивый метод Розенброка W четвертого порядка.

  • ROS34PW1b — L-устойчивый метод Розенброка W четвертого порядка.

  • ROS34PW2 — жестко точный метод Розенброка W четвертого порядка для алгебраических уравнений в частных производных (PDAE).

  • ROS34PW3 — строго A-устойчивый (Rinf~0,63) метод Розенброка W четвертого порядка.

Стабилизированные явные методы

  • ROCK2 — стабилизированный метод Рунге — Кутты второго порядка. Показывает высокую устойчивость при вещественных собственных значениях и сглаживается для поддержки комплексных собственных значений умеренного размера.

  • ROCK4 — стабилизированный метод Рунге — Кутты четвертого порядка. Показывает высокую устойчивость при вещественных собственных значениях и сглаживается для поддержки комплексных собственных значений умеренного размера.

  • RKC — стабилизированный метод Рунге — Кутты второго порядка. Показывает высокую устойчивость при вещественных собственных значениях и сглаживается для поддержки комплексных собственных значений умеренного размера.

  • SERK2 — стабилизированный экстраполированный метод Рунге — Кутты второго порядка. Показывает высокую устойчивость при вещественных собственных значениях и сглаживается для поддержки комплексных собственных значений умеренного размера.

  • ESERK5 — стабилизированный экстраполированный метод Рунге — Кутты пятого порядка. Показывает высокую устойчивость при вещественных собственных значениях и сглаживается для поддержки комплексных собственных значений умеренного размера.

Методы ROCK обеспечивают функциональность min_stages и max_stages. Более высокие порядки методов SERK выводятся из алгоритма Айткена-Невилла. SERK2 по умолчанию использует прогностическое управление, но поддерживает и пропорционально-интегральное управление.

Распараллеленные неявные экстраполяционные методы

Ниже перечислены экстраполяционные методы адаптивного порядка с адаптивным размером шага.

  • ImplicitEulerExtrapolation — экстраполяция неявного метода Эйлера с последовательностью Ромберга. Аналогичен методу Хайрера SEULEX.

  • ImplicitEulerBarycentricExtrapolation — экстраполяция неявного метода Эйлера с использованием барицентрических координат для повышения устойчивости метода.

  • ImplicitDeuflhardExtrapolation — экстраполяция средней точки с использованием барицентрических координат.

  • ImplicitHairerWannerExtrapolation — экстраполяция средней точки с использованием барицентрических координат и адаптивностью согласно алгоритму Хайрера SODEX.

У этих методов есть аргументы max_order, min_order и init_order, связанные с алгоритмом адаптивного порядка. threading указывает, следует ли автоматически производить вычисление f в многопоточном режиме, а также создание экземпляров и разложение J/W, что обеспечивает более высокую степень параллелизма внутри метода. Мы рекомендуем переключаться на многопоточность, если система состоит из примерно 150 ODE или более. Значения по умолчанию:

  • max_order=10

  • min_order=1, кроме метода ImplicitHairerWannerExtrapolation, для которого принято значение 2.

  • init_order=5

  • threading=false

Кроме того, у методов ImplicitDeuflhardExtrapolation и ImplicitHairerWannerExtrapolation есть дополнительные аргументы:

  • sequence: последовательность номеров шагов, также называемая последовательностью разбиения. Возможные значения: :harmonic, :romberg и :bulirsch. Значение по умолчанию — :harmonic.

Чтобы переопределить его, используйте именованные аргументы. Например:

alg = ImplicitDeuflhardExtrapolation(max_order = 7, min_order = 4, init_order = 4,
                                     sequence = :bulirsch)
solve(prob, alg)

Обратите внимание, что под порядком понимается порядок экстраполяции. Для ImplicitEulerExtrapolation это порядок метода; в остальных случаях порядок экстраполяции n соответствует порядку метода 2(n+1).

Распараллеленные методы DIRK

Эти методы распараллеливают создание экземпляров и разложение J/W, что делает их эффективными для небольших очень жестких ODE. Для включения и отключения многопоточности имеется параметр threading=true.

  • PDIRK44 — метод DIRK четвертого порядка для двух процессоров.

Экспоненциальные методы Рунге — Кутты

Все эти методы предполагают только фиксированный временной шаг.

  • LawsonEuler — экспоненциальная схема Эйлера первого порядка.

  • NorsettEuler — экспоненциальная схема Рунге-Кутты первого порядка. Псевдоним: ETD1.

  • ETD2 — метод экспоненциального временного дифференцирования второго порядка (в разработке).

  • ETDRK2 — экспоненциальная схема Рунге-Кутты второго порядка.

  • ETDRK3 — экспоненциальная схема Рунге-Кутты третьего порядка.

  • ETDRK4 — экспоненциальная схема Рунге-Кутты четвертого порядка.

  • HochOst4 — экспоненциальная схема Рунге-Кутты четвертого порядка с жестким четвертым порядком.

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

Эти параметры есть у всех методов, кроме ETD2, и их можно задать в конструкторе метода:

  • krylov — логическое значение, по умолчанию false. Определяет, используется аппроксимация функцией Крылова или кэширование операторов (второй вариант доступен только для полулинейных задач). Значение krylov=true обеспечивает гораздо более высокую скорость для больших систем и поэтому рекомендуется в случае, если число ODE превышает 100.

  • m — целое число, значение по умолчанию: 30. Управляет размером подпространства Крылова.

  • iop — целое число, значение по умолчанию: 0. Если не равно нулю, определяет длину неполной процедуры ортогонализации (IOP) [1]. Заметим, что если линейный оператор или якобиан является эрмитовым, всегда будет использоваться алгоритм Ланцоша, а параметр IOP игнорируется.

  • autodiff и chunksize: автоматическое управление дифференцированием, если задача не является полулинейной и якобиан не задан явным образом. Дополнительные сведения см. в разделе Дополнительные параметры.

Адаптивные экспоненциальные методы Розенброка

  • Exprb32 — адаптивная экспоненциальная схема Розенброка третьего порядка.

  • Exprb43 — адаптивная экспоненциальная схема Розенброка четвертого порядка.

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

Итеративные методы Рунге — Кутты с экспоненциальным распространением (EPIRK)

Все эти методы предполагают только фиксированный временной шаг.

  • Exp4 — схема EPIRK четвертого порядка.

  • EPIRK4s3A — схема EPIRK четвертого порядка с жестким четвертым порядком.

  • EPIRK4s3B — схема EPIRK четвертого порядка с жестким четвертым порядком.

  • EPIRK5P1 — схема EPIRK пятого порядка.

  • EPIRK5P2 — схема EPIRK пятого порядка.

  • EPIRK5s3 — «горизонтальная» схема EPIRK пятого порядка с жестким пятым порядком. Не работает.

  • EXPRB53s3 — схема EPIRK пятого порядка с жестким пятым порядком.

Параметры:

  • adaptive_krylov — логическое значение, по умолчанию true. Определяет, используется ли адаптивный алгоритм Крылова с дискретизацией по времени методом Нейсена и Райта.

  • m — целое число, значение по умолчанию: 30. Управляет размером подпространства Крылова или размером первого шага, если adaptive_krylov=true.

  • iop — целое число, значение по умолчанию: 0. Если не равно нулю, определяет длину неполной процедуры ортогонализации (IOP) [1]. Заметим, что если линейный оператор или якобиан является эрмитовым, всегда будет использоваться алгоритм Ланцоша, а параметр IOP игнорируется.

  • autodiff и chunksize: автоматическое управление дифференцированием, если задача не является полулинейной и якобиан не задан явным образом. Дополнительные сведения см. в разделе Дополнительные параметры.

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

Многошаговые методы

Квазипостоянное пошаговое выполнение — это стратегия дискретизации по времени, соответствующая классическим интеграторам GEAR, LSODE и ode15s. Методы переменных множителей соответствуют идеям классического интегратора EPISODE и ранних выпусков VODE. Методы фиксированного ведущего коэффициента (FLC) соответствуют поведению классического интегратора VODE и Sundials CVODE.

  • QNDF1 — адаптивный L-устойчивый метод функции численного дифференцирования (NDF) первого порядка с квазипостоянными временными шагами. Необязательный параметр kappa по умолчанию имеет оптимальное по точности значение Шампина -0.1850.

  • QBDF1 — адаптивный L-устойчивый метод BDF первого порядка. Эквивалентен неявному методу Эйлера, но использует средство оценки погрешности BDF.

  • ABDF2 — адаптивный L-устойчивый многошаговый метод BDF второго порядка с фиксированным ведущим коэффициентом.

  • QNDF2 — адаптивный L-устойчивый метод функции численного дифференцирования (NDF) второго порядка с квазипостоянными временными шагами.

  • QBDF2 — адаптивный L-устойчивый метод BDF второго порядка, использующий квазипостоянные временные шаги.

  • QNDF — метод NDF с адаптивным порядком и квазипостоянными временными шагами. Использует оптимальные по точности значения Шемпайн kappa в качестве значений по умолчанию (имеет именованный аргумент для кортежа коэффициентов kappa). Аналогичен ode15s.

  • QBDF — метод BDF с адаптивным порядком и квазипостоянными временными шагами.

  • MEBDF2 — модифицированный расширенный метод BDF второго порядка с улучшенными характеристиками устойчивости по сравнению со стандартным методом BDF. Только фиксированный временной шаг.

  • FBDF — метод BDF адаптивного порядка с фиксированным ведущим коэффициентом и адаптивным временем, аналогичный ode15i или CVODE_BDF в форме разделенных разностей.

Неявные методы Рунге — Кутты сохранения сильной устойчивости для гиперболических PDE (законы сохранения)

  • SSPSDIRK2 — A- и L-устойчивый симплектический метод SDIRK второго порядка с сохранением сильной устойчивости (SSP) (коэффициент SSP 2). Только фиксированный временной шаг.

Дополнительные параметры

Все методы Розенброка и SDIRK позволяют указывать linsolve — используемый линейный решатель. Дополнительные сведения об указании линейного решателя см. на странице руководства об указании решателя.

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

Кроме того, методы Розенброка и SDIRK предусматривают управление дифференцированием. Для каждого из этих методов можно задать параметр autodiff, чтобы включить или отключить автоматическое дифференцирование, а с помощью параметра chunk_size можно задать размер фрагмента для дуальных чисел (подробные сведения см. в документации по ForwardDiff.jl). Кроме того, для методов Розенброка и SDIRK можно задать параметр diff_type, определяющий тип применяемого численного дифференцирования (если автоматическое дифференцирование отключено). Возможные варианты: Val{:central}, Val{:forward} или Val{:complex}.

Примеры:

sol = solve(prob, Rosenbrock23()) # Стандартный вариант, используется автоматическое дифференцирование
sol = solve(prob, Rosenbrock23(chunk_size = 10)) # Автоматическое дифференцирование с размером фрагмента 10
sol = solve(prob, Rosenbrock23(autodiff = false)) # Численное дифференцирование с вычислением центральных разностей
sol = solve(prob, Rosenbrock23(autodiff = false, diff_type = Val{:forward})) # Численное дифференцирование с вычислением разностей вперед

Табличный метод

Кроме того, существует табличный метод:

  • ExplicitRK — общий решатель Рунге — Кутты, принимающий таблицу. Может быть адаптивным. Таблицы указываются посредством именованного аргумента tab=tableau. По умолчанию применяется таблица для метода Дорманда — Принса четвертого и пятого порядков. Другие доступные таблицы см. в разделе «Предоставляемые таблицы».

Пример использования:

alg = ExplicitRK(tableau = constructDormandPrince())
solve(prob, alg)

CompositeAlgorithm

Одной из уникальных возможностей OrdinaryDiffEq.jl является алгоритм CompositeAlgorithm, который позволяет с минимальными накладными расходами разработать множественный метод с переключением между выбранными алгоритмами по мере необходимости. Синтаксис имеет вид CompositeAlgorithm(algtup,choice_function), где algtup — это кортеж алгоритмов OrdinaryDiffEq.jl, а choice_function — функция, объявляющая метод, который должен использоваться на следующем шаге. Например, можно разработать множественный метод, который использует Tsit5(), но переключается на Vern7() при слишком малом dt:

choice_function(integrator) = (Int(integrator.dt < 0.001) + 1)
alg_switch = CompositeAlgorithm((Tsit5(), Vern7()), choice_function)

Функция choice_function принимает integrator, поэтому в ней можно использовать все возможности, предлагаемые интерфейсом интегратора.

Для автоматического переключения между двумя методами в рамках алгоритмов с определением жесткости был создан вспомогательный алгоритм. Это алгоритм AutoSwitch со следующими параметрами:

AutoSwitch(nonstiffalg::nAlg, stiffalg::sAlg;
           maxstiffstep = 10, maxnonstiffstep = 3,
           nonstifftol::T = 9 // 10, stifftol::T = 9 // 10,
           dtfac = 2.0, stiffalgfirst = false)

Параметр nonstiffalg должен иметь соответствующую оценку жесткости, встроенную в метод. Параметр stiffalg может принимать оценку по результатам вычисления якобиана. maxstiffstep — это число операций определения жесткости перед переключением на жесткий алгоритм, а maxnonstiffstep — обратный параметр. nonstifftol и stifftol — это погрешности, связанные со сравнением жесткости в области устойчивости. Чем меньше значение stifftol, тем ниже вероятность переключения на нежесткий алгоритм. Чем больше значение nonstifftol, тем выше вероятность переключения на жесткий алгоритм. dtfac — это коэффициент, на который изменяется dt при переключении: путем умножения при переходе с нежесткого на жесткий алгоритм или путем деления в обратном случае. stiffalgfirst указывает, должен ли использоваться жесткий алгоритм на первом шаге.

Предварительно созданные алгоритмы определения жесткости и автоматического переключения

Эти методы требуют выбора Autoalg(stiffalg) в качестве метода, на который следует переключиться при жестком ODE. Это может быть любой из одношаговых жестких методов OrdinaryDiffEq.jl; он имеет все аргументы алгоритма AutoSwitch.

  • AutoTsit5 — Tsit5 с автоматическим переключением.

  • AutoDP5 — DP5 с автоматическим переключением.

  • AutoVern6 — Vern6 с автоматическим переключением.

  • AutoVern7 — Vern7 с автоматическим переключением.

  • AutoVern8 — Vern8 с автоматическим переключением.

  • AutoVern9 — Vern9 с автоматическим переключением.

Пример:

tsidas_alg = AutoTsit5(Rodas5())
sol = solve(prob, tsidas_alg)

tsidas_alg = AutoTsit5(Rodas5(), nonstifftol = 11 / 10)

Это метод Tsit5 с автоматическим переключением на Rodas5.

Sundials.jl

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

using Pkg
Pkg.add("Sundials")
using Sundials

Главное назначение пакета Sundials — многошаговые методы. Такие методы эффективнее прочих, когда затраты на вычисление функции очень высоки, но в случае с более простыми для вычисления функциями затраты на выполнение временных шагов перевешивают преимущества. Однако метод BDF является классическим методом для решения жестких уравнений и применим в общем случае.

  • CVODE_BDF — решатель формулы обратного дифференцирования (BDF) для CVode.

  • CVODE_Adams — решатель Адамса — Мултона для CVode.

  • ARKODE — явные и ESDIRK-методы Рунге — Кутты порядков 2—​8 в зависимости от выбора параметров.

Все алгоритмы Sundials поставляются с эрмитовой полиномиальной интерполяцией третьего порядка.

Дополнительные сведения об управлении решателями Sundials.jl см. на странице Sundials с подробностями об API решателей

ODEInterface.jl

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

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

using Pkg
Pkg.add("ODEInterfaceDiffEq")
using ODEInterfaceDiffEq
  • dopri5 — классическая реализация метода Дорманда — Принса четвертого и пятого порядков от Хайрера.

  • dop853 — явный метод Дорманда — Принса порядка 8(5,3) (вариант метода Рунге — Кутты).

  • odex — алгоритм экстраполяции GBS, основанный на правиле средней точки.

  • seulex — алгоритм экстраполяции, основанный на линейном неявном методе Эйлера.

  • radau — неявный метод Рунге — Кутты (Radau IIA) с переменным порядком от 5 до 13.

  • radau5 — неявный метод Рунге — Кутты (Radau IIA) пятого порядка.

  • rodas — метод Розенброка порядка 4(3).

  • ddeabm — предсказывающе-исправляющий метод Адамса — Башфорта — Мултона (порядка от 1 до 12)

  • ddebdf — формула обратного дифференцирования (порядка от 1 до 5)

Обратите внимание: хотя в выходных данных присутствует только линейная интерполяция, для промежуточных плотных выходных данных для saveat и для обработки событий применяется интерполяция более высокого порядка.

LSODA.jl

Данная конфигурация предоставляет оболочку для алгоритма LSODA — широко известного метода, использующего переключение для решения как жестких, так и нежестких уравнений.

  • lsoda — алгоритм-оболочка для LSODA.

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

using Pkg
Pkg.add("LSODA")
using LSODA

IRKGaussLegendre.jl

Данная конфигурация предоставляет решатель IRKGL16, представляющий собой симплектическую схему Гаусса-Лежандра шестнадцатого порядка. Данная схема очень эффективна для точного интегрирования ODE, особенно производных от гамильтоновых систем.

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

using Pkg
Pkg.add("IRKGaussLegendre")
using IRKGaussLegendre

SimpleDiffEq.jl

Эта конфигурация предоставляет доступ к упрощенным версиям ряда решателей ODE. Они предназначены в первую очередь для проведения экспериментов и ускоряют компиляцию. По сравнению с OrdinaryDiffEq.jl у них есть ограничения, и, как правило, они работают медленнее.

  • SimpleTsit5 — форма интегратора Tsit5 с фиксированным временным шагом. Несовместима с событиями.

  • SimpleATsit5 — адаптивный решатель Tsit5 с интерполяцией в простейшей форме. Несовместим с событиями.

  • GPUSimpleATsit5 — версия SimpleATsit5 без интерфейса интегратора. Поддерживает только функцию solve.

  • SimpleRK4 — минимальная реализация RK4 с фиксированным временным шагом и интеграторами.

  • LoopRK4 — минимальная реализация RK4 с фиксированным временным шагом. Несовместима с событиями и интерфейсом интегратора.

  • GPURK4 — полностью статическая реализация RK4 для специализированной компиляции для таких ускорителей, как GPU и TPU.

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

using Pkg
Pkg.add("SimpleDiffEq")
using SimpleDiffEq

ODE.jl

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

using Pkg
Pkg.add("ODE")
using ODE
  • ode23 — метод Богацкого — Шампина второго и третьего порядков (вариант метода Рунге — Кутты)

  • ode45 — метод Дорманда — Принса четвертого и пятого порядков (вариант метода Рунге — Кутты)

  • ode23s — модифицированный метод Розенброка второго и третьего порядков по Шампину

  • ode78 — метод Фельберга седьмого и восьмого порядков (вариант метода Рунге — Кутты)

  • ode4 — классический метод Рунге — Кутты четвертого порядка

  • ode4ms — метод Адамса — Башфорта — Мултона фиксированного порядка с фиксированным шагом †

  • ode4s — метод Розенброка четвертого порядка по Шампину

†: не выполняет шаг до конечной точки интервала. Это может привести к проблемам с обнаружением разрывов, а дискретные переменные должны быть обновлены соответствующим образом.

MATLABDiffEq.jl

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

using Pkg
Pkg.add(url = "https://github.com/SciML/MATLABDiffEq.jl")
using MATLABDiffEq

Требуется установка MATLAB с лицензией. Доступные методы:

  • MATLABDiffEq.ode23

  • MATLABDiffEq.ode45

  • MATLABDiffEq.ode113

  • MATLABDiffEq.ode23s

  • MATLABDiffEq.ode23t

  • MATLABDiffEq.ode23tb

  • MATLABDiffEq.ode15s

  • MATLABDiffEq.ode15i

Дополнительные сведения об этих алгоритмах см. в документации по MATLAB.

SciPyDiffEq.jl

SciPyDiffEq.jl — это оболочка для SciPy, упрощающая переход для новых пользователей (с полным сохранением результатов) и тестирование производительности. Эта оболочка использует JIT-ускорение Julia для повышения скорости выполнения примерно в три раза по сравнению с SciPy+Numba, однако она все же примерно в 1000 раз медленнее чистых методов Julia, и поэтому ее следует применять ограниченно.

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

using Pkg
Pkg.add(url = "https://github.com/SciML/SciPyDiffEq.jl")
using SciPyDiffEq

Доступные методы:

  • SciPyDiffEq.RK45

  • SciPyDiffEq.RK23

  • SciPyDiffEq.Radau

  • SciPyDiffEq.BDF

  • SciPyDiffEq.LSODA

deSolveDiffEq.jl

deSolveDiffEq.jl — это оболочка для пакета deSolve на R, упрощающая переход для новых пользователей (с полным сохранением результатов) и тестирование производительности. Эта оболочка работает примерно в 1000 раз медленнее чистых методов Julia (увеличение накладных расходов примерно в 2—​3 раза из-за использования R напрямую), и поэтому ее следует применять ограниченно.

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

using Pkg
Pkg.add(url = "https://github.com/SciML/deSolveDiffEq.jl")
using deSolveDiffEq

Доступные методы:

  • deSolveDiffEq.lsoda

  • deSolveDiffEq.lsode

  • deSolveDiffEq.lsodes

  • deSolveDiffEq.lsodar

  • deSolveDiffEq.vode

  • deSolveDiffEq.daspk

  • deSolveDiffEq.euler

  • deSolveDiffEq.rk4

  • deSolveDiffEq.ode23

  • deSolveDiffEq.ode45

  • deSolveDiffEq.radau

  • deSolveDiffEq.bdf

  • deSolveDiffEq.bdf_d

  • deSolveDiffEq.adams

  • deSolveDiffEq.impAdams

  • deSolveDiffEq.impAdams_d

GeometricIntegrators.jl

GeometricIntegrators.jl — это набор алгоритмов с фиксированным временным шагом, написанных на Julia. Обратите внимание, что эта настройка автоматически не включена в DifferentialEquations.jl. Для использования следующих алгоритмов необходимо установить и использовать GeometricIntegratorsDiffEq.jl:

using Pkg
Pkg.add(url = "https://github.com/SciML/GeometricIntegratorsDiffEq.jl")
using GeometricIntegratorsDiffEq
  • GIEuler — метод Эйлера первого порядка

  • GIMidpoint - явный метод средней точки второго порядка

  • GIHeun2 — метод Гойна второго порядка

  • GIRalston2 — метод Ралстона второго порядка

  • GIHeun3 — метод Гойна третьего порядка

  • GIRalston3 — метод Ралстона третьего порядка

  • GIRunge — метод Кутты третьего порядка

  • GIKutta — метод Кутты третьего порядка

  • GIRK4 — стандартный метод Рунге — Кутты четвертого порядка

  • GIRK416

  • GIRK438 — метод Рунге — Кутты четвертого порядка, правило 3/8

  • GIImplicitEuler — неявный метод Эйлера первого порядка

  • GIImplicitMidpoint — неявный метод средней точки второго порядка

  • GIRadauIA(s) — s-этапный метод Radau-IA

  • GIRadauIIA(s) — s-этапный метод Radau-IA

  • GILobattoIIIA(s)

  • GILobattoIIIB(s)

  • GILobattoIIIC(s)

  • GILobattoIIIC̄(s)

  • GILobattoIIID(s)

  • GILobattoIIIE(s)

  • GILobattoIIIF(s)

  • GISRK3 — трехэтапный симметричный метод Рунге — Кутты четвертого порядка

  • GISSPRK3 — явный метод SSP третьего порядка

  • `GICrankNicholson

  • GIKraaijevangerSpijker

  • GIQinZhang

  • GICrouzeix

  • GIGLRK(s) — метод Гаусса — Лежандра порядка 2s (вариант метода Рунге — Кутты)

Обратите внимание, что все эти методы требуют указания dt пользователем.

BridgeDiffEq.jl

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

using Pkg
Pkg.add(url = "https://github.com/SciML/BridgeDiffEq.jl")
using BridgeDiffEq
  • BridgeR3 — метод Ралстона третьего порядка

  • BridgeBS3 — метод Богацкого — Шампина третьего порядка

TaylorIntegration.jl

TaylorIntegration.jl — это выполненная исключительно на Julia реализация метод рядов Тейлора адаптивного порядка для высокоточного интегрирования ODE. Эти методы оптимизированы для случаев, когда абсолютная погрешность должна быть очень низкой. Обратите внимание, что эта настройка автоматически не включена в DifferentialEquations.jl. Для использования следующих алгоритмов необходимо установить и использовать TaylorIntegration.jl:

using Pkg
Pkg.add("TaylorIntegration")
using TaylorIntegration
  • TaylorMethod(order) — метод интегрирования Тейлора с максимальным порядком order (обязательный параметр)

Обратите внимание: этот метод будет работать гораздо быстрее, если поместить @taylorize в функцию производной!

QuDiffEq.jl

QuDiffEq.jl представляет собой пакет для решения дифференциальных уравнений с помощью квантового алгоритма. Он использует фреймворк Yao для моделирования квантовых схем.

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

using Pkg
Pkg.add(url = "https://github.com/QuantumBFS/QuDiffEq.jl")
using QuDiffEq
  • QuLDE(k) — алгоритм на основе отрезков рядов Тейлора. Этот метод приводит систему нелинейных дифференциальных уравнений к линейному виду и решает ее посредством квантовой схемы. k выбирает порядок в аппроксимации ряда Тейлора (для квантовой схемы).

  • QuNLDE(k,ϵ) — алгоритм, использующий прямой метод Эйлера для решения квадратичных дифференциальных уравнений. k выбирает порядок в аппроксимации ряда Тейлора (для квантовой схемы). ϵ задает точность для эволюции гамильтониана.

NeuralPDE.jl

Этот метод обучает нейронную сеть с помощью Flux.jl с целью получения аппроксимированного решения ODE. В настоящее время этот метод не выдерживает конкуренции, но его можно попробовать ради любопытства. Он будет улучшен в ходе будущей интеграции с Zygote.

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

using Pkg
Pkg.add("NeuralPDE")
using NeuralPDE
  • nnode(chain,opt=ADAM(0.1)) — определяет решатель на основе нейронной сети, который на внутреннем уровне использует объект chain Flux.jl, предоставленный пользователем. По умолчанию применяется метод оптимизации ADAM, но пользователь может передать любой оптимизатор Flux.jl.

Список предоставляемых табличных методов

По умолчанию доступно множество различных табличных методов посредством DiffEqDevTools.jl. Список табличных методов можно найти в документации для разработчиков. Имейте в виду, что для их использования необходимо установить библиотеку:

using Pkg
Pkg.add("DiffEqDevTools")
using DiffEqDevTools

Для доступа к самым полезным и распространенным алгоритмам в OrdinaryDiffEq.jl предоставляется оптимизированная вручную версия, которая рекомендуется в общих целях (то есть вы можете использовать DP5 вместо ExplicitRK с tableau=constructDormandPrince()). Однако данный список удобен для сравнения табличных методов и понимания их преимуществ и недостатков. Реализованы все опубликованные табличные методы (о существовании которых известно). Обратите внимание, что также принимаются определенные пользователем табличные методы. Чтобы узнать, как определить табличный метод, обратитесь к готовому исходному коду табличного метода. В docstring табличного метода должна быть ссылка на авторов (если ее нет, сообщите о проблеме).

Предоставляются шаблоны графиков для построения графика области устойчивости для данного табличного метода.

ProbNumDiffEq.jl

ProbNumDiffEq.jl предоставляет вероятностные численные решатели для ODE. Приводя решение ODE к задаче байесовского вывода, они возвращают распределение апостериорной вероятности для решений ODE и тем самым предоставляют оценку собственной погрешности численной аппроксимации. Эти решатели имеют адаптивный размер временного шага, их порядок можно свободно указывать, а возвращаемое апостериорное распределение обеспечивает плотные выходные данные и выборку. Полная документация доступна на странице ProbNumDiffEq.jl.

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

using Pkg
Pkg.add("ProbNumDiffEq")
using ProbNumDiffEq
  • EK1(order=3) — полунеявный решатель ODE на основе расширенной калмановской фильтрации и сглаживания с линеаризацией первого порядка. Рекомендуется к использованию, но требует указания якобиана векторного поля.

  • EK0(order=3) — явный решатель ODE на основе расширенной калмановской фильтрации и сглаживания с линеаризацией нулевого порядка.


1. Koskela, A. (2015). Approximating the matrix exponential of an advection-diffusion operator using the incomplete orthogonalization method. In Numerical Mathematics and Advanced Applications-ENUMATH 2013 (pp. 345-353). Springer, Cham.