简体   繁体   English

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

[英]I don't know why python is throwing this error

I'm trying to create a program which plots the velocity of a ball in freefall versus that of a ball with exposure to a drag force such that F_drag = -Cv^2 where C is a constant (m*g)/100.我正在尝试创建一个程序,该程序绘制自由落体中球的速度与暴露于阻力的球的速度,使得 F_drag = -Cv^2 其中 C 是常数 (m*g)/100。 My inputs are 5 for m, 5 for tf, and 0.1 for dt.我的输入是 5 代表 m,5 代表 tf,0.1 代表 dt。

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 is throwing this error: 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

I need help in general with this problem but also finding a solution to this error.我一般需要帮助解决这个问题,但也需要找到解决这个错误的方法。 Thank you!谢谢!

In your second while loop you should be using i2 as the index variable.在第二个 while 循环中,您应该使用i2作为索引变量。 Since during the first iteration of the loop, t2[i] is really t2[50] , but at that time, t2 only has one element, so the index is out of bounds.由于在循环的第一次迭代期间, 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")

Your while loops really shouldn't be using np.append .您的 while 循环真的不应该使用np.append It is slow.它很慢。

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. ])

List append is faster:列表 append 更快:

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. ])

Better yet use arange :更好的是使用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. ])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM