2017-09-04 77 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數組。

相關問題