Проблемы с предсказанием движения снаряда по методу Эйлера

1

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

Я умею правильно отслеживать мяч. Однако проблема связана с частью предсказания. Вот код метода Эйлера, который я использую:

def euler(euler_center, euler_velocity):
euler_center[0] = euler_center[0] + euler_velocity[0] * timeStepSize *gTimesteps *0.707
euler_center[1] = euler_center[1]  + euler_velocity[1] * timeStepSize

euler_velocity[0] = euler_velocity[0]  * timeStepSize
euler_velocity[1] = euler_velocity[1] + gTimesteps * timeStepSize

return (euler_center, euler_velocity)

Вычисленный им euler_center после 20 итераций:

[[331.3899068333333, 162.3366666666667]
[331.39290372777776, 167.5727277777778]
[331.3930036242592, 172.80818333333335]
[331.3930069541419, 178.04303333333334]
[331.393007065138, 183.27727777777778]
[331.3930070688379, 188.51091666666667]
[331.39300706896125, 193.74395]
[331.39300706896535, 198.9763777777778]
[331.39300706896546, 204.20820000000003]
[331.39300706896546, 209.4394166666667]
[331.39300706896546, 214.6700277777778]
[331.39300706896546, 219.90003333333334]

И что-то в этом роде.

Тем не менее, центры, отслеживаемые моими алгоритмами отслеживания:

(339, 167)
(332, 158)
(325, 151)
(319, 146)
(312, 140)
(306, 135)
(299, 130)
(293, 126)
(286, 122)
(280, 118)
(277, 117)
(269, 112)
(254, 111)
(248, 112)

Излишне говорить, что это довольно плохое предсказание. Похоже, что первое предсказание является точным.

Кстати, эта функция находится в цикле из 20 шагов, поэтому предсказанное значение снова используется для прогнозирования следующего значения. Когда функция сначала [331.3, 157.10000000000002] передается [331.3, 157.10000000000002].

timeStepSize инвертирует видео FPS и $$ gTimesteps = -9.81 * 500 (pixelsPerMeter) $$

пиксели на метр просто догадываются.

Так в чем проблема? Это неправильный способ сделать прогноз методом эйлера? Или мне нужно использовать какой-то другой метод? Пожалуйста помоги.

Благодарю.

Теги:
prediction
numerical-methods
projectile

2 ответа

1

Это выглядит как ошибка программирования, а не ошибка с методом Эйлера как таковой.
Обратите внимание, что ваша координата x не меняется. Убедитесь, что "gTimesteps" не равен нулю.

1

Прежде всего, каждая книга по числовым методам расскажет вам НИКОГДА не используйте метод Эйлера. Это очень легко понять в концепции численного интегрирования ODE, но обречено уклоняться от курса с достаточным количеством шагов.

Поскольку вы не ссылались на то, как вы получили уравнения, я не могу их критиковать, но даже если они верны, Эйлер в конечном итоге потерпит неудачу. Например, что такое уравнение для центра? Является ли это дискретной версией dx/dt = v и является уравнением для v dv/dt = -g? Что такое gTimeSteps и почему 0.707?

Я бы предположил, что вы тестируете решение ODE, а не просто моделируете данные. Если все, что вы хотите сделать, это предсказать, где будет мяч в видео, и не волнует сопротивление воздуха, вы можете использовать точное решение, y = y0 + vy0 * t - 0,5 * | g | * t ^ 2 и т.д. Затем получите начальные условия из двух точек в видео. Однако, если вы пытаетесь сделать ODE просмотр Numerical Recipes в C/C++/FORTRAN/или на любом другом языке, он опубликован и изучает метод интеграции ODE. Рунге Кутта второго или четвертого порядка будет лучше.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню