gpt4 book ai didi

python - Python中的非弹性碰撞

转载 作者:行者123 更新时间:2023-12-04 10:15:43 25 4
gpt4 key购买 nike

这是我在这里的第一篇文章。我正在尝试学习python代码。我使用turtle模块制作了一个程序,该程序模拟了一个弹跳球遭受非弹性碰撞,以使每次弹跳的最大高度变小。直到球在一个非常短的高度弹跳并且它停止弹跳以使球以恒定(小)速度向下移动时,它才能正常工作 - 这显然不是预期的。

“地板”是y = -100 处的一行。协调。

我的迭代代码是这样的:

while t < 5000:
vy += g
h += vy
corpo.goto(0, h)

if h <= -100 and g == 0:
vy = 0
h = -100
g = 0
if abs(vy) <= 0.000000000000000000001 and h <= -100:
vy = 0
g = 0
h = -100
elif h <= -100 and vy < 0:
vy = -vy * 0.75

print(vy)

t += dt

最佳答案

问题是您的完成条件永远不会满足,可能是因为您正在向速度添加加速度(假设 g 指的是重力,如果不是,您真的应该考虑给它一个不同的名称)。另一个问题是,即使进行了更正,您的完成条件 abs(vy) <= 0.000000000000000000001只有在 g * dt 时才会满足小于 0.000000000000000000001 / 0.75 , 否则 vy永远都不够小。

有两种方法可以解决后一个问题,您可以将完成条件扩展到 g * dt , IE。

if abs(vy) <= abs(g * dt) and h <= -100:
# ...

或者您可以在 h <= -100 时关闭重力并稍微提高阈值,即

t = 0
dt = 0.0001
vy = 0
h = 0
g = -5
while t < 500:
if h <= -100 and g == 0:
vy = 0
h = -100
g = 0
break
if abs(vy) <= 0.0001 and h <= -100:
vy = 0
g = 0
h = -100
elif h <= -100 and vy < 0:
vy = -vy * 0.75
elif h > -100:
vy += g * dt

h += vy
print(h, vy)

t += dt

在前一种情况下,保证收敛(球 停止),而在后一种情况下则不然(它可能会无限振荡)。由于前者保证收敛,因此通常更可取 - 但并不完全现实。

最现实的解决方案是将两者结合起来,即

t = 0
dt = 0.001
vy = 0
h = 0
g = -9.81
while t < 500:
if h <= -100 and g == 0:
vy = 0
h = -100
g = 0
break
if abs(vy) <= abs(g * dt)*2 and h <= -100:
vy = 0
g = 0
h = -100
elif h <= -100 and vy < 0:
vy = -vy * 0.75
elif h > -100:
vy += g * dt

h += vy
print(h, vy)

t += dt

请注意,时间步长有某些值, dt , 不会发生收敛 - 如果遇到这种情况,则应调整完成条件的缩放或时间步长。

关于python - Python中的非弹性碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61069453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com