2017-09-04 47 views
0

范围为0轴的运行我的代码,我得到的错误索引出错。指数0是出大小为0

IndexError: index 0 is out of bounds for axis 0 with size 0 on line 42 for v[0]=v0.

我不熟悉Python,不知道如何调试这一点。

""" Density at height y """ 
def rho(rh, y): 
rho = rh*math.exp(-y/7249) 
return rho 

""" Acceleration of skydiver """ 
def accl(m, g, rho, v, As, Cs, Ap, Cp): 
if y[i+1] >= 1200: 
    accl = (1/(2*m) * rho(rh, y) * v**2 * As * Cs - g) 
else: 
    accl = (1/(2*m) * rho(rh, y) * v**2 * (As * Cs + Ap * Cp) - g) 
return accl 

h0 = 4000 # initial hieght 
dt = 0.1 #timestep 
n = int(180/dt) 
#lists for displacement, time, and velocities 
v= np.array([]) 
v[0] = v0 
t= np.array([]) 
t[0] = t0 
y= np.array([]) 
y[0] = h0 

#calculation of time, velocity and displacement 
for i in range(n): 
t[i+1] = t[i] + dt 
v[i+1] = v[i] + accl(m, g, rho, v[i], As, Cs, Ap, Cp) * dt 
y[i+1] = y[i] + v[i+1] * dt 
if y[i+1] < 0: 
    #ends plot once skydiver has landed 
     break 
# Plot 
plt.plot(t, y, label = 'Position m') 
plt.plot(t, v, label = 'Speed m/s') 
plt.plot(t, accl, label = 'Acceleration m/s^2', color = 'green') 
plt.xlim([t[0], t[-1]]) 
plt.xlabel("Time (seconds)") 
plt.legend() 

回答

1

从空列表创建的Numpy数组无法编入索引 - 它们没有任何要索引的元素。

np.array([]).shape 
# (0,) 

如果你知道v提前尺寸,你可以使用np.empty()

n = 10 
np.empty(n, dtype=float) 
# array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) 

或者,只是初始化vv0

v = np.array([v0]) 
1
v= np.array([]) 
v[0] = v0 

这是没有意义:你正试图设置一个值空数组的第一个元素(它没有元素!)。

试试这个:v = np.array([v0])如果你想增加你的阵列

,这样做:

v = [] 
# whatever logic to grow v like: 
for i in range(10): 
    v.append(2*i-1) 
# now turn it into an np.array: 
v = np.array(v) 
+0

当他访问v的更多索引时,会产生一个错误,他需要用n来初始化v。 – wit221

+0

@ wit221否:'list'不需要预定义大小。 – Julien

+0

是的,我指的是使用v = np.array([v0])的解决方案。这会在访问v [i + 1] = v [i] + ...中的numpy数组时产生错误... – wit221

1

更换v = np.array([])v = np.zeros(n+1)。你无法访问numpy数组的边界外的元素。你的声明创建一个空的numpy数组。

相关问题