Интеграция Верле

редактировать

Интеграция Верле (французское произношение: ) численный метод, используемый для интеграции уравнения движения Ньютона. Он часто используется для расчета траекторий частиц в моделировании молекулярной динамики и компьютерной графике. Алгоритм был впервые использован в 1791 году Деламбром и с тех пор много раз переоткрывался, в последний раз Лу Верле в 1960-х годах для использования в молекулярной динамике. Он также использовался Коуэллом и Кроммелином в 1909 году для вычисления орбиты кометы Галлея и Карлом Стёрмером в 1907 году для изучения траектории электрических частиц в магнитном поле (отсюда его также называют методом Штёрмера ). Интегратор Верле обеспечивает хорошую числовую стабильность, а также другие свойства, которые важны для физических систем, такие как обратимость времени и сохранение симплектической формы в фазовом пространстве, без значительных дополнительных вычислительных затрат по сравнению с простым методом Эйлера.

Содержание
  • 1 Базовый Störmer – Verlet
    • 1.1 Уравнения движения
    • 1.2 Интегрирование Верле (без скоростей)
    • 1.3 Ошибка дискретизации
    • 1.4 Простой пример
    • 1.5 Начало итерации
    • 1.6 Непостоянная разница во времени
    • 1.7 Вычисление скоростей - метод Штёрмера – Верле
  • 2 Velocity Verlet
    • 2.1 Алгоритмическое представление
  • 3 Термины ошибок
  • 4 Ограничения
  • 5 Реакции коллизий
  • 6 См. Также
  • 7 Литература
  • 8 Внешние ссылки
Basic Störmer – Verlet

Для дифференциальное уравнение второго порядка типа x → ¨ (t) = A → (x → (t)) {\ displaystyle {\ ddot {\ vec {x}}} (t) = {\ vec {A}} {\ big (} {\ vec {x}} (t) {\ big) }}{\ displaystyle {\ ddot {\ vec {x}}} (t) = {\ vec {A}} {\ big (} {\ vec {x}} (t) {\ big)}} с начальными условиями x → (t 0) = x → 0 {\ displaystyle {\ vec {x}} (t_ {0}) = {\ vec {x}} _ { 0}}{\ displaystyle {\ vec {x}} (t_ {0}) = {\ vec {x}} _ {0}} и x → ˙ (t 0) = v → 0 {\ displaystyle {\ dot {\ vec {x}}} (t_ {0}) = {\ vec {v }} _ {0}}{\ displaystyle {\ dot {\ vec {x}}} (t_ {0}) = {\ vec {v}} _ {0}} , приблизительное численное решение x → n ≈ x → (tn) {\ displaystyle {\ vec {x}} _ {n} \ приблизительно {\ vec { x}} (t_ {n})}{ \ displaystyle {\ vec {x}} _ {n} \ приблизительно {\ vec {x}} (t_ {n})} в моменты времени tn = t 0 + n Δ t {\ displaystyle t_ {n} = t_ {0} + n \, \ Delta t}{\ displaystyle t_ {n} = t_ {0} + n \, \ Delta t} с размером шага Δ t>0 {\ displaystyle \ Delta t>0}{\displaystyle \Delta t>0} можно получить следующим способом:

  • установить x → 1 = x → 0 + v → 0 Δ T + 1 2 A → (Икс → 0) Δ T 2 {\ Displaystyle {\ vec {x}} _ {1} = {\ vec {x}} _ {0} + {\ vec {v}} _ {0} \, \ Delta t + {\ frac {1} {2}} {\ vec {A}} ({\ vec {x}} _ {0}) \, \ Delta t ^ {2}}{\ displaystyle {\ vec {x}} _ {1} = {\ vec {x}} _ {0} + {\ vec {v}} _ {0} \, \ Delta t + {\ frac {1} {2}} {\ vec {A}} ({\ vec {x} } _ {0}) \, \ Delta t ^ {2}} ,
  • для n = 1, 2,... итерация
    x → n + 1 = 2 x → n - x → n - 1 + A → (x → n) Δ t 2. {\ displaystyle {\ vec {x}} _ {n + 1} = 2 {\ vec {x}} _ {n} - {\ vec {x}} _ {n-1} + {\ vec {A} } ({\ vec {x}} _ {n}) \, \ Delta t ^ {2}.}{\ displaystyle {\ vec {x}} _ {n + 1} = 2 {\ vec {x}} _ {n} - {\ vec {x}} _ {n-1} + {\ vec {A}} ({\ vec {x}} _ {n}) \, \ Delta t ^ {2}.}

Уравнения движения

Уравнение движения Ньютона для консервативных физических систем составляет

M Икс → ¨ (T) знак равно F (Икс → (T)) = - ∇ V (x → (T)), {\ Displaystyle M {\ ddot {\ vec {x}}} (т) = F {\ big (} {\ vec {x}} (t) {\ big)} = - \ nabla V {\ big (} {\ vec {x}} (t) {\ big)},}{\ displaystyle M {\ ddot {\ vec {x}}} (t) = F {\ big ( } {\ vec {x}} (t) {\ big)} = - \ nabla V {\ big (} {\ vec {x}} (t) {\ big)},}

или индивидуально

mkx → ¨ К (T) = F К (Икс → (T)) = - ∇ Икс → К V (X → (T)), {\ Displaystyle M_ {k} {\ ddot {\ vec {x} }} _ {k} (t) = F_ {k} {\ big (} {\ vec {x}} (t) {\ big)} = - \ nabla _ {{\ vec {x}} _ {k }} V {\ big (} {\ vec {x}} (t) {\ big)},}{\ displaystyle m_ {k} {\ ddot {\ vec {x}}} _ {k} (t) = F_ {k} {\ big (} {\ vec {x}} (t) {\ big)} = - \ nabla _ {{\ vec {x}} _ {k}} V {\ big (} {\ vec {x}} (t) {\ big)},}

где

t - время,
x → (t) = (x → 1 (т),…, Икс → N (T)) {\ Displaystyle {\ vec {x}} (т) = {\ big (} {\ vec {x}} _ {1} (т), \ ldots, {\ vec {x}} _ {N} (t) {\ big)}}{\ displaystyle { \ vec {x}} (t) = {\ big (} {\ vec {x}} _ {1} (t), \ ldots, {\ vec {x}} _ {N} (t) {\ big)}} - это ансамбль вектора положения N объектов,
V - скалярная потенциальная функция,
F - отрицательный градиент потенциала, задающий ансамбль сил, действующих на частицу. s,
M - матрица масс, обычно диагональная с блоками с массой mk {\ displaystyle m_ {k}}m_ {k } для каждой частицы.

Это уравнение для различных вариантов потенциальной функции V может использоваться для описания эволюции различных физических систем, от движения взаимодействующих молекул до орбиты планет.

После преобразование, чтобы привести массу к правой стороне и забыть о структуре нескольких частиц, уравнение может быть упрощено до

x → ¨ (t) = A (x → (t)) {\ displaystyle {\ ddot {\ vec {x}}} (t) = A {\ big (} {\ vec {x}} (t) {\ big)}}{\ displaystyle {\ ddot {\ vec {x}}} (t) = A {\ big (} {\ vec {x}} (t) {\ большой)}}

