Ответ 1
Я нашел этот вопрос очень интересным, так как недавно я сделал некоторую работу по моделированию движения снаряда с помощью drag.
Точка 1:. Вы существенно обновляете положение и скорость, используя явную/передовую итерацию Эйлера, где каждый новое значение для состояний должно быть функцией старых значений. В таком случае вы должны сначала обновить позицию, а затем обновить скорость.
Точка 2: Есть более реалистичные физические модели для эффект трения от трения. Одна модель (предложенная Adam Liss) включает в себя силу сопротивления, пропорциональную скорости (известную как сопротивление Стокса, что в целом относится к ситуациям с низкой скоростью). Тот, который я ранее предлагал, включает в себя силу сопротивления, пропорциональную квадрату скорости (известному как квадратичное сопротивление, которое обычно относится к ситуациям с высокой скоростью). Я обращусь к каждому из них в отношении того, как вы бы вывели формулы для максимальной скорости и времени, необходимого для эффективного достижения максимальной скорости. Я откажусь от полных выводов, поскольку они довольно вовлечены.
Уравнение для обновления скорости будет:
velocity += acceleration - friction*velocity
который представляет собой следующее дифференциальное уравнение:
dv/dt = a - f*v
Используя первую запись в эту интегральную таблицу, мы можем найти решение (считая v = 0 при t = 0):
v = (a/f) - (a/f)*exp(-f*t)
Максимальная (т.е. конечная) скорость возникает, когда t → 0, так что второй член в уравнении очень близок к нулю и:
v_max = a/f
Относительно времени, необходимого для достижения максимальной скорости, обратите внимание на то, что уравнение никогда действительно не достигает этого, а вместо этого асимптотирует к нему. Однако, когда аргумент экспоненты равен -5, скорость составляет около 98% от максимальной скорости, вероятно, достаточно близкой, чтобы считать ее равной. Затем вы можете приблизиться к максимальной скорости как:
t_max = 5/f
Затем вы можете использовать эти два уравнения для f и a с учетом желаемого vmax и tmax.
Уравнение для обновления скорости будет:
velocity += acceleration - friction*velocity*velocity
который представляет собой следующее дифференциальное уравнение:
dv/dt = a - f*v^2
Используя первую запись в эту интегральную таблицу, мы можем найти решение (предполагая, что v = 0 при t = 0):
v = sqrt(a/f)*(exp(2*sqrt(a*f)*t) - 1)/(exp(2*sqrt(a*f)*t) + 1)
Максимальная (т.е. конечная) скорость возникает при t → 0, так что экспоненциальные члены много больше 1 и приближается уравнение:
v_max = sqrt(a/f)
Относительно времени, необходимого для достижения максимальной скорости, обратите внимание на то, что уравнение никогда действительно не достигает этого, а вместо этого асимптотирует к нему. Однако, когда аргумент экспоненты равен 5, скорость составляет около 99% от максимальной скорости, вероятно, достаточно близко, чтобы считать ее равной. Затем вы можете приблизиться к максимальной скорости как:
t_max = 2.5/sqrt(a*f)
что также эквивалентно:
t_max = 2.5/(f*v_max)
Для желаемого vmax и tmax второе уравнение для tmax сообщит вам, что f должно быть, а затем вы можете подключить это к уравнению для vmax, чтобы получить значение a.
Это кажется немного излишним, но на самом деле это одни из самых простых способов моделирования модели! Любой, кто действительно хочет увидеть шаги интеграции, может застрелить меня по электронной почте, и я отправлю их вам. Они немного вовлечены, чтобы напечатать здесь.
Еще одна точка: Я не сразу это понял, но обновление скорости больше не требуется, если вместо этого вы используете формулы, которые я получил для v (t). Если вы просто моделируете ускорение от отдыха, и вы отслеживаете время с момента начала ускорения, код будет выглядеть примерно так:
position += velocity_function(timeSinceStart)
где "velocity_function" является одной из двух формул для v (t), и вам больше не понадобится переменная скорости. В общем, здесь есть компромисс: вычисление v (t)может быть более вычислительно дорогостоящим, чем простое обновление скорости с помощью итеративной схемы (из-за экспоненциальных членов), но гарантированно останется стабильной и ограниченной. При определенных условиях (например, при попытке получить очень короткий tmax) итерация может стать нестабильной и раздутой, что является общей проблемой с помощью метода прямого Эйлера. Однако сохранение ограничений на переменные (например, 0 < f < 1) должно предотвращать эти неустойчивости.
Кроме того, если вы чувствуете себя несколько мазохистски, вы можете интегрировать формулу для v (t), чтобы получить решение закрытой формы для p (t), тем самым отказавшись от необходимости итерации Ньютона вообще. Я оставлю это для других, чтобы попытаться. =)