Я нашел этот вопрос очень интересным, так как недавно я проделал некоторую работу по моделированию движения снаряда с помощью перетаскивания.
Точка 1: Вы по существу обновляете позицию и скорость, используя явную / прямую итерацию Эйлера , где каждое новое значение для состояний должно быть функцией старых значений. В таком случае вы должны обновить позицию сначала , а затем обновить скорость.
Точка 2: Существуют более реалистичные физические модели для эффекта трения сопротивления . Одна модель (предложенная Адам Лисс ) включает в себя силу сопротивления, пропорциональную скорости (известную как сопротивление Стокса, которое обычно применяется в ситуациях с низкой скоростью). Тот, который я ранее предложил, включает в себя силу сопротивления, пропорциональную квадрату скорости (известную как квадратичное сопротивление, которое обычно применяется в ситуациях с высокой скоростью). Я расскажу каждому из них о том, как вы могли бы вывести формулы для максимальной скорости и время, необходимое для эффективного достижения максимальной скорости. Я воздержусь от полных выводов, так как они довольно сложны.
Сопротивление Стокса:
Уравнение для обновления скорости будет:
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)
где «speed_function» - одна из двух формул для v (t) , и вам больше не понадобится переменная скорости. В общем, здесь есть компромисс: вычисление v (t) может быть более вычислительно дорогим, чем простое обновление скорости с помощью итерационной схемы (из-за экспоненциальных членов), но оно гарантированно останется стабильным и ограничен. При определенных условиях (например, попытка получить очень короткое значение tmax ) итерация может стать нестабильной и взрывной, что является общей проблемой для прямого метода Эйлера. Однако поддержание ограничений на переменные (например, 0 <<strong> f <1) должно предотвратить эту нестабильность. </p>
Кроме того, если вы чувствуете себя немного мазохистски, вы можете интегрировать формулу для v (t) , чтобы получить решение в закрытой форме для p (t) Таким образом, исключая необходимость итерации Ньютона в целом. Я оставлю это для других, чтобы попытаться. =) * * 1 122