с некоторой подходящей векторной функцией A, представляющей позиционно-зависимое ускорение. Обычно начальная позиция x → (0) = x → 0 {\ displaystyle {\ vec {x}} (0) = {\ vec {x}} _ {0}}{\ displaystyle {\ vec {x}} (0) = {\ vec {x}} _ {0}} и начальная скорость v → (0) = x → ˙ (0) = v → 0 {\ displaystyle {\ vec {v}} (0) = {\ dot {\ vec {x}}} (0) = {\ vec {v}} _ {0}}{\ displaystyle {\ vec {v}} (0) = {\ dot {\ vec {x}}} (0) = {\ vec {v}} _ {0}} также даны.

Интегрирование Верле (без скоростей)

Для дискретизации и численного решения этой задачи начального значения временной шаг Δ t>0 {\ displaystyle \ Delta t>0}{\displaystyle \Delta t>0} выбирается, и рассматривается последовательность точек выборки tn = n Δ t {\ displaystyle t_ {n} = n \, \ Delta t}{\ displaystyle t_ {n} = n \, \ Delta t} . Задача состоит в том, чтобы построить последовательность точки x → n {\ displaystyle {\ vec {x}} _ {n}}{\ vec {x}} _ {n} , которые близко следуют за точками x → (tn) {\ displaystyle {\ vec {x} } (t_ {n})}{ \ vec {x}} (t_ {n}) на траектории точного решения.

Где метод Эйлера использует прямую разность приближение к первая производная в дифференциальных уравнениях первого порядка, интегрирование Верле можно рассматривать как использование центральной разности приближения ко второй производной:

Δ 2 x → n Δ t 2 = x → n + 1 - x → n Δ t - x → n - x → n - 1 Δ t Δ t = x → n + 1 - 2 x → n + x → n - 1 Δ t 2 = a → n = A → (x → n). {\ displaystyle {\ frac {\ Delta ^ {2} {\ vec {x}} _ {n}} {\ Delta t ^ {2}}} = {\ frac {{\ frac {{\ vec {x}) } _ {n + 1} - {\ vec {x}} _ {n}} {\ Delta t}} - {\ frac {{\ vec {x}} _ {n} - {\ vec {x}} _ {n-1}} {\ Delta t}}} {\ Delta t}} = {\ frac {{\ vec {x}} _ {n + 1} -2 {\ vec {x}} _ {n } + {\ vec {x}} _ {n-1}} {\ Delta t ^ {2}}} = {\ vec {a}} _ {n} = {\ vec {A}} ({\ vec {x}} _ {n}).}{\ displaystyle {\ frac {\ Delta ^ {2} {\ vec {x}} _ {n}} { \ Delta t ^ {2}}} = {\ frac {{\ frac {{\ vec {x}} _ {n + 1} - {\ vec {x}} _ {n}} {\ Delta t}} - {\ frac {{\ vec {x}} _ {n} - {\ vec {x}} _ {n-1}} {\ Delta t}}} {\ Delta t}} = {\ frac {{ \ vec {x}} _ {n + 1} -2 {\ vec {x}} _ {n} + {\ vec {x}} _ {n-1}} {\ Delta t ^ {2}}} = {\ vec {a}} _ {n} = {\ vec {A}} ({\ vec {x}} _ {n}).}

Интегрирование Верле в форме, используемой в качестве метода Штёрмера, использует это уравнение для получения следующего вектора положения из двух предыдущих без использования скорости как

x → n + 1 = 2 x → n - x → n - 1 + a → n Δ t 2, a → n = A → (x → n). {\ displaystyle {\ vec {x}} _ {n + 1} = 2 {\ vec {x}} _ {n} - {\ vec {x}} _ {n-1} + {\ vec {a} } _ {n} \, \ Delta t ^ {2}, \ qquad {\ vec {a}} _ {n} = {\ vec {A}} ({\ vec {x}} _ {n}). }{\ displaystyle {\ vec {x}} _ {n + 1} = 2 {\ vec {x}} _ {n} - {\ vec {x}} _ {n-1} + {\ vec {a}} _ {n} \, \ Delta t ^ {2}, \ qquad {\ vec {a}} _ {n} = {\ vec {A}} ({\ vec {x}} _ {n}).}

Ошибка дискретизации

Временная симметрия, присущая методу, снижает уровень локальных ошибок, вносимых в интегрирование дискретизацией, за счет удаления всех членов нечетной степени, здесь членов в Δ t { \ displaystyle \ Delta t}\ Delta t третьей степени. Локальная ошибка определяется количественно путем вставки точных значений x → (tn - 1), x → (tn), x → (tn + 1) {\ displaystyle {\ vec {x}} (t_ {n-1 }), {\ vec {x}} (t_ {n}), {\ vec {x}} (t_ {n + 1})}{\ displaystyle {\ vec {x}} (t_ {n-1}), { \ vec {x}} (t_ {n}), {\ vec {x}} (t_ {n + 1})} в итерацию и вычисление разложений Тейлора в момент времени t = tn {\ displaystyle t = t_ {n}}{\ displaystyle t = t_ {n }} вектора положения x → (t ± Δ t) {\ displaystyle {\ vec {x }} (t \ pm \ Delta t)}{\ displaystyle {\ vec {x}} (t \ pm \ Delta t)} в разных направлениях времени:

x → (t + Δ t) = x → (t) + v → (t) Δ t + a → (t) Δ t 2 2 + b → (t) Δ t 3 6 + O (Δ t 4) x → (t - Δ t) = x → (t) - v → (t) Δ t + a → ( t) Δ t 2 2 - b → (t) Δ t 3 6 + O (Δ t 4), {\ displaystyle {\ begin {align} {\ vec {x}} (t + \ Delta t) = {\ vec {x}} (t) + {\ vec {v}} (t) \ Delta t + {\ frac {{\ vec {a}} (t) \ Delta t ^ {2}} {2}} + { \ frac {{\ vec {b}} (t) \ Delta t ^ {3}} {6}} + {\ mathcal {O}} (\ Delta t ^ {4}) \\ {\ vec {x} } (t- \ Delta t) = {\ vec {x}} (t) - {\ vec {v}} (t) \ Delta t + {\ frac {{\ vec {a}} (t) \ Delta t ^ {2}} {2}} - {\ frac {{\ vec {b}} (t) \ Delta t ^ {3}} {6}} + {\ mathcal {O}} (\ De lta t ^ {4}), \ end {align}}}{\ displaystyle {\ begin {align} {\ vec {x}} (t + \ Delta t) = {\ vec {x}} (t) + {\ vec {v }} (t) \ Delta t + {\ frac {{\ vec {a}} (t) \ Delta t ^ {2}} {2}} + {\ frac {{\ vec {b}} (t) \ Delta t ^ {3}} {6}} + {\ mathcal {O}} (\ Delta t ^ {4}) \\ {\ vec {x}} (t- \ Delta t) = {\ vec {x}} (t) - {\ vec {v}} ( t) \ Delta t + {\ frac {{\ vec {a}} (t) \ Delta t ^ {2}} {2}} - {\ frac {{\ vec {b}} (t) \ Delta t ^ {3}} {6}} + {\ mathcal {O}} (\ Delta t ^ {4}), \ end {align}}}

