Вопрос по – Как рассчитать замедление, необходимое для достижения определенной скорости на определенном расстоянии?
===================================================================================================================

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

Так что я:  

`V0`или текущая скорость  

`Vf`или скорость, которую я хочу достичь (обычно 0)  

`t`или количество времени, которое я хочу потратить, чтобы достичь конца моего пути  

`d`или расстояние, которое я хочу пройти при изменении от V0 до Vf

Я хочу посчитать  

`a`или ускорение, необходимое для перехода от V0 к Vf

Причина, по которой это становится вопросом программирования, заключается в том, что`a` необходимо пересчитывать каждый шаг, так как машина останавливается. Так,`V0` постоянно меняется, чтобы быть`V0` с последнего временного шага`plus` `a` это было рассчитано в последний раз. По сути, он начнет медленно останавливаться, а затем остановится более резко, как машина в реальной жизни.

редактирует:  

Хорошо, спасибо за отличные ответы. Многое из того, что мне было нужно, было просто помочь подумать об этом. Позвольте мне быть более конкретным сейчас, когда у меня есть еще несколько идей от всех вас:

у меня есть машина`c` то есть`64 pixels` от места назначения, так`d=64`, Это вождение в`2 pixels per timestep`, где`timestep is 1/60 of a second`, Я хочу найти ускорение`a` это приведет к скорости`0.2 pixels per timestep` к тому времени, как он путешествовал`d`.  

`d = 64 //distance`  

`V0 = 2 //initial velocity (in ppt)`  

`Vf = 0.2 //final velocity (in ppt)` 

Кроме того, потому что это происходит в игровом цикле, переменная`delta` передается каждому действию, которое является`multiple of 1/60s that the last timestep took`, Другими словами, если это заняло 1/60, то`delta` 1,0, если это заняло 1/30 с, то`delta` 0,5. До фактического применения ускорения оно умножается на это значение дельты. Точно так же, прежде чем автомобиль снова начнет движение, его скорость умножается на значение дельты. Это довольно стандартная вещь, но это может быть причиной моих расчетов.

нием, вам нужно 2 уравнения.
сначала найдите время (t), необходимое для остановки.

```
v0 = initial velocity
vf = final velocity
x0 = initial displacement
xf = final displacement
a = constant linear acceleration

(xf-x0)=.5*(v0-vf)*t
t=2*(xf-x0)/(v0-vf)
t=2*(1m-0m)/(10m/s-0m/s)
t=.2seconds

next to calculate the linear acceleration between x0 & xf

(xf-x0)=(v0-vf)*t+.5*a*t^2
(1m-0m)=(10m/s-0m/s)*(.2s)+.5*a*((.2s)^2)
1m=(10m/s)*(.2s)+.5*a*(.04s^2)
1m=2m+a*(.02s^2)
-1m=a*(.02s^2)
a=-1m/(.02s^2)
a=-50m/s^2

in terms of gravity (g's)

a=(-50m/s^2)/(9.8m/s^2)
a=5.1g over the .2 seconds from 0m to 10m

```



ления на педаль тормоза, от любого торможения двигателем, которое происходит, от состояния поверхности и т. Д., Также, это "захватывает"; в конце, когда машина действительно останавливается. Сложное моделирование, и вы вряд ли найдете хорошие ответы на веб-сайте программирования. Найдите несколько автомобильных инженеров.

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

Насколько я могу судить, ваша проблема в том, что вы не запрашиваете что-то конкретное, что говорит о том, что вы действительно не поняли, чего вы на самом деле хотите. Если вы предоставите пример использования для этого, мы, вероятно, могли бы вам помочь. На самом деле, вы предоставили основные проблемы, которые либо переопределены, либо слишком ограничены, и мы действительно ничего не можем с этим поделать.



 либо недостаточно ограничена (а не является постоянной величиной, существует ли максимум а?) Или неоднозначна.

Простейшей формулой будет a = (Vf-V0) / t

Редактировать: если время не ограничено, расстояние s ограничено, а ускорение постоянное, то соответствующие формулы s = (Vf + V0) / 2 * t, t = (Vf-V0) / a, что упрощается до a = (Vf2 - V02) / (2с).



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

Использование 0 индекса для обозначения «в начале», 1 для обозначения «в конце» и D для Delta в значении «вариация», с учетом линейно изменяющегося ускорения

```
  a(t) = a0 + t * (a1-a0)/Dt

```

где a0 и a1 - два параметра, которые мы хотим вычислить для удовлетворения всех различных ограничений, я вычисляю (если не было ошибок, как я делал все вручную):

```
DV = Dt * (a0+a1)/2
Ds = Dt * (V0 + ((a1-a0)/6 + a0/2) * Dt)

```

Учитывая, что все DV, Dt и Ds заданы, это оставляет 2 линейных уравнения в неизвестных a0 и a1, так что вы можете решить их (но я оставляю вещи в этой форме, чтобы упростить двойную проверку на моих выводах !!! ).

Если вы применяете надлежащие формулы на каждом шаге для вычисления изменений в пространстве и скорости, не должно иметь значения, вычисляете ли вы a0 и a1 раз и навсегда или пересчитаете их на каждом шаге на основе оставшихся Dt, Ds и DV.



 уравнениях, это просто означает, что вы должны это принять. Вы должны интегрировать F = ma вместе с уравнениями ускорения, вот и все. Если ускорение не является постоянным, вам просто нужно решить систему уравнений вместо одного.

Так что теперь это действительно три векторных уравнения, которые вы должны интегрировать одновременно: по одному для каждого компонента перемещения, скорости и ускорения, или всего девять уравнений. Сила как функция времени будет входом для вашей проблемы.

Если вы принимаете одномерное движение, вы переходите к трем уравнениям одновременно. Те, что для скорости и перемещения, довольно просты.



Линейное ускорение`a` на расстоянии`d` идет с стартовой скорости`Vi` до конечной скорости`Vf`:

```
a = (Vf*Vf - Vi*Vi)/(2 * d)

```

**EDIT**:

После вашего редактирования, позвольте мне попробовать и оценить, что вам нужно ...

Если вы возьмете эту формулу и введете свои числа, вы получите постоянное ускорение -0,0309375. Теперь, давайте продолжим называть этот результат "a".

Что вам нужно между временными метками (кадрами?), Это не ускорение, а новое местоположение автомобиля, верно? Таким образом, вы используете следующую формулу:

```
Sd = Vi * t + 0.5 * t * t * a

```

где Sd является**current** расстояние от начальной позиции в текущем кадре / моменте / sum\_of\_deltas, Vi - начальная скорость, а t - время с начала.

С этим ваше замедление**is** постоянная, но даже если она линейная, ваша скорость будет соответствовать вашим ограничениям.

Если вы хотите нелинейное замедление, вы можете найти какой-нибудь нелинейный метод интерполяции и интерполировать не ускорение, а просто положение между двумя точками.

```
location = non_linear_function(time);

```