弹丸运动模拟,索引越界误差,嵌套/循环

时间:2018-03-16 16:54:43

标签: python numpy physics nested-loops index-error

我试图将最佳发射角度绘制为质量的函数并绘制图形。 对于mlist的每个元素,我希望它为m的每个元素计算thetalist的行进距离,然后为m获取最高距离并获取theta给出了答案并制作了一份所谓theta_optimum的新列表,并将其与mlist进行了对比。

这是我的代码:

import matplotlib.pylab as plt
import numpy as np
import math
#############
Die = 10.0
B = 1.6e-4
b = B*Die
g = 9.81
tmax = 1000
dt = 0.01
v = 100.0
mlist = np.arange(1.0, 100.0, 1.0)
thetalist = np.arange(0.1, math.pi / 2.0, 0.1)
theta_op = []

for j in range(len(mlist)):
    for i in range(len(thetalist)):
        vy = math.sin(thetalist[i]) * v
        vx = math.cos(thetalist[i]) * v
        t = 0.0
        x = 0.0
        y = 0.0
        xlist = []
        while y >= 0.0:
            vx1 = -b/mlist[j]*vx
            vx = vx + vx1*dt
            dx = vx * dt
            x = x + dx

            vy1 = -g-b/mlist[j]*vy
            vy = vy + vy1 * dt
            dy = vy * dt
            y = y + dy

            t = t + dt

            xlist.append(x)

        theta_op.append(thetalist[xlist.index(max(xlist))])

plt.plot(mlist, theta_op, color='red')
plt.show()

我得到的错误是:

line 39, in <module>
theta_op.append(thetalist[xlist.index(max(xlist))])
IndexError: index 202 is out of bounds for axis 0 with size 15

我的问题是如何在我的代码中修复此错误以及为什么会出现这种错误。我知道物理学是正确的,但由于我不熟悉编码,我不确定我的列表和循环的方式是否正确。我已经找到了这样的其他问题,但还没找到。

1 个答案:

答案 0 :(得分:0)

您似乎严重混淆了您的变量范围。

对于质量和theta的每个值,在集成过程中保存 x的每个值。假设这是您想要做的,那么您就编写了导致此错误的行:

theta_op.append(thetalist[xlist.index(max(xlist))])

以上返回xlist中最大值的索引;然后,您使用此索引访问thetalist,这使毫无意义thetalistxlist的大小是独立的,前者取决于theta步骤,后者取决于模拟时间步长;所以使用一个索引来访问另一个可能会导致这种溢出。

这让我们回到为什么首先要保存所有x值的问题。为什么不直接为theta的每个值保存 last x值,并获得每个质量的最佳θ,这与您的问题描述完全匹配?

for j in range(len(mlist)):

    best_theta = 0.0
    best_x = 0.0

    for i in range(len(thetalist)):

        # initialisation code as before
        # ...

        while y >= 0.0:
            # integration code as before
            # ...

        # update the best theta for this mass
        if x > best_x:
            best_theta = thetalist[i]
            best_x = x

    # add the best theta to theta_op without having to do any searches   
    theta_op.append(best_theta)

编辑:我用各种θ步长值测试了这段代码,所有结果都在零阻力限制的合理范围内(45度= 0.785398 ...弧度),所以你可能希望考虑增加阻力系数。