这是我在这里的第一篇帖子。我正在努力学习python代码。我制作了一个程序,使用海龟模块,模拟一个弹跳球遭受非弹性碰撞,以使最大高度的反弹每次减少。它工作得很好,直到球在很短的高度上弹跳,并停止弹跳,使球以恒定(小)的速度向下移动--这显然不是人们所期望的。
“地板”是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 发布于 2020-04-07 03:40:31
问题是,你的完成条件永远不会满足,可能是因为你在速度上加了一个加速度(假设g是指重力,如果它不是,你应该考虑给它取一个不同的名字)。另一个问题是,即使进行了修正,只有当abs(vy) <= 0.000000000000000000001的g * dt小于0.000000000000000000001 / 0.75时,才能满足您的完成条件,否则vy永远不会足够小。
解决后一个问题的方法有两种,您可以将完成条件缩放到g * dt,即
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的某些值不会发生收敛--如果遇到这种情况,则应该调整完成条件的缩放或时间步骤。
https://stackoverflow.com/questions/61069453
复制相似问题