Решатели ODE
Рекомендуемые методы
Для выбора алгоритма рекомендуется использовать именованный аргумент 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
— метод Адамса адаптивного порядка с адаптивным временем и фиксированным ведущим коэффициентом в форме Нордсика. Алгоритм адаптивного порядка взят из метода SundialsCVODE_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 на основе расширенной калмановской фильтрации и сглаживания с линеаризацией нулевого порядка.