NSV, Euler Integration Confusion - PullRequest
       14

NSV, Euler Integration Confusion

0 голосов
/ 23 июня 2011

Я пытаюсь разобраться в этих методах интеграции, и я глубоко сбит с толку.

Вот код:

public void update_euler(float timeDelta){
    vPos.y += vVelocity.y * timeDelta; 
    vVelocity.y += gravity.y * timeDelta;
}


public void update_nsv(float timeDelta){    
    vVelocity.y += gravity.y*timeDelta;
    vPos.y += vVelocity.y * timeDelta; 
}


public void onDrawFrame(GL10 gl) {      
    currentTime = System.currentTimeMillis();
    float timeDelta = currentTime - startTime;
    startTime = currentTime;
    timeDelta *= 1.0f/1000;;

//  update_RK4(timeDelta);
//  update_nsv(timeDelta);
//  update_euler(timeDelta);
//  update_velocity_verlet(timeDelta);
}

Во-первых, я просто хочу убедиться, что я правильно понял.

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

Метод Эйлера, мяч отскакивает выше при каждом отскоке. Это из-за ошибки в моем коде или из-за неточности метода. Я читал, что с интеграцией Эйлера вы теряете энергию с течением времени. Ну, я получаю это, и я не знаю почему.

Метод nsv: я не совсем понимаю, чем он отличается от метода Eular, но в любом случае мяч отскакивает ниже при каждом отскоке. Потеря энергии, которую я прочитал, не должна происходить с помощью метода nsv. Почему я теряю энергию?

(методы verlet и RK4 работают так, как я ожидал).

У меня сложилось впечатление, что мне не хватает фундаментальной информации по этому вопросу, но я не знаю, что.

Я понимаю, что моего временного шага не хватает, и его обновление для запуска физики с использованием статического временного шага остановило бы меня на потерю / получение энергии, но я пытаюсь понять, что происходит.

Буду признателен за любую помощь.

Ответы [ 3 ]

2 голосов
/ 23 июня 2011

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

public void update_avg(float timeDelta){    
    vVelocity.y += gravity.y*timeDelta/2;
    vPos.y += vVelocity.y * timeDelta; 
    vVelocity.y += gravity.y*timeDelta/2;
}

То, что я делаю здесь,Обновление скорости до средней скорости за интервал, затем обновление позиции на основе этой скорости, затем обновление скорости до скорости в конце интервала.

Если у вас есть более сложный сценарий, который вы хотитедля моделирования рассмотрим использование метода Рунге-Кутты для решения дифференциальных уравнений вида y' = f(x, y).(Обратите внимание, что здесь y может быть набором различных переменных. Так что в вашем случае у вас будет d(position, velocity)/dt = (velocity, -gravity). И код, который я вам дал, работает так же, как версия этого метода второго порядка.

1 голос
/ 23 июня 2011

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

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

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

Оба метода одинаковы в пределе, когда timeDelta обнуляется. (Если это утверждение не имело смысла, не волнуйтесь, это просто исчисление.) Если вы сделаете timeDelta маленьким, эффект должен исчезнуть. Или вы могли бы использовать энергию в качестве основной переменной, а не {положение, скорость}, но математика была бы немного сложнее.

0 голосов
/ 23 июня 2011

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

...