我不知道为什么python抛出这个错误

时间:2019-10-11 22:33:09

标签: python arrays numpy physics

我正在尝试创建一个程序,该程序绘制自由下落的球的速度与受到阻力的球的速度的关系,从而使F_drag = -Cv ^ 2,其中C为常数(m * g)/ 100我的输入为m表示5,tf表示5,dt表示0.1。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

m = float(input("Input the mass of the ball in kilograms: "))
tf = float(input("Input a specified time of fall in seconds: "))
dt = float(input("Input the time step for each calculation in seconds: "))

imaxFloat = tf/dt   # The total number of time steps as a floating point number with remainder
imax = int(round(imaxFloat))   # Converts the float to the nearest integer 

v0 = 0       # Velocity at t = 0
g = 9.8       # Accleration due to gravity
i = 0       # Initial counter value
i2 = 0     # Initial counter value 2
c = (m*g)/100     # Constant in drag equation

t1 = np.array([0])
v1 = np.array([v0])
t2 = np.array([0])
v2 = np.array([v0])

drag_a = ((m*g)-(c*v1*v1))/m     # Acceleration of ball with drag

while i < imax:
    t1 = np.append(t1, t1[i] + dt)
    v1 = np.append(v1, v1[i] - g * dt )
    i = i + 1

while i2 < imax:
    t2 = np.append(t2, t2[i] + dt)
    v2 = np.append(v2, v2[i] - drag_a * dt)
    i2 = i2 + 1

plt.plot(t1, v1, label = "Neglecting air resistance")
plt.plot(t2, v2, label = "With air resistance")

Python抛出此错误:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-6-10c7e3224e87> in <module>
     30 
     31 while i2 < imax:
---> 32     t2 = np.append(t2, t2[i] + dt)
     33     v2 = np.append(v2, v2[i] - drag_a * dt)
     34     i2 = i2 + 1

IndexError: index 50 is out of bounds for axis 0 with size 1

我通常在此问题上需要帮助,但同时也找到此错误的解决方案。谢谢!

2 个答案:

答案 0 :(得分:0)

在第二个while循环中,您应该使用i2作为索引变量。由于在循环的第一次迭代期间,t2[i]实际上是t2[50],但是在那时,t2只有一个元素,因此索引超出范围。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

m = float(input("Input the mass of the ball in kilograms: "))
tf = float(input("Input a specified time of fall in seconds: "))
dt = float(input("Input the time step for each calculation in seconds: "))

imaxFloat = tf/dt   # The total number of time steps as a floating point number with remainder
imax = int(round(imaxFloat))   # Converts the float to the nearest integer 

v0 = 0       # Velocity at t = 0
g = 9.8       # Accleration due to gravity
i = 0       # Initial counter value
i2 = 0     # Initial counter value 2
c = (m*g)/100     # Constant in drag equation

t1 = np.array([0])
v1 = np.array([v0])
t2 = np.array([0])
v2 = np.array([v0])

drag_a = ((m*g)-(c*v1*v1))/m     # Acceleration of ball with drag

while i < imax:
    t1 = np.append(t1, t1[i] + dt)
    v1 = np.append(v1, v1[i] - g * dt )
    i = i + 1

while i2 < imax:
    t2 = np.append(t2, t2[i2] + dt)
    v2 = np.append(v2, v2[i2] - drag_a * dt)
    i2 = i2 + 1

plt.plot(t1, v1, label = "Neglecting air resistance")
plt.plot(t2, v2, label = "With air resistance")

答案 1 :(得分:0)

您的while循环实际上不应该使用np.append。太慢了。

In [119]: t1 = np.array([0]) 
     ...: i=0 
     ...: while i < 10: 
     ...:     t1 = np.append(t1, t1[i] + .1) 
     ...:     i += 1 
     ...:                                                                       
In [120]: t1                                                                    
Out[120]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

列表附加更快:

In [121]: t1 = [0] 
     ...: i=0 
     ...: for i in range(10): 
     ...:     t1.append(t1[-1] + .1)     # t1[-1] the last, latest, value
     ...:      
     ...:                                                                       
In [122]: t1                                                                    
Out[122]: 
[0,
 0.1,
 0.2,
 0.30000000000000004,
 0.4,
 0.5,
 0.6,
 0.7,
 0.7999999999999999,
 0.8999999999999999,
 0.9999999999999999]
In [123]: np.array(_)                                                           
Out[123]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

最好使用arange

In [124]: np.arange(11)*0.1                                                     
Out[124]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

In [127]: np.linspace(0,1,11)                                                   
Out[127]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])