用欧拉方法预测抛射运动的问题

时间:2018-06-18 10:56:13

标签: python prediction numerical-methods projectile

我试图预测篮球的弹丸运动。请注意,我没有考虑空气阻力的任何影响,只是g的影响。我正在使用欧拉的方法。

我能够非常准确地跟踪球。然而,问题在于预测部分。以下是我正在使用的欧拉方法的代码:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = hdf5_test
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

win32:CONFIG(release, debug|release): LIBS += -L'C:/Program Files/HDF_Group/HDF5/1.10.2/lib/' -lhdf5
else:win32:CONFIG(debug, debug|release): LIBS += -L'C:/Program Files/HDF_Group/HDF5/1.10.2/lib/' -lhdf5d
else:unix: LIBS += -L'C:/Program Files/HDF_Group/HDF5/1.10.2/lib/' -lhdf5

INCLUDEPATH += 'C:/Program Files/HDF_Group/HDF5/1.10.2/include'
DEPENDPATH += 'C:/Program Files/HDF_Group/HDF5/1.10.2/include'

20次迭代后由它计算的euler_center是:

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)

等等。

但是,我的跟踪算法跟踪的中心是:

[[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]

毋庸置疑,那是非常糟糕的预测。似乎第一个预测有点准确。

顺便说一下,此函数处于20步的循环中,因此预测值再次用于预测下一个值。首次调用该函数时,会向其传递(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)

timeStepSize与视频FPS相反 $$ gTimesteps = -9.81 * 500(pixelsPerMeter)$$

每米的像素只是猜到了。

那么这里的问题是什么?这是用欧拉方法做预测的错误方法吗?或者我是否需要使用一些不同的方法?请帮忙。

感谢。

2 个答案:

答案 0 :(得分:1)

首先,每本有关数值方法的书都将告诉您永远不要使用Euler方法。这很容易理解ODE的数值积分概念,但是注定要经过足够的步骤才能偏离航向。

由于您没有引用方程式的推导方法,所以我无法真正批评它们,但是即使它们正确,欧拉最终还是会失败。例如,中心的方程是什么?这是dx / dt = v的离散形式,并且v dv / dt = -g的方程式是吗?什么是gTimeSteps,为什么要选择0.707?

我想您正在测试ODE求解器,而不仅仅是对数据建模。如果您只想预测视频中的球在哪里并且不关心空气阻力,则可以使用精确的解决方案,y = y0 + vy0 * t-0.5 * | g | * t ^ 2,依此类推。然后从视频中的两个点获得初始条件。但是,如果您要进行ODE,请查看以C / C ++ / FORTRAN /或任何其他语言编写的数字食谱,并学习ODE集成方法。二阶或四阶的Runge Kutta会做得更好。

一旦方程式正确,漂移的严重性将取决于步长。如果步长太大,则可能会使估计值偏离左侧字段(或某处)。需要估计误差并纠正步长。如果您是从视频或图片中挑选点,并且可以确定等式正确,请尝试进行更精细的采样。较小的步长通常会导致精度更高,但这不能保证。

答案 1 :(得分:1)

这看起来像是编程错误,而不是Euler方法本身的错误。
请注意,您的x坐标未更改。检查以确保“ gTimesteps”不为零。