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

我正在尝试创建一个程序,该程序绘制自由落体中球的速度与暴露于阻力的球的速度,使得 F_drag = -Cv^2 其中 C 是常数 (m*g)/100。我的输入是 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 抛出此错误:


---------------------------------------------------------------------------

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

我一般需要帮助解决这个问题,但也需要找到解决这个错误的方法。谢谢!


牛魔王的故事
浏览 124回答 2
2回答

白猪掌柜的

你的 while 循环真的不应该使用np.append. 它很慢。In [119]: t1 = np.array([0])&nbsp;&nbsp; &nbsp; &nbsp;...: i=0&nbsp;&nbsp; &nbsp; &nbsp;...: while i < 10:&nbsp;&nbsp; &nbsp; &nbsp;...:&nbsp; &nbsp; &nbsp;t1 = np.append(t1, t1[i] + .1)&nbsp;&nbsp; &nbsp; &nbsp;...:&nbsp; &nbsp; &nbsp;i += 1&nbsp;&nbsp; &nbsp; &nbsp;...:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;In [120]: t1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;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]&nbsp;&nbsp; &nbsp; &nbsp;...: i=0&nbsp;&nbsp; &nbsp; &nbsp;...: for i in range(10):&nbsp;&nbsp; &nbsp; &nbsp;...:&nbsp; &nbsp; &nbsp;t1.append(t1[-1] + .1)&nbsp; &nbsp; &nbsp;# t1[-1] the last, latest, value&nbsp; &nbsp; &nbsp;...:&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;...:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;In [122]: t1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Out[122]:&nbsp;[0,&nbsp;0.1,&nbsp;0.2,&nbsp;0.30000000000000004,&nbsp;0.4,&nbsp;0.5,&nbsp;0.6,&nbsp;0.7,&nbsp;0.7999999999999999,&nbsp;0.8999999999999999,&nbsp;0.9999999999999999]In [123]: np.array(_)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;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&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;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)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Out[127]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

慕仙森

在第二个 while 循环中,您应该将其i2用作索引变量。由于在循环的第一次迭代中,t2[i]是真的t2[50],但当时t2只有一个元素,所以索引超出了范围。import numpy as npimport matplotlib.pyplot as plt%matplotlib inlinem = 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&nbsp; &nbsp;# The total number of time steps as a floating point number with remainderimax = int(round(imaxFloat))&nbsp; &nbsp;# Converts the float to the nearest integer&nbsp;v0 = 0&nbsp; &nbsp; &nbsp; &nbsp;# Velocity at t = 0g = 9.8&nbsp; &nbsp; &nbsp; &nbsp;# Accleration due to gravityi = 0&nbsp; &nbsp; &nbsp; &nbsp;# Initial counter valuei2 = 0&nbsp; &nbsp; &nbsp;# Initial counter value 2c = (m*g)/100&nbsp; &nbsp; &nbsp;# Constant in drag equationt1 = np.array([0])v1 = np.array([v0])t2 = np.array([0])v2 = np.array([v0])drag_a = ((m*g)-(c*v1*v1))/m&nbsp; &nbsp; &nbsp;# Acceleration of ball with dragwhile i < imax:&nbsp; &nbsp; t1 = np.append(t1, t1[i] + dt)&nbsp; &nbsp; v1 = np.append(v1, v1[i] - g * dt )&nbsp; &nbsp; i = i + 1while i2 < imax:&nbsp; &nbsp; t2 = np.append(t2, t2[i2] + dt)&nbsp; &nbsp; v2 = np.append(v2, v2[i2] - drag_a * dt)&nbsp; &nbsp; i2 = i2 + 1plt.plot(t1, v1, label = "Neglecting air resistance")plt.plot(t2, v2, label = "With air resistance")
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python