Решатели DDE
Рекомендуемые методы
Рекомендуемым методом для решения задач DDE являются алгоритмы MethodOfSteps
. Они создаются на основе алгоритма OrdinaryDiffEq.jl следующим образом:
MethodOfSteps(alg; constrained = false, fpsolve = NLFunctional(; max_iter = 10))
где alg
— алгоритм OrdinaryDiffEq.jl. Большинство алгоритмов должны работать.
Нежесткие уравнения DDE
Стандартный алгоритм — MethodOfSteps(Tsit5())
. Это очень эффективный алгоритм FSAL пятого порядка со свободными интерполянтами, который должен решать большинство задач. Для быстрого решения с нестрогим контролем погрешности подойдет метод MethodOfSteps(BS3())
. Метод BS3
аналогичен dde23
в MATLAB. Если нужны алгоритмы со строгим контролем погрешности, рекомендуется использовать MethodOfSteps(Vern6())
. Тесты производительности показывают, что выбор методов более высокого порядка, таких как MethodOfSteps(DP8())
, может не давать преимуществ.
Жесткие уравнения DDE и дифференциально-алгебраические уравнения с запаздыванием (DADE)
Для жестких DDE методы SDIRK и Розенброка очень эффективны, так как они повторно используют якобиан в ходе неограниченных пошаговых итераций. Для большей устойчивости следует выбирать методы с жестко совместимыми интерполянтами. Хорошим вариантом метода низкого порядка будет MethodOfSteps(Rosenbrock23())
. Кроме того, хорошими вариантами являются методы Rodas
, например MethodOfSteps(Rodas4())
, из-за жестко совместимого интерполянта высокого порядка.
DADE также можно решать, определяя задачу в виде матрицы масс. В таких ситуациях хорошо подойдут методы Розенброка.
Обработка запаздываний
Запаздывания объявляются отдельно. Вы можете использовать любое запаздывание с помощью интерполянта h
в данной точке. Однако для обеспечения максимальной точности следует соблюдать осторожность. При объявлении запаздываний решатели могут работать более эффективно и точно. Постоянные задержки переносятся, пока порядок не станет больше порядка интегратора. Если объявлены зависящие от состояния задержки, алгоритм обнаруживает разрывы, возникшие по причине этих задержек, и подбирает размер шага так, чтобы эти разрывы включались в сетку при отклонении шагов. Это обеспечивает точную обработку всех разрывов.
Если есть необъявленные запаздывания, разрывы вследствие задержек не отслеживаются. В этом случае следует использовать методы с остаточным управлением, например метод MethodOfSteps(RK4())
(наиболее оптимальный вариант в настоящее время), так как они обеспечивают более точные шаги. Однако остаточное управление подвержено погрешностям. Мы рекомендуем задавать более низкие погрешности, чтобы получать точные результаты, хотя это может быть связано с дополнительными затратами, так как для адаптации к разрывам вследствие задержек применяется подход на основе отклонения.
Специальные именованные аргументы
-
discontinuity_interp_points
— число точек интерполяции, используемых для отслеживания разрывов вследствие зависимых задержек. По умолчанию — 10. Действует только в том случае, если объявлены зависимые задержки. -
discontinuity_abstol
иdiscontinuity_reltol
— абсолютная и относительная погрешности, используемые для проверки того, является ли точка времени в начале текущего шага точкой разрыва вследствие зависимых задержек. Значения по умолчанию — 1/10^12 и 0. Действует только в том случае, если объявлены зависимые задержки.
Примечание
Если при выполнении метода возникают проблемы, можно скорректировать простые итерации. Увеличение абсолютной и относительной погрешностей путем задания именованных аргументов abstol
и reltol
при решении задачи DDE, а также увеличение максимального количества итераций путем задания именованного аргумента max_iter
в алгоритме MethodOfSteps
могут помочь обеспечить правильные шаги. Если задача по-прежнему не сходится корректно, следует уменьшить значение dtmax
. Если задача предполагает только постоянные задержки, в наихудшем сценарии может потребоваться задать значение constrained = true
, которое ограничивает размер временных шагов размером минимального запаздывания и поэтому обеспечивает более высокую устойчивость за счет уменьшения размера временного шага.