где x → {\ displaystyle {\ vec {x}}}{\ vec {x}} - позиция, v → = x → ˙ {\ displaystyle {\ vec {v}} = {\ dot {\ vec {x}}}}{\ displaystyle {\ vec {v}} = {\ dot {\ vec {x}}}} скорость, a → = x → ¨ {\ displaystyle {\ vec {a}} = {\ ddot {\ vec {x}}}}{\ displaystyle {\ vec {a}} = {\ ddot {\ vec {x }}}} ускорение и b → {\ displaystyle {\ vec {b}}}{\ vec {b}} рывок (третья производная положения по времени).

Сложение этих двух разложений дает

x → (t + Δ t) = 2 x → (t) - x → (t - Δ t) + a → (t) Δ t 2 + O ( Δ t 4). {\ displaystyle {\ vec {x}} (t + \ Delta t) = 2 {\ vec {x}} (t) - {\ vec {x}} (t- \ Delta t) + {\ vec {a} } (t) \ Delta t ^ {2} + {\ mathcal {O}} (\ Delta t ^ {4}).}{\ displaystyle {\ vec {x}} (t + \ Delta t) = 2 {\ vec {x}} (t) - {\ vec {x}} (t- \ Delta t) + {\ vec {a}} (t) \ Delta t ^ {2} + {\ mathcal {O}} (\ Delta t ^ {4}).}

Мы видим, что члены первого и третьего порядка из разложения Тейлора сокращаются out, что делает интегратор Верле на порядок более точным, чем интегрирование с помощью простого разложения Тейлора.

Следует с осторожностью относиться к тому факту, что ускорение здесь вычисляется из точного решения, a → (t) = A (x → (t)) {\ displaystyle {\ vec {a} } (t) = A {\ big (} {\ vec {x}} (t) {\ big)}}{\ displaystyle {\ vec {a}} (t) = A {\ big (} {\ vec {x}} (t) {\ big)}} , тогда как в итерации он вычисляется в центральной точке итерации, a → N = A (x → n) {\ displaystyle {\ vec {a}} _ {n} = A ({\ vec {x}} _ {n})}{\ displaystyle {\ vec {a}} _ {n} = A ({\ vec {x}} _ {n})} . При вычислении глобальной ошибки, то есть расстояния между точным решением и аппроксимационной последовательностью, эти два члена не компенсируются точно, что влияет на порядок глобальной ошибки.

Простой пример

Чтобы понять взаимосвязь локальных и глобальных ошибок, полезно изучить простые примеры, где точное и приближенное решение может быть выражено в явные формулы. Стандартный пример для этой задачи - экспоненциальная функция.

Рассмотрим линейное дифференциальное уравнение x ¨ (t) = w 2 x (t) {\ displaystyle {\ ddot {x}} (t) = w ^ {2} x (t)}{\ displaystyle {\ ddot {x}} (t) = w ^ {2} x (t)} с константой w. Его точные базовые решения: ewt {\ displaystyle e ^ {wt}}e ^ {wt} и e - wt {\ displaystyle e ^ {- wt}}e ^ {- wt} .

Метод Штёрмера, применяемый к этому дифференциальное уравнение приводит к линейному рекуррентному соотношению

xn + 1-2 xn + xn - 1 = h 2 w 2 xn, {\ displaystyle x_ {n + 1} -2x_ {n} + x_ {n- 1} = h ^ {2} w ^ {2} x_ {n},}{\ displaystyle x_ {n + 1} -2x_ {n} + x_ {n-1} = h ^ {2} w ^ {2} x_ { n},}

или

xn + 1-2 (1 + 1 2 (wh) 2) xn + xn - 1 = 0. { \ Displaystyle x_ {n + 1} -2 \ left (1 + {\ tfrac {1} {2}} (wh) ^ {2} \ right) x_ {n} + x_ {n-1} = 0.}{\ displaystyle x_ {n + 1} -2 \ left (1 + {\ tfrac {1} {2}} ( wh) ^ {2} \ right) x_ {n} + x_ {n-1} = 0.}

Ее можно решить, найдя корни характеристического многочлена q 2 - 2 (1 + 1 2 (wh) 2) q + 1 = 0 {\ displaystyle q ^ {2} -2 \ left ( 1 + {\ tfrac {1} {2}} (wh) ^ {2} \ right) q + 1 = 0}{\ displaystyle q ^ {2} -2 \ left (1 + {\ tfrac {1} {2}} (wh) ^ {2} \ right) q + 1 = 0} . Это

q ± = 1 + 1 2 (w h) 2 ± w h 1 + 1 4 (w h) 2. {\ displaystyle q _ {\ pm} = 1 + {\ tfrac {1} {2}} (wh) ^ {2} \ pm wh {\ sqrt {1 + {\ tfrac {1} {4}} (wh) ^ {2}}}.}{\ displaystyle q _ {\ pm} = 1 + {\ tfrac {1} {2}} (wh) ^ {2} \ pm wh {\ sqrt {1 + {\ tfrac {1} {4}} (wh) ^ {2}}}.}

Базовые решения линейной повторяемости: xn = q + n {\ displaystyle x_ {n} = q _ {+} ^ {n}}{\ displaystyle x_ {n} = q _ {+} ^ {n}} и xn = q - n {\ displaystyle x_ {n} = q _ {-} ^ {n}}{\ displaystyle x_ {n} = q _ {-} ^ {n}} . Чтобы сравнить их с точными решениями, вычисляются разложения Тейлора:

q + = 1 + 1 2 (wh) 2 + wh (1 + 1 8 (wh) 2 - 3 128 (wh) 4 + O (h 6)) = 1 + (белый) + 1 2 (белый) 2 + 1 8 (белый) 3 - 3 128 (белый) 5 + O (h 7). {\ displaystyle {\ begin {align} q _ {+} = 1 + {\ tfrac {1} {2}} (wh) ^ {2} + wh \ left (1 + {\ tfrac {1} {8}) } (wh) ^ {2} - {\ tfrac {3} {128}} (wh) ^ {4} + {\ mathcal {O}} (h ^ {6}) \ right) \\ = 1+ (wh) + {\ tfrac {1} {2}} (wh) ^ {2} + {\ tfrac {1} {8}} (wh) ^ {3} - {\ tfrac {3} {128}} (wh) ^ {5} + {\ mathcal {O}} (h ^ {7}). \ end {align}}}{\ displaystyle {\ begin {align} q _ {+} = 1 + {\ tfrac {1} {2}} (wh) ^ {2} + wh \ left (1 + {\ tfrac {1} {8}} (wh) ^ {2} - {\ tfrac {3} { 128}} (wh) ^ {4} + {\ mathcal {O}} (h ^ {6}) \ right) \\ = 1+ (wh) + {\ tfrac {1} {2}} (wh) ^ {2} + {\ tfrac {1} {8}} (wh) ^ {3} - {\ tfrac {3} {128}} (wh) ^ {5} + {\ mathcal {O }} (час ^ {7}). \ end {align}}}

