绘制模拟弹跳

时间:2017-10-22 18:28:03

标签: python numpy plot

我需要帮助解决挑战问题。

假设球在距离大气极限250公里的恒定加速度g = 8.87ms2处落在金星上。将球的运动建模1小时15分钟(包括数据点中的第二个00和第二个4,500)。在初始状态之后,模拟5,000次状态更新(总共5,001个点。)您的模拟应该使用float64 numpy数组来计算时间(t)和高度(y)。时间应以秒表示,高度应以米为单位。

为了模拟弹跳,我们将做一些简化的假设(因为碰撞检测可能很复杂)。如果球的高度小于或等于0,我们将假设球在我们模拟的时间步之前撞到地面并且已经开始弹跳。你应该:

  1. 立即将其高度设置为0
  2. 将其速度从模拟的前一时间片更新为其速度的90%(0.9)
  3. 改变行进方向(向上而不是向下) - 在这种情况下,请使用现在的当前速度,即vc [i] = -0.9 * vc [i]
  4. 计算球在名为bounces的整数变量中反弹的次数。

    您的提交应包含正确尺寸和值的数组t和y,以及名为反弹的int。

    到目前为止,这是我的代码。它说我的y值不正确。

    import numpy as np
    import matplotlib.pyplot as plt
    g=-8.87
    t=np.linspace(0,4500,5001,dtype=np.float64)
    v=np.zeros(5001)
    y=np.zeros(5001)
    bounces=0
    y[0]=250000
    for i in range(1,5001):
    if y[i-1]+0.9*v[i-1]>0:
        v[i]=v[i-1]+g*(0.9)
        y[i]=y[i-1]+0.9*v[i-1]
    if y[i-1]+0.9*v[i-1]<=0:
        v[i]=-0.9*v[i]
        y[i]=0
    bounces+=1
    

2 个答案:

答案 0 :(得分:1)

缩进有一些问题,for循环没有缩进,弹跳迭代器位于错误的位置。所以我解决了这个问题。

此外,在底部的第3行,您可以设置v[i] = -0.9*v[i],这是当前时间步长,当您需要前一个时间步长时。那应该是v[i]=-0.9*v[i-1]

import numpy as np
import matplotlib.pyplot as plt
g=-8.87
t=np.linspace(0,4500,5001,dtype=np.float64)
v=np.zeros(5001)
y=np.zeros(5001)
bounces=0
y[0]=250000
for i in range(1,5001):
  if y[i-1]+0.9*v[i-1]>0:
    v[i]=v[i-1]+g*(0.9)
    y[i]=y[i-1]+0.9*v[i-1]
  if y[i-1]+0.9*v[i-1]<=0:
    v[i]=-0.9*v[i-1]
    y[i]=0
    bounces+=1 

您可以在此处查看示例https://repl.it/NCWu

答案 1 :(得分:0)

向Chasmani致谢,以帮助他们解决这个问题,但是内部循环不正确。因为在for循环中不应是两个if语句,而应该是一个。这是因为这些计算应该在每个间隔中进行。这是答案:)

import numpy as np
import matplotlib.pyplot as plt
g=-8.87
t=np.linspace(0,4500,5001,dtype=np.float64)
v=np.zeros(5001)
y=np.zeros(5001)
bounces=0
y[0]=250000
for i in range(1,5001):
    v[i]=v[i-1]+g*(0.9)
    y[i]=y[i-1]+0.9*v[i-1]
    if y[i]<=0:
        v[i]=-0.9*v[i]
        y[i]=0
        bounces+=1

希望这会有所帮助。