Как инициализировать/загрузить алгоритм Бориса?

Алгоритм Бориса требует чередования положений и скоростей, т.е. т я и скорость на т я 1 / 2 например. Я хочу использовать толкатель Бориса в своем приложении, однако мне в какой-то момент заданы положение и скорость . т 0 (в качестве входных данных, без сдвига на половину временного шага). Если я ввожу это в алгоритм, он, очевидно, дает неправильные результаты (как видно из случая, для которого известно аналитическое решение).

Вопрос: Как я могу инициализировать алгоритм, чтобы получить положение и скорость, сдвинутые на Δ т / 2 ?

В стороне (1): алгоритм Бориса сначала выполняет обновление скорости, а затем использует новую скорость для вычисления обновления положения. Однако обновление скорости использует как положение (для вычисления полей), так и скорость, поэтому я не могу просто использовать обновление скорости для Δ т Δ т / 2 .

Помимо (2): алгоритм Leapfrog также (первоначально) использует чередующиеся положения и скорости, однако его можно переформулировать, чтобы они вычислялись «в синхронном режиме» (т.е. оба они определены в т я ). Насколько я знаю, такой переформулировки для алгоритма Бориса не существует.

Ответы (2)

Это обычно известно как «стартовая» проблема и возникает в ряде схем. Например, для неявных схем более высокого порядка требуются значения на нескольких предыдущих временных уровнях.

Хитрость заключается в том, чтобы начать симуляцию, используя одну или несколько более простых схем. Например, вы можете использовать метод Рунге-Кутты 2-го порядка для одного шага, чтобы у вас были значения в т 0 и т 1 , а затем интерполировать до т 0,5 и запустите свой алгоритм с этим набором данных. Любой метод будет работать, но простая явная схема будет вашим лучшим выбором, чтобы сдвинуть дело с мертвой точки.

Если вы хотите обеспечить согласованность при перезапуске с контрольных точек по сравнению с бегом до финиша без контрольных точек, вам нужно сохранить предыдущие значения шага полупериода при сохранении контрольных точек. Таким образом, когда вы перезапускаете все, вам не нужно делать еще один начальный шаг.

Просто убедитесь, что вы соблюдаете любые ограничения стабильности и/или точности, которые могут быть у вас в начале моделирования. Для многих систем это сильно нелинейный момент, и надежность может стать проблемой, если схемы выбраны неудачно.

Я спросил коллегу, как он справляется со скоростью смещения для своей частицы в коде ячейки, и его ответ отличался от того, что сказал tpg2114 в своем ответе.

Вместо того, чтобы вычислять следующий временной шаг с помощью метода более низкого порядка, PIC-код моего коллеги на самом деле вычислял следующую скорость в обратном направлении по времени (т. е. при т "=" Δ т / 2 ) и сила при т "=" Δ т используя их типичные алгоритмы 2-го порядка, прежде чем двигаться вперед во времени. 1 Мне кажется, что все еще существует проблема ваших данных, содержащих в ( т "=" 0 ) и Икс ( т "=" 0 ) , для чего может потребоваться решение tpg2114 .

Я не знаю, сделали ли они это, но было бы разумным, что после шага вперед т "=" 0 можно было бы проверить положения частиц, чтобы убедиться, что положения соответствуют некоторому уровню (надеюсь, машинная точность , но я мог бы понять, используя больший допуск).


1. Возможно, дело в том, что в ( т "=" 3 Δ т / 2 ) также необходимо, но я не уверен на 100%, так как это было около 5 лет назад, когда я спрашивал, и я не делаю / не делаю моделирования PIC.

Стоит отметить (с большим опозданием), что этот подход приемлем, если дискретные уравнения устойчивы с обращением времени. Диффузные члены становятся обостряющими членами при обращении и могут привести к действительно неприятным числовым нестабильностям.