Частное этого ряда с показателем экспоненты ewh {\ displaystyle e ^ {wh}}e ^ { wh} начинается с 1–1 24 (wh) 3 + O (h 5) {\ displaystyle 1 - {\ tfrac {1} {24}} (wh) ^ {3} + {\ mathcal {O}} (h ^ {5})}{\ displaystyle 1 - {\ tfrac {1} {24}} (wh) ^ {3} + {\ mathcal {O}} (h ^ {5})} , поэтому

q + = (1 - 1 24 (wh) 3 + O (h 5)) ewh = e - 1 24 (wh) 3 + O (h 5) ewh. {\ displaystyle {\ begin {align} q _ {+} = \ left (1 - {\ tfrac {1} {24}} (wh) ^ {3} + {\ mathcal {O}} (h ^ {5 }) \ right) e ^ {wh} \\ = e ^ {- {\ frac {1} {24}} (wh) ^ {3} + {\ mathcal {O}} (h ^ {5}) } \, e ^ {wh}. \ end {align}}}{\ displaystyle {\ begin {align} q _ {+} = \ left (1 - {\ tfrac {1} {24}} (wh) ^ {3} + {\ mathcal {O}} (h ^ {5}) \ right) e ^ {wh} \\ = e ^ {- {\ frac {1} {24}} (wh) ^ {3} + {\ mathcal {O}} (h ^ {5})} \, e ^ {wh}. \ End {align}}}

Отсюда следует, что для первого базисного решения ошибка может быть вычислена как

xn = q + n = e - 1 24 (wh) 2 wtn + O (h 4) ewtn = ewtn (1 - 1 24 (wh) 2 wtn + O (h 4)) = ewtn + O (h 2 tnewtn). {\ displaystyle {\ begin {align} x_ {n} = q _ {+} ^ {\; n} = e ^ {- {\ frac {1} {24}} (wh) ^ {2} \, wt_ {n} + {\ mathcal {O}} (h ^ {4})} \, e ^ {wt_ {n}} \\ = e ^ {wt_ {n}} \ left (1 - {\ tfrac { 1} {24}} (wh) ^ {2} \, wt_ {n} + {\ mathcal {O}} (h ^ {4}) \ right) \\ = e ^ {wt_ {n}} + {\ mathcal {O}} (h ^ {2} t_ {n} e ^ {wt_ {n}}). \ end {align}}}{\ displaystyle {\ begin {align} x_ {n} = q_ {+} ^ {\; n} = e ^ {- {\ frac {1} {24}} (wh) ^ {2} \, wt_ {n} + {\ mathcal {O}} (h ^ { 4})} \, e ^ {wt_ {n}} \\ = e ^ {wt_ {n}} \ left (1 - {\ tfrac {1} {24}} ( wh) ^ {2} \, wt_ {n} + {\ mathcal {O}} (h ^ {4}) \ right) \\ = e ^ {wt_ {n}} + {\ mathcal {O}} (час ^ {2} t_ {n} e ^ {wt_ {n}}). \ end {align}}}

То есть, хотя локальная ошибка дискретизации имеет порядок 4, из-за второго порядка дифференциального уравнения глобальная ошибка имеет порядок 2 с константой, которая экспоненциально растет во времени.

Запуск итерации

Обратите внимание, что в начале итерации Verlet на этапе n = 1 {\ displaystyle n = 1}n = 1 , время t = t 1 = Δ t {\ displaystyle t = t_ {1} = \ Delta t}{\ displaystyle t = t_ {1} = \ Delta t} , вычисление x → 2 {\ displaystyle {\ vec {x}} _ {2}}{\ vec {x}} _ { 2} , уже нужен вектор положения x → 1 {\ displaystyle {\ vec {x}} _ {1}}{\ vec {x}} _ {1} в момент t = t 1 { \ Displaystyle t = t_ {1}}t = t_ {1} . На первый взгляд, это может вызвать проблемы, поскольку начальные условия известны только в начальный момент времени t 0 = 0 {\ displaystyle t_ {0} = 0}t_ {0} = 0 . Однако из них ускорение a → 0 = A → (x → 0) {\ displaystyle {\ vec {a}} _ {0} = {\ vec {A}} ({\ vec {x}} _ {0})}{\ displaystyle {\ vec {a} } _ {0} = {\ vec {A}} ({\ vec {x}} _ {0})} известен, и подходящее приближение для положения на первом временном шаге можно получить с помощью полинома Тейлора второй степени:

x → 1 = x → 0 + v → 0 Δ t + 1 2 a → 0 Δ t 2 ≈ x → (Δ t) + O (Δ t 3). {\ displaystyle {\ vec {x}} _ {1} = {\ vec {x}} _ {0} + {\ vec {v}} _ {0} \ Delta t + {\ tfrac {1} {2} } {\ vec {a}} _ {0} \ Delta t ^ {2} \ приблизительно {\ vec {x}} (\ Delta t) + {\ mathcal {O}} (\ Delta t ^ {3}).}{\ displaystyle {\ vec {x}} _ {1} = {\ vec {x}} _ {0} + {\ vec {v}} _ {0} \ Delta t + {\ tfrac {1} {2}} {\ vec {a}} _ {0} \ Delta t ^ { 2} \ приблизительно {\ vec {x}} (\ Delta t) + {\ mathcal {O}} (\ Delta t ^ {3}).}

Тогда ошибка на первом временном шаге имеет порядок O (Δ t 3) {\ displaystyle {\ mathcal {O}} (\ Delta t ^ {3})}{\ mathcal { O}} (\ Delta t ^ {3}) . Это не считается проблемой, потому что при моделировании на большом количестве временных шагов ошибка на первом временном шаге составляет лишь пренебрежимо малую величину от общей ошибки, которая в момент времени tn {\ displaystyle t_ {n} }t_ {n} имеет порядок O (e L tn Δ t 2) {\ displaystyle {\ mathcal {O}} (e ^ {Lt_ {n}} \ Delta t ^ {2}) }{\ displaystyle {\ mathcal {O}} ( е ^ {Lt_ {n}} \ Delta t ^ {2})} , оба для расстояния векторов положения x → n {\ displaystyle {\ vec {x}} _ {n}}{\ vec {x}} _ {n} до x → ( tn) {\ displaystyle {\ vec {x}} (t_ {n})}{ \ vec {x}} (t_ {n}) как для расстояния разделенных разностей x → n + 1 - x → n Δ t {\ displaystyle {\ tfrac {{\ vec {x}} _ {n + 1} - {\ vec {x}} _ {n}} {\ Delta t}}}{\ displaystyle {\ tfrac {{\ vec {x}} _ {n + 1} - {\ vec {x}} _ {n}} {\ Delta t}}} в x → ( tn + 1) - x → (tn) Δ t {\ displaystyle {\ tfrac {{\ vec {x}} (t_ {n + 1}) - {\ vec {x}} (t_ {n})} { \ Delta t}}}{\ displaystyle {\ tfrac {{\ vec {x}} (t_ {n + 1}) - {\ vec {x}} (t_ {n})} {\ Delta t}}} . Более того, чтобы получить эту глобальную ошибку второго порядка, начальная ошибка должна быть не менее третьего порядка.

Непостоянная разница во времени

