我试图预测篮球的弹丸运动。请注意,我没有考虑空气阻力的任何影响,只是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)$$
每米的像素只是猜到了。
那么这里的问题是什么?这是用欧拉方法做预测的错误方法吗?或者我是否需要使用一些不同的方法?请帮忙。
感谢。
答案 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”不为零。