У меня есть ODE:
Я знаю, что этот конкретный ODE жесток, аналитически. Я также знаю, что если мы используем явный (прямой) шаговый метод времени (Эйлер, Рунге-Кутта, Адамс и т. Д.), Метод должен возвращать очень большие ошибки, если шаг по времени слишком велик. Итак, у меня есть два вопроса:
Так обычно определяются жесткие ОДУ, когда аналитическое выражение для термина ошибки не доступно или не выводится?
В общем, когда ODE жесткое, как определить «достаточно маленький» временной шаг?
Ответы:
Чтобы ответить на ваши вопросы:
Насколько я знаю, на практике, если для явных методов требуются чрезвычайно малые временные шаги относительно вашей временной шкалы интереса (см. Ответы на этот вопрос о том, что значит для ODE быть жестким ), чтобы получить точные результаты, то для В любом случае, ваша проблема жесткая. Чтобы определить требования к размеру шага, положитесь на одну из множества библиотек, написанных экспертами (одним из примеров является пакет MATLAB, также SUNDIALS, VODE, DASPK, DASSL, LSODE и т. Д.), Которые имеют адаптивную эвристику шагового времени. Руководство SUNDIALS объясняет правила принятия решений, которые они используют, чтобы определить размер временных шагов, которые выполняет пакет, чтобы дать вам пример правил, которые используются на практике.
Опять же, на практике я бы использовал библиотеку с адаптивным шагом по времени, потому что это более эффективно. Однако, если вы сами кодировали метод, используя фиксированные размеры шагов, если вы заметили большие колебания или ваше решение «взорвалось», то вы бы заподозрили, что ваш временной шаг был слишком большим, и сократили бы его. Повторяйте до тех пор, пока не получите разумное численное решение. В учебниках, таких как Ашер, Петцольд, Хайрер и Ваннер, есть хорошие примеры этого явления.
источник
Лучший способ взглянуть на это состоит в том, что для сложной задачи любое стабильное явное вычисление приводит к ошибке, которая намного меньше, чем требуемая погрешность .
Существует много хороших методов автоматического определения жесткости с использованием явных схем, особенно встроенных пар Рунге-Кутта. Смотрите, например:
Во втором примере Фалейчика, когда размер шага уменьшается, можно увидеть резкое резкое уменьшение погрешности до уровней, намного ниже типичного требуемого допуска при пересечении стабильного порога временного шага. Таким образом, хороший оценщик ошибок действительно показал бы жесткость проблемы. В первой задаче ошибка, полученная при стабильном размере шага, будет находиться в диапазоне типичного требуемого допуска, что указывает на нежесткость.
Вследствие этого следует отметить, что любая проблема становится негибкой, если требуется достаточно строгий допуск на ошибку.
источник
1. Можем ли мы численно определить жесткость, просто применяя явные методы?
Итак, проблема жесткая? Ответ НЕТ ! Небольшой размер шага здесь необходим для правильного воспроизведения колебаний решения .
Эта проблема жесткая? ДА ! Мы сделали очень маленькие шаги, чтобы воспроизвести решение, которое меняется очень медленно. Это иррационально! Величина временного шага здесь ограничена свойствами устойчивости явного Эйлера .
Эта проблема
Вывод: информация о временных шагах и соответствующих ошибках недостаточна для определения жесткости. Также стоит посмотреть на полученное решение. Если он изменяется медленно и размер шага очень мал, проблема, скорее всего, будет жесткой. Если решение колеблется быстро, и вы доверяете своей методике оценки ошибок, тогда эта проблема не является жесткой.
2. Как определить максимальный размер шага, который позволяет интегрировать жесткую задачу с явным методом?
Если вы используете какой-то явный решатель черного ящика с автоматическим пошаговым управлением, вам ничего не нужно делать: программа адаптирует требуемый размер шага адаптивно.
Конечно, такой анализ в основном применим для линейных задач с известным спектром. Для решения более практических задач мы должны полагаться на численные методы определения жесткости (см. Ссылки и комментарии в других ответах).
источник