Недостатком метода Штёрмера – Верле является то, что если временной шаг (Δ t {\ displaystyle \ Delta t}\ Delta t ) изменяется, метод не аппроксимирует решение дифференциального уравнения. Это можно исправить с помощью формулы

x → i + 1 = x → i + (x → i - x → i - 1) (Δ t i / Δ t i - 1) + a → i Δ t i 2. {\ displaystyle {\ vec {x}} _ {я + 1} = {\ vec {x}} _ {i} + ({\ vec {x}} _ {i} - {\ vec {x}} _ {i-1}) (\ Delta t_ {i} / \ Delta t_ {i-1}) + {\ vec {a}} _ {i} \ Delta t_ {i} ^ {2}.}{\ displaystyle {\ vec {x} } _ {i + 1} = {\ vec {x}} _ {i} + ({\ vec {x}} _ {i} - {\ vec {x}} _ {i-1}) (\ Delta t_ {i} / \ Delta t_ {i-1}) + {\ vec {a}} _ {i} \ Delta t_ {i} ^ {2}.}

Более точный вывод использует ряд Тейлора (до второго порядка) в ti {\ displaystyle t_ {i}}t_ {i} для времен ti + 1 = ti + Δ ti {\ displaystyle t_ { я + 1} = t_ {i} + \ Delta t_ {i}}{\ displaystyle t_ {i + 1} = t_ {i} + \ Delta t_ {i}} и ti - 1 = ti - Δ ti - 1 {\ displaystyle t_ {i-1} = t_ {i } - \ Delta t_ {i-1}}{\ displaystyle t_ {i-1} = t_ {i} - \ Delta t_ {i-1}} для получения после исключения v → i {\ displaystyle {\ vec {v}} _ {i}}{\ vec {v}} _ {i}

x → i + 1 - Икс → я Δ ti + x → я - 1 - x → я Δ ti - 1 = a → я Δ ti + Δ ti - 1 2, {\ displaystyle {\ frac {{\ vec {x}} _ { i + 1} - {\ vec {x}} _ {i}} {\ Delta t_ {i}}} + {\ frac {{\ vec {x}} _ {i-1} - {\ vec {x }} _ {i}} {\ Delta t_ {i-1}}} = {\ vec {a}} _ {i} \, {\ frac {\ Delta t_ {i} + \ Delta t_ {i-1 }} {2}},}{\ displaystyle {\ frac {{\ vec {x}} _ {i + 1} - {\ vec {x}} _ {i}} {\ Delta t_ {i}}} + {\ frac {{ \ vec {x}} _ {i-1} - {\ vec {x}} _ {i}} {\ Delta t_ {i-1}}} = {\ vec {a}} _ {i} \, {\ frac {\ Delta t_ {i} + \ Delta t_ {i-1}} {2}},}

так, что формула итерации принимает вид

x → i + 1 = x → i + (x → i - x → i - 1) Δ ti Δ ti - 1 + a → i Δ ti + Δ ti - 1 2 Δ ti. {\ displaystyle {\ vec {x}} _ {я + 1} = {\ vec {x}} _ {i} + ({\ vec {x}} _ {i} - {\ vec {x}} _ {i-1}) {\ frac {\ Delta t_ {i}} {\ Delta t_ {i-1}}} + {\ vec {a}} _ {i} \, {\ frac {\ Delta t_ { i} + \ Delta t_ {i-1}} {2}} \, \ Delta t_ {i}.}{\ displaystyle {\ vec {x}} _ {i + 1} = { \ vec {x}} _ {i} + ({\ vec {x}} _ {i} - {\ vec {x}} _ {i-1}) {\ frac {\ Delta t_ {i}} { \ Delta t_ {i-1}}} + {\ vec {a}} _ {i} \, {\ frac {\ Delta t_ {i} + \ Delta t_ {i-1}} {2}} \, \ Delta t_ {i}.}

Вычисление скоростей - метод Штёрмера – Верле

Скорости явно не указаны в основное уравнение Штермера, но часто они необходимы для вычисления определенных физических величин, таких как кинетическая энергия. Это может создать технические проблемы при моделировании молекулярной динамики, поскольку кинетическая энергия и мгновенные температуры в момент t {\ displaystyle t}t не могут быть рассчитаны для системы, пока не известны положения в момент времени t + Δ t {\ displaystyle t + \ Delta t}t + \ Delta t . С этим недостатком можно справиться либо с помощью алгоритма скорости Верле, либо путем оценки скорости с использованием позиций положения и теоремы о среднем значении :

v → (t) = x → (t + Δ t) - x → (t - Δ t) 2 Δ t + O (Δ t 2). {\ displaystyle {\ vec {v}} (t) = {\ frac {{\ vec {x}} (t + \ Delta t) - {\ vec {x}} (t- \ Delta t)} {2 \ Delta t}} + {\ mathcal {O}} (\ Delta t ^ {2}).}{\ vec {v}} (t) = {\ frac {{\ vec {x}} (t + \ Delta t) - {\ vec {x}} (t- \ Delta t)} {2 \ Delta t}} + {\ mathcal {O}} (\ Delta t ^ {2}).

Обратите внимание, что этот член скорости на шаг отстает от члена положения, поскольку он предназначен для скорости в момент времени t {\ displaystyle t}t , а не t + Δ t {\ displaystyle t + \ Delta t}t + \ Delta t , что означает, что v → n = x → n + 1 - Икс → N - 1 2 Δ T {\ Displaystyle {\ vec {v}} _ {n} = {\ tfrac {{\ vec {x}} _ {n + 1} - {\ vec {x}} _ {n-1}} {2 \ Delta t}}}{\ displaystyle {\ vec {v}} _ {n} = {\ tfrac {{\ vec { x}} _ {n + 1} - {\ vec {x}} _ {n-1}} {2 \ Delta t}}} - это приближение второго порядка к v → (tn) {\ displaystyle {\ vec {v}} (t_ {n})}{\ vec {v}} (t_ {n}) . Используя тот же аргумент, но с уменьшением вдвое временного шага, v → n + 1/2 = x → n + 1 - x → n Δ t {\ displaystyle {\ vec {v}} _ {n + 1/2 } = {\ tfrac {{\ vec {x}} _ {n + 1} - {\ vec {x}} _ {n}} {\ Delta t}}}{\ displaystyle {\ vec {v}} _ {n +1/2} = {\ tfrac {{\ vec {x}} _ {n + 1} - {\ vec {x}} _ {n}} {\ Delta t}}} является второстепенным приближение к v → (tn + 1/2) {\ displaystyle {\ vec {v}} (t_ {n + 1/2})}{\ vec {v}} (t_ {n + 1/2 }) , с tn + 1 / 2 = tn + 1 2 Δ t {\ displaystyle t_ {n + 1/2} = t_ {n} + {\ tfrac {1} {2}} \ Delta t}{\ displaystyle t_ {n + 1/2} = t_ {n} + {\ tfrac {1} {2}} \ Delta t} .

Можно сократить интервал, чтобы приблизительно скорость во время t + Δ t {\ displaystyle t + \ Delta t}t + \ Delta t за счет точности:

