Позвольте мне начать с исправлений. Нет, odeint
не имеет никаких симплектических интеграторов. Нет, симплектическая интеграция не означает сохранение энергии.
Что означает симплектическое и когда вы должны его использовать?
Прежде всего, что означает симплектика? Симплектика означает, что решение существует на симплектическом многообразии. Симплектическое многообразие - это множество решений, которое определяется 2-формой. Детали симплектических многообразий, вероятно, звучат как математическая бессмыслица, поэтому вместо этого суть в том, что существует прямая связь между двумя наборами переменных на таком многообразии. Причина, по которой это важно для физики, состоит в том, что уравнения Гамильтониана, естественно, имеют решения о том, что решения находятся на симплектическом многообразии в фазовом пространстве, причем естественное расщепление является компонентом положения и импульса. Для истинного гамильтонова решения этот путь в фазовом пространстве является постоянной энергией.
O (Δ TN)N
Это означает, что симплектические интеграторы, как правило, улавливают долговременные шаблоны лучше, чем обычные интеграторы, из-за отсутствия дрейфа и почти гарантии периодичности. Этот блокнот хорошо отображает эти свойства в задаче Кеплера . Первое изображение показывает, о чем я говорю, с периодическим характером решения.
Это было решено с помощью симплектического интегратора 6-го порядка от Kahan и Li из DifferentialEquations.jl . Вы можете видеть, что энергия не совсем консервативна, но ее изменение зависит от того, насколько далеко возмущенное многообразие решений находится от истинного многообразия. Но так как само численное решение находится на симплектическом многообразии, оно имеет тенденцию быть почти точно периодическим (с некоторым линейным смещением чисел, которое вы можете видеть), что делает его очень хорошим для долгосрочной интеграции. Если вы сделаете то же самое с RK4, вы можете получить катастрофу:
Вы можете видеть, что проблема заключается в том, что в численном решении нет истинной периодичности и, следовательно, со временем оно имеет тенденцию дрейфовать.
Это подчеркивает истинную причину выбора симплектических интеграторов: симплектические интеграторы хороши для длительных интегрирований в задачах, обладающих симплектическим свойством (гамильтоновы системы) . Итак, давайте пройдемся по нескольким вещам. Обратите внимание, что вам не всегда нужны симплектические интеграторы даже для симплектической задачи. В этом случае может подойти адаптивный метод Рунге-Кутты 5-го порядка. Вот Tsit5
:
Обратите внимание на две вещи. Во-первых, он получает достаточно хорошую точность, чтобы вы не могли видеть фактический дрейф на графике фазового пространства. Тем не менее, с правой стороны вы можете видеть, что существует этот дрейф энергии, и поэтому, если вы делаете достаточно долгую интеграцию, этот метод не будет так же хорош, как метод решения с периодическими свойствами. Но это поднимает вопрос, как это происходит с точки зрения эффективности по сравнению с простой интеграцией? Ну, это немного менее уверенно. В DiffEqBenchmarks.jl вы можете найти несколько тестов, исследующих этот вопрос. Например, этот ноутбуканализирует погрешность энергии в сравнении с временем выполнения в системе гамильтоновых уравнений из четырехкратной модели Бозона и показывает, что если вам нужна действительно высокая точность, то даже при достаточно длительных временах интегрирования эффективнее использовать RK или Runge-Kutta Nystrom высокого порядка ( РКН) метод. Это имеет смысл, потому что для удовлетворения симплектического свойства интеграторы отказываются от некоторой эффективности и в значительной степени должны быть с фиксированным временным шагом (есть некоторые исследования, продвигающиеся к последнему, но это не очень далеко).
Кроме того, обратите внимание на оба этих ноутбука, что вы также можете просто взять стандартный метод и проецировать его обратно во множество решений на каждом этапе (или каждые несколько шагов). Это то, что делают примеры, использующие обратный вызов ManifoldProjection DifferentialEquations.jl . Вы видите, что гарантии законов сохранения соблюдаются, но с дополнительными затратами на решение неявной системы на каждом этапе. Вы также можете использовать полностью неявный решатель ODE или матрицы особой массы, чтобы добавить уравнения сохранения, но конечный результат состоит в том, что эти методы более затратны в вычислительном отношении в качестве компромисса.
Подводя итог, можно сказать, что класс проблем, к которым вы хотите обратиться за симплектическим интегратором, это те, которые имеют решение на симплектическом многообразии (гамильтоновы системы), где вы не хотите вкладывать вычислительные ресурсы в очень точные (допуски <1e-12
) решение и не нуждаются в точной энергии / и т.д. сохранение. Это подчеркивает, что это все о долгосрочных интеграционных свойствах, так что вы не должны просто стучаться к ним всем волей-неволей, как предполагает некоторая литература. Но они все еще являются очень важным инструментом во многих областях, таких как астрофизика, где у вас есть длительные интегрирования, которые вам нужно решать достаточно быстро, не имея при этом абсурдной точности.
Где я могу найти симплектические интеграторы? Какие существуют симплектические интеграторы?
Обычно существует два класса симплектических интеграторов. Существуют симплектические интеграторы Рунге-Кутты (которые показаны в приведенных выше примерах), и существуют неявные методы Рунге-Кутты, которые обладают симплектическим свойством. Как упоминает @origimbo, симплектические интеграторы Рунге-Кутты требуют, чтобы вы предоставили им секционированную структуру, чтобы они могли обрабатывать части положения и импульса отдельно. Однако, вопреки комментарию, неявные методы Рунге-Кутты являются симплектическими, не требуя этого, а вместо этого требуют решения нелинейной системы. Это не так уж плохо, потому что, если система не является жесткой, эта нелинейная система может быть решена с помощью функциональной итерации или ускорения Андерсона, но симплектические методы РК все еще, вероятно, предпочтительнее для эффективности (это '
Тем не менее, odeint не имеет методов ни из одного из этих семейств , поэтому он не является хорошим выбором, если вы ищете симплектических интеграторов. В Fortran сайт Hairer имеет небольшой набор, который вы можете использовать . Mathematica имеет несколько встроенных . Решатели GSL ODE имеют неявные точечные интеграторы RK-Гаусса, которые IIRC являются симплектическими, но это единственная причина для использования методов GSL.
Но наиболее полный набор симплектических интеграторов можно найти в DifferentialEquations.jl в Julia (напомним, это использовалось для записных книжек выше). Список доступных симплектических методов Рунге-Кутты находится на этой странице, и вы заметите, что неявный метод средней точки также симплектичен (неявный метод Рунге-Кутты-трапеции считается «почти симплектическим», потому что он обратим). Он не только обладает самым большим набором методов, но и с открытым исходным кодом (вы можете увидеть код и его тесты на языке высокого уровня) и имеет множество тестов . Хорошим вводным блокнотом для его использования для решения физических проблем является этот учебник, Но, конечно, рекомендуется начать работу с пакетом через первое руководство по ODE .
В общем, вы можете найти подробный анализ наборов числовых дифференциальных уравнений в этом блоге . Он довольно подробный, но поскольку он должен охватывать множество тем, каждая из которых посвящена менее детальному описанию, поэтому не стесняйтесь просить его расширить каким-либо образом.