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

Решатели DDE

solve(prob::AbstractDDEProblem, alg; kwargs)

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

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

Рекомендуемым методом для решения задач 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, которое ограничивает размер временных шагов размером минимального запаздывания и поэтому обеспечивает более высокую устойчивость за счет уменьшения размера временного шага.