v → (t + Δ t) = x → (t + Δ t) - x → (t) Δ t + O (Δ t). {\ displaystyle {\ vec {v}} (t + \ Delta t) = {\ frac {{\ vec {x}} (t + \ Delta t) - {\ vec {x}} (t)} {\ Delta t }} + {\ mathcal {O}} (\ Delta t).}{\ vec {v}} (t + \ Delta t) = {\ frac {{\ vec {x}} (t + \ Delta t) - {\ vec {x}} (t)} {\ Delta t}} + {\ mathcal {O}} (\ Delta t).
Velocity Verlet

Связанным и более часто используемым алгоритмом является алгоритм Velocity Verlet, аналогичный в метод чехарда, за исключением того, что скорость и положение вычисляются при одном и том же значении переменной времени (чехарда не делает, как следует из названия). Здесь используется аналогичный подход, но явно учитывается скорость, решая проблему первого временного шага в базовом алгоритме Верле:

x → (t + Δ t) = x → (t) + v → (t) Δ t + 1 2 a → (t) Δ t 2, {\ displaystyle {\ vec {x}} (t + \ Delta t) = {\ vec {x}} (t) + {\ vec {v}} (t) \, \ Delta t + {\ frac {1} {2}} \, {\ vec {a}} (t) \ Delta t ^ {2},}{\ displaystyle {\ vec {x}} (t + \ Delta t) = {\ vec {x}} (t) + {\ vec {v}} (t) \, \ Delta t + {\ frac { 1} {2}} \, {\ vec {a}} (t) \ Delta t ^ {2},}
v → (t + Δ t) = v → (t) + a → (t) + a → (t + Δ t) 2 Δ t. {\ displaystyle {\ vec {v}} (t + \ Delta t) = {\ vec {v}} (t) + {\ frac {{\ vec {a}} (t) + {\ vec {a}} (t + \ Delta t)} {2}} \ Delta t.}{\ displaystyle {\ vec {v}} (t + \ Delta t) = {\ vec {v}} (t) + {\ frac {{\ vec {a}} (t) + {\ vec {a}} (t + \ Delta t)} {2}} \ Delta t.}

Можно показать, что ошибка скорости Верле имеет тот же порядок, что и в базовом Верле. Обратите внимание, что алгоритм скорости не обязательно требует большего объема памяти, потому что нет необходимости отслеживать скорость на каждом временном шаге во время моделирования. Стандартная схема реализации этого алгоритма:

  1. Вычислить v → (t + 1 2 Δ t) = v → (t) + 1 2 a → (t) Δ t {\ displaystyle {\ vec {v }} \ left (t + {\ tfrac {1} {2}} \, \ Delta t \ right) = {\ vec {v}} (t) + {\ tfrac {1} {2}} \, {\ vec {a}} (t) \, \ Delta t}{\ displaystyle {\ vec {v}} \ left (t + {\ tfrac {1} {2}} \, \ Delta t \ right) = {\ vec {v}} (t) + {\ tfrac { 1} {2}} \, {\ vec {a}} (t) \, \ Delta t} .
  2. Вычислить x → (t + Δ t) = x → (t) + v → (t + 1 2 Δ t) Δ t {\ displaystyle {\ vec {x}} (t + \ Delta t) = {\ vec {x}} (t) + {\ vec {v}} \ left (t + {\ tfrac {1} {2}} \, \ Delta t \ right) \, \ Delta t}{\ displaystyle {\ vec {x}} (t + \ Delta t) = {\ vec {x}} (t) + {\ vec { v}} \ left (t + {\ tfrac {1} {2}} \, \ Delta t \ right) \, \ Delta t} .
  3. Вывести a → (t + Δ t) {\ displaystyle {\ vec {a}} (t + \ Delta t)}{\ vec {a}} (t + \ Delta t) из потенциал взаимодействия с помощью x → (t + Δ t) {\ displaystyle {\ vec {x}} (t + \ Delta t)}{\ vec {x}} (t + \ Delta t) .
  4. Вычислить v → (t + Δ t) = v → (T + 1 2 Δ t) + 1 2 a → (t + Δ t) Δ t {\ displaystyle {\ vec {v}} (t + \ Delta t) = {\ vec {v}} \ left (t + { \ tfrac {1} {2}} \, \ Delta t \ right) + {\ tfrac {1} {2}} \, {\ vec {a}} (t + \ Delta t) \ Delta t}{\ displaystyle {\ vec {v}} (t + \ Delta t) = {\ vec {v}} \ left (t + {\ tfrac {1} {2 }} \, \ Delta t \ right) + {\ tfrac {1} {2}} \, {\ vec {a}} (t + \ Delta t) \ Delta t} .

Исключая скорость полушага, этот алгоритм можно сократить до

  1. Вычислить x → (t + Δ t) = x → (t) + v → (t) Δ t + 1 2 a → (t) Δ t 2 {\ displaystyle {\ vec {x}} (t + \ Delta t) = {\ vec {x}} (t) + {\ vec {v}} (t) \, \ Delta t + {\ tfrac {1} {2}} \, {\ vec {a}} (t) \, \ Delta t ^ {2}}{\ displaystyle {\ vec { x}} (t + \ Delta t) = {\ vec {x}} (t) + {\ vec {v}} (t) \, \ Delta t + {\ tfrac {1} {2}} \, {\ vec {a}} (t) \, \ Delta t ^ {2}} .
  2. Вывести a → (t + Δ t) {\ displaystyle {\ vec {a} } (t + \ Delta t)}{\ vec {a}} (t + \ Delta t) из потенциала взаимодействия с использованием x → (t + Δ t) {\ displaystyle {\ vec {x}} (t + \ Delta t)}{\ vec {x}} (t + \ Delta t) .
  3. Вычислить v → (t + Δ t) = v → (t) + 1 2 (a → (t) + a → (t + Δ t)) Δ t {\ displaystyle {\ vec {v}} ( t + \ Delta t) = {\ vec {v}} (t) + {\ tfrac {1} {2}} \, {\ big (} {\ vec {a}} (t) + {\ vec {a }} (t + \ Delta t) {\ big)} \ Delta t}{\ displaystyle {\ vec {v}} (t + \ Delta t) = {\ vec {v}} (t) + {\ tfrac {1} {2}} \, {\ big (} {\ vec {a}} (t) + {\ vec {a}} (t + \ Delta t) {\ big)} \ Delta t} .

Однако обратите внимание, что этот алгоритм предполагает, что ускорение a → (t + Δ t) {\ displaystyle {\ vec {a} } (t + \ Delta t)}{\ vec {a}} (t + \ Delta t) зависит только от позиции x → (t + Δ t) {\ displaystyle {\ vec {x}} (t + \ Delta t)}{\ vec {x}} (t + \ Delta t) и не зависит от скорости v → (t + Δ t) {\ displaystyle {\ vec {v}} (t + \ Delta t)}{\ vec {v}} (t + \ Delta t) .

Можно заметить, что долгосрочные результаты скорости Верле и ему подобная чехарда на порядок лучше, чем полунеявный метод Эйлера . г. Алгоритмы практически идентичны вплоть до сдвига скорости на половину временного шага. Это легко проверить, повернув вышеуказанный цикл, чтобы начать с шага 3, а затем заметить, что член ускорения на шаге 1 может быть исключен путем объединения шагов 2 и 4. Единственное отличие состоит в том, что средняя скорость в скорости Верле считается конечной скоростью. в полунеявном методе Эйлера.

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

