Описание тега 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) вокруг начального уровня энергии.