Описание тега verlet-integration
Проблема, которую нужно решить
Интегрирование Верле - это метод численного решения дифференциальных уравнений
х ''(t) = a(x (t)), x (t 0) = x 0, x'(t 0) = v 0
которые моделируют механические системы и другие консервативные или гамильтоновы системы. Предполагается, что объекты системы пронумерованы, а их положения собраны в вектор x(t), а их скорости собраны в векторную функцию v(t)=x'(t). a(t) состоит из ускорений отдельных объектов, соответствующих силе, действующей на каждый объект, деленной на его массу.
Интеграция Верле - это симплектический интегратор, который работает должным образом только в консервативных системах, что, например, исключает учет трения. Точнее, это означает, что система должна обладать функцией энергии.
E(x,v) = 0,5 * v T * M * v + P(x)
где первый член - это кинетическая энергия, M - (симметричная и часто диагональная) матрица масс, а P(x) - потенциальная энергия. Тогда сила, действующая на объекты системы, равна минус градиенту потенциальной энергии и, таким образом, ускорение равно
а (х) = - М -1 * град Р (х).
Обычно динамическая система кодируется посредством вычисления функции a(x), такая процедура называется eval_a(x)
в этой статье.
Полученное решение
Интегрирование Верле, как и любое численное интегрирование ODE, дает последовательности
(x n), (v n), (n в IN)
точек выборки в фазовом пространстве положений и скоростей, соответствующих заданной последовательности (t n) моментов времени, так что x n и v n аппроксимируют точные решения x (t n) и v (t n) = x'(т п).
В формулировке метода скорости имеют второстепенное значение, в базовом варианте они даже не учитываются.
Численный метод (ы)
Интеграция Verlet бывает трех основных видов, все три с постоянным шагом времени. dt
, так что t n = t 0 + n * dt. Все три вычисляют одну и ту же последовательность позиций, базовый Верле вычисляет только это. Два других также вычисляют скорости, в то время как вариант чехарда имеет наименьшее количество операций, для точных скоростей следует использовать скоростной метод Верле.
базовый Verlet: перед каждым шагом n->n+1 переменные
t, x, x_old
являются t n, xn, xn-1, инициализация возвращается с состоянием для n=1.verlet_init: x_old = x0 a = eval_a( x0 ); x = x0 + v0*dt + 0.5*a*dt*dt; t=t0+dt; verlet_step: a = eval_a(x); x_new = 2*x-x_old + a*dt*dt; x_old = x; x = x_new; t+=dt; do_collisions(t,x,x_old);
скорость верлета: перед каждым шагом n->n+1 переменные
t, x, v
являются t n, x n, v n, инициализация возвращается с состоянием для n=0.verlet_init: a = eval_a( x0 ); v = v0; x = x0; t = t0; verlet_step: v += a*0.5*dt; x += v*dt; t += dt; do_collisions(t,x,v,dt); a = eval_a(x); v += a*0.5*dt; do_statistics(t,x,v);
leapfrog verlet: перед каждым шагом n->n+1 переменные
t, x, v
являются t n, x n, v n + 0,5, где t n + 0,5 = t n + 0,5*dt, инициализация возвращается с состоянием для n=0.verlet_init: a = eval_a( x0 ); v = v0 + 0.5*a*dt; x = x0; t=t0; verlet_step: x += v*dt; t += dt; do_collisions(t,x,v,dt); a = eval_a(x); v += a*dt;
Последовательность вычислений должна быть сохранена, однако строки внутри verlet_step могут быть повернуты. Затем необходимо адаптировать инициализацию, чтобы развернутый цикл оставался прежним.
Числовые ошибки
Ошибка аппроксимации в момент времени t ведет себя как O(eLt* dt 2), это метод второго порядка.
Метод интегрирования Верле принадлежит к семейству симплектических методов интегрирования. Они почти идеально сохраняют энергию E и другие первые интегралы системы. В методе Верле энергия колеблется с постоянной времени амплитудой O(dt2) вокруг начального уровня энергии.