. Метод Верле по скорости является частным случаем бета-версии Ньюмарка. метод с β = 0 {\ displaystyle \ beta = 0}\ beta = 0 и γ = 1/2 {\ displaystyle \ gamma = 1/2}\ gamma = 1 / 2 .

Алгоритмическое представление

Поскольку velocity Verlet является обычно полезным алгоритмом в 3D-приложениях, общее решение, написанное на C ++, может выглядеть так, как показано ниже. Упрощенная сила сопротивления используется для демонстрации изменения ускорения, однако она необходима только в том случае, если ускорение не является постоянным.

1 struct Body 2 {3 Vec3d pos {0.0, 0.0, 0.0}; 4 Vec3d vel {2.0, 0.0, 0.0}; // 2 м / с по оси x 5 Vec3d acc {0.0, 0.0, 0.0}; // первые 6 раз ускорения нет double mass = 1.0; // 1 кг 7 двойное перетаскивание = 0,1; // rho * C * Area - упрощенное перетаскивание для этого примера 8 9 / ** 10 * Обновить pos и vel с помощью интеграции "Velocity Verlet" 11 * @param dt DeltaTime / time step [например: 0,01] 12 * / 13 void update (двойной dt) 14 {15 Vec3d new_pos = pos + vel * dt + acc * (dt * dt * 0.5); 16 Vec3d new_acc = apply_forces (); // требуется, только если ускорение непостоянно 17 Vec3d new_vel = vel + (acc + new_acc) * (dt * 0.5); 18 pos = new_pos; 19 vel = new_vel; 20 acc = new_acc; 21} 22 23 Vec3d apply_forces () const 24 {25 Vec3d grav_acc = Vec3d {0.0, 0.0, -9.81}; // 9,81 м / с ^ 2 вниз по оси Z 26 Vec3d drag_force = 0,5 * drag * (vel * abs (vel)); // D = 0.5 * (rho * C * Area * vel ^ 2) 27 Vec3d drag_acc = drag_force / mass; // a = F / m 28 return grav_acc - drag_acc; 29} 30};
Условия ошибки

Локальная ошибка положения интегратора Верле составляет O (Δ t 4) {\ displaystyle O (\ Delta t ^ {4})}O (\ Delta t ^ {4}) как описано выше, а локальная ошибка скорости равна O (Δ t 2) {\ displaystyle O (\ Delta t ^ {2})}O (\ Delta t ^ {2}) .

Общая ошибка положения, напротив, составляет O (Δ t 2) {\ displaystyle O (\ Delta t ^ {2})}O (\ Delta t ^ {2}) , а глобальная ошибка скорости равна O (Δ t 2) {\ displaystyle O (\ Delta t ^ {2})}O (\ Delta t ^ {2}) . Их можно получить, отметив следующее:

error (x (t 0 + Δ t)) = O (Δ t 4) {\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} + \ Delta t) {\ bigr)} = O (\ Delta t ^ {4})}\ mathrm {error} {\ bigl (} x (t_ {0 } + \ Delta t) {\ bigr)} = O (\ Delta t ^ {4})

и

x (t 0 + 2 Δ t) = 2 x (t 0 + Δ t) - x ( t 0) + Δ t 2 x ″ (t 0 + Δ t) + O (Δ t 4). {\ displaystyle x (t_ {0} +2 \ Delta t) = 2x (t_ {0} + \ Delta t) -x (t_ {0}) + \ Delta t ^ {2} x '' (t_ {0 } + \ Delta t) + O (\ Delta t ^ {4}).}{\displaystyle x(t_{0}+2\Delta t)=2x(t_{0}+\Delta t)-x(t_{0})+\Delta t^{2}x''(t_{0}+\Delta t)+O(\Delta t^{4}).}

Следовательно,

error (x (t 0 + 2 Δ t)) = 2 error (x (t 0 + Δ t)) + O (Δ t 4) = 3 O (Δ t 4). {\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} +2 \ Delta t) {\ bigr)} = 2 \ mathrm {error} {\ bigl (} x (t_ {0} + \ Delta t) {\ bigr)} + ​​O (\ Delta t ^ {4}) = 3 \, O (\ Delta t ^ {4}).}{\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} +2 \ Delta t) {\ bigr)} = 2 \ mathrm {error} {\ bigl (} x (t_ {0} + \ Delta t) { \ bigr)} + ​​O (\ Delta t ^ {4}) = 3 \, O (\ Delta t ^ {4}).}

Аналогично:

error (x (t 0 + 3 Δ t)) знак равно 6 О (Δ t 4), {\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} +3 \ Delta t) {\ bigl)} = 6 \, O ( \ Delta t ^ {4}),}{\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} +3 \ Delta t) { \ bigl)} = 6 \, O (\ Delta t ^ {4}),}
ошибка (x (t 0 + 4 Δ t)) = 10 O (Δ t 4), {\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} +4 \ Delta t) {\ bigl)} = 10 \, O (\ Delta t ^ {4}),}{\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} +4 \ Delta t) {\ bigl)} = 10 \, O (\ Delta t ^ {4}),}
ошибка (x (t 0 + 5 Δ t)) = 15 O (Δ t 4), {\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} +5 \ Delta t) {\ bigl)} = 15 \, O (\ Delta t ^ {4}),}{\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} +5 \ Delta t) {\ bigl)} = 15 \, O (\ Delta t ^ {4 }),}

, который можно обобщить до (это можно показать по индукции, но здесь приводится без доказательства):

error (x (t 0 + n Δ t)) = n (n + 1) 2 O ( Δ t 4). {\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} + n \ Delta t) {\ bigr)} = {\ frac {n (n + 1)} {2}} \, O ( \ Delta t ^ {4}).}{\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} + n \ Delta t) {\ bigr)} = {\ frac {n (n + 1)} { 2}} \, O (\ Delta t ^ {4}).}

Если мы рассмотрим глобальную ошибку в положении между x (t) {\ displaystyle x (t)}x (t) и x (t + T) {\ displaystyle x (t + T)}{\ displaystyle x (t + T)} , где T = n Δ t {\ displaystyle T = n \ Delta t}T = n \ Delta t , ясно, что

ошибка (x (t 0 + T)) = (T 2 2 Δ t 2 + T 2 Δ t) O (Δ t 4), {\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} + T) {\ bigr)} = \ left ({\ frac {T ^ {2}} {2 \ Delta t ^ {2}}} + {\ frac {T} {2 \ Delta t}} \ right) O (\ Delta t ^ {4}),}{\ displaystyle \ mathrm {error} {\ bigl (} x (t_ {0} + T)) {\ bigr)} = \ left ({\ frac {T ^ {2}} {2 \ Delta t ^ {2}}} + {\ frac {T} {2 \ Delta t}} \ right) O ( \ Delta t ^ {4}),}

и, следовательно, глобальная (кумулятивная) ошибка за постоянный интервал времени определяется как

