Отскок интеграции Verlet - PullRequest
       16

Отскок интеграции Verlet

3 голосов
/ 30 октября 2010

Я пытаюсь изучить интеграцию с Verlet, в основном из-за того, что мне скучно, и я хочу улучшить свое обычное учебное упражнение "прыгающий мяч".

У меня есть простая страница Canvas / HTML5 с прыгающим мячом на http://sandbox.electricgrey.com:8080/physics/. Если вы нажмете на нее, вы заметите, что шар не всегда отскакивает на одну и ту же высоту. Иногда выше, иногда ниже. Почему он это делает?

Это потому, что я слишком сильно упрощаю? Мне действительно нужно рассчитывать частичные временные шаги, чтобы я точно знал, когда / где мяч сталкивается, а затем продолжил оттуда?

PS: Если у вас есть какие-либо комментарии по поводу моего HTML или Javascript, я хотел бы их услышать. Я только учусь кодировать с помощью Javascript и хочу убедиться, что я делаю это Правильным путем ™.

Ответы [ 2 ]

1 голос
/ 30 октября 2010

В алгоритме Верле самым важным является шаг по времени для расчета следующего шага. С помощью алгоритма Verlet вы используете: Basic или Velocity? Что вы думаете о столкновении с полом? Я вижу, что точка столкновения не всегда на одной высоте. В этом случае вы должны рассчитать время до столкновения (t1), сделать движение с t1, сделать столкновение, а затем сделать движение со временем (t_step - t1). Я использую этот метод в первой реализации этой модели

0 голосов
/ 31 октября 2010

Как сказал Асар, вам, вероятно, нужно изменить размер шага. Попробуйте что-то вроде следующего и посмотрите, сможете ли вы решить проблему, изменив значение t.

    function Vertex(x,y,vx,vy,t) {
        this.t = t
        this.x = x;
        this.y = y;
        this.px = x-vx*t;
        this.py = y-vy*t;

        .......
        this.tick = function() {
            ....
            var tx = this.x;
            var ty = this.y;
            this.x = this.x + (this.x - this.px) + this.ax * this.t;
            this.y = this.y + (this.y - this.py) + this.ay * this.t;
            ....
          }  
  ....
}  

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

if (this.y < this.r) {
    this.y = 2 * this.r - this.y;
    this.py = 2 * this.r - this.py;
}

Если шар отскакивает в середине временного шага, то он движется в направлении гравитационной силы в течение первой части временного шага, но он уходит от гравитационной силы в течение последней части временного шага , Эти два вклада должны частично отменять друг друга. Но в вашем коде вы предполагаете, что гравитационная сила тянет мяч вперед в течение всего временного шага. Вы можете объяснить эту ошибку, изменив формулы в вышеприведенном методе, добавив в него термин, содержащий «this.ax * this.t». (Но я не совсем уверен, как должен выглядеть этот термин).

Лучший способ отладки такой программы - нарисовать график, на котором у вас есть время по оси x и полная механическая энергия по оси y. Тогда вы можете легко определить, теряете ли вы энергию во время скачков или в течение обычных временных шагов.

http://sandbox.electricgrey.com:8080/physics/physics.js

...