error (x (t 0 + T)) = O (Δ t 2). {\ displaystyle \ mathrm {error} {\ bigr (} x (t_ {0} + T) {\ bigl)} = O (\ Delta t ^ {2}).}{\ displaystyle \ mathrm {error} {\ bigr (} x (t_ {0} + T) {\ bigl)} = O (\ Delta t ^ {2}).}

. Поскольку скорость определяется в не совокупный путь от позиций в интеграторе Верле, глобальная ошибка скорости также O (Δ t 2) {\ displaystyle O (\ Delta t ^ {2})}O (\ Delta t ^ {2}) .

при моделировании молекулярной динамики, глобальная ошибка обычно намного важнее, чем локальная ошибка, поэтому интегратор Верле известен как интегратор второго порядка.

Ограничения

Системы из нескольких частиц с ограничениями проще решать с помощью интегрирования Верле, чем с помощью методов Эйлера. Ограничения между точками могут быть, например, потенциалами, ограничивающими их определенным расстоянием, или силами притяжения. Их можно смоделировать как пружины, соединяющие частицы. Затем с использованием пружин бесконечной жесткости модель может быть решена с помощью алгоритма Верле.

В одном измерении соотношение между неограниченными позициями x ~ i (t) {\ displaystyle {\ tilde {x}} _ {i} ^ {(t)}}{ \ tilde {x}} _ {i} ^ {(t)} и фактические позиции xi (t) {\ displaystyle x_ {i} ^ {(t)}}x_ {i} ^ {(t)} точек i в момент времени t могут быть найдены с помощью алгоритма

d 1 знак равно x 2 (t) - x 1 (t), {\ displaystyle d_ {1} = x_ {2} ^ {(t)} - ​​x_ {1} ^ {(t)},}{\ displaystyle d_ {1} = x_ {2} ^ {(t)} - ​​x_ {1} ^ {(t)},}
d 2 = ‖ D 1 ‖, {\ displaystyle d_ {2} = \ | d_ {1} \ |,}{\ displaystyle d_ {2} = \ | d_ {1} \ |,}
d 3 = d 2 - rd 2, {\ displaystyle d_ {3} = {\ frac {d_ {2) } -r} {d_ {2}}},}{\ displaystyle d_ {3} = {\ гидроразрыв {d_ {2} -r} {d_ {2}}},}
x 1 (t + Δ t) = x ~ 1 (t + Δ t) + 1 2 d 1 d 3, {\ displaystyle x_ {1} ^ {(t + \ Delta t)} = {\ tilde {x}} _ {1} ^ {(t + \ Delta t)} + {\ frac {1} {2}} d_ {1} d_ {3},}{\ displaystyle x_ {1} ^ {(t + \ Delta t)} = {\ tilde {x}} _ {1} ^ {(t + \ Delta t)} + {\ frac {1} {2}} d_ {1} d_ {3},}
х 2 (t + Δ t) = x ~ 2 (t + Δ t) - 1 2 d 1 d 3. {\ displaystyle x_ {2} ^ {(t + \ Delta t)} = {\ tilde {x}} _ {2} ^ {(t + \ Delta t)} - ​​{\ frac {1} {2}} d_ { 1} d_ {3}.}{\ displaystyle x_ {2} ^ {(t + \ Дельта t)} = {\ tilde {x}} _ {2} ^ {(t + \ Delta t)} - ​​{\ frac {1} {2}} d_ {1} d_ {3}.}

Интеграция Верле полезна, потому что она напрямую связывает силу с положением, а не решает проблему с использованием скоростей.

Проблемы, однако, возникают, когда на каждую частицу действуют несколько сдерживающих сил. Один из способов решить эту проблему - перебрать каждую точку в моделировании так, чтобы в каждой точке ослабление ограничения последней уже использовалось для ускорения распространения информации. В моделировании это может быть реализовано с использованием небольших временных шагов для моделирования, использования фиксированного количества шагов решения ограничений на каждый временной шаг или решения ограничений до тех пор, пока они не встретятся с определенным отклонением.

При приближении ограничений локально к первому порядку это то же самое, что и метод Гаусса – Зейделя. Для небольших матриц известно, что LU-разложение происходит быстрее. Большие системы можно разделить на кластеры (например, каждая ragdoll = cluster). Внутри кластеров используется метод LU, между кластерами - метод Гаусса – Зейделя. Матричный код можно использовать повторно: зависимость сил от положений может быть аппроксимирована локально до первого порядка, а интеграция Верле может быть сделана более неявной.

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

Другой способ решения голономные ограничения - использовать алгоритмы ограничения.

Реакции на столкновения

Один из способов реагировать на столкновения - использовать систему на основе штрафов, которая в основном применяет установленную силу к точке при контакте. Проблема в том, что очень сложно выбрать сообщаемую силу. Используйте слишком сильную силу, и объекты станут неустойчивыми, слишком слабыми, и объекты будут проникать друг в друга. Другой способ - использовать реакцию на столкновение проекции ion, который берет проблемную точку и пытается переместить ее на кратчайшее возможное расстояние, чтобы вывести ее из другого объекта.

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

Два простейших метода определения новой скорости - это совершенно упругие и неупругие столкновения. Немного более сложная стратегия, которая предлагает больший контроль, будет включать использование коэффициента восстановления .

См. Также
Литература
  1. ^Верле, Лу (1967). «Компьютерные« эксперименты »над классическими жидкостями. I. Термодинамические свойства молекул Леннарда-Джонса». Физический обзор. 159 (1): 98–103. Bibcode : 1967PhRv..159... 98V. doi : 10.1103 / PhysRev.159.98.
  2. ^Press, W.H.; Теукольский, С. А.; Vetterling, W. T.; Фланнери, Б. П. (2007). «Раздел 17.4. Консервативные уравнения второго порядка». Числовые рецепты: искусство научных вычислений (3-е изд.). Нью-Йорк: Издательство Кембриджского университета. ISBN 978-0-521-88068-8.
  3. ^веб-страница Архивировано 2004-08-03 на Wayback Machine с описание метода Штёрмера.
  4. ^Даммер, Джонатан. «Простой метод интеграции Верле с временной коррекцией».
  5. ^Свуп, Уильям К.; Х. К. Андерсен; П. Х. Беренс; К. Р. Уилсон (1 января 1982 г.). «Метод компьютерного моделирования для расчета констант равновесия для образования физических кластеров молекул: приложение к небольшим кластерам воды». Журнал химической физики. 76 (1): 648 (Приложение). Bibcode : 1982JChPh..76..637S. doi : 10.1063 / 1.442716.
  6. ^Хайрер, Эрнст; Любич, Кристиан; Ваннер, Герхард (2003). «Геометрическое численное интегрирование, иллюстрированное методом Штёрмера / Верле». Acta Numerica. 12 : 399–450. Bibcode : 2003AcNum..12..399H. CiteSeerX 10.1.1.7.7106. doi : 10.1017 / S0962492902000144.
  7. ^Руководство пользователя SuperLU.
  8. ^Baraff, D.; Виткин, А. (1998). «Большие шаги в моделировании ткани» (PDF). Компьютерная графика Труды. Ежегодная серия конференций: 43–54.
Внешние ссылки
Последняя правка сделана 2021-06-18 11:31:35
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте