首页 > 解决方案 > 在 Python 中的循环内循环

问题描述

下面是使用拖动来模拟炮弹运动的代码,其中 solve_euler 是一个预定义的函数,它产生一个数组数组(如表格)的值。在这些值中,xs 和 ys 是为这段代码导出的,称为 xs_euler 和 ys_euler。这些值是直到时间 t1 的炮弹的 x 和 y 坐标(solve_euler 函数中使用的某个定义的数字,在本例中为 t1 = 300)。我现在要做的是绘制新的 x 和 y 值的图表(通过乘以速度和时间),显示路径如何根据发射角度而有所不同。以下是我目前拥有的:

import math as m
import matplotlib.pylab as plot
import numpy

n_steps = 1000
theta = numpy.arange(m.pi/36, m.pi/2, m.pi/36)

v = 200
g = 9.81


initial_conditions = [0, 0, 88.38834764831843, 88.38834764831843]    
values_euler = solve_euler(initial_conditions, 300, n_steps)

xs_euler, ys_euler = values_euler[:,0], values_euler[:,1]

plt.plot(xs_euler, ys_euler, color='blue', linestyle='--')
plt.xlim(0,1500)
plt.ylim(0,800);


t = numpy.linspace(0, 500, num=1000) # Set time as 'continous' parameter.


for i in theta: # Calculate trajectory for every angle
    for k in t:
        x = ((v*k)*xs_euler*numpy.cos(i)) # get positions at every point in time
        y = ((v*k)*ys_euler*numpy.sin(i))-((0.5*g)*(k**2))

    
    plot.plot(x1, y1) # Plot for every angle

plot.show() # And show on one graphic

在这里应该很明显,我不知道如何在循环中使用 xs_euler 和 ys_euler,同时还能够在时间和发射角度 (theta) 上进行循环。有人可以告诉我哪里出了问题以及如何解决吗?

标签: pythonfunctionloopsmatplotlibphysics

解决方案


我假设您希望您的图表在所有时间点都是 y(t) vs x(t),在这种情况下,您需要在迭代每个 theta 时随时间存储 x 和 y 的所有值:

我的建议是为给定的 theta 创建一个 x 和 y 值的列表,并随着时间的推移进行迭代。如果您不需要存储它,可以使用列表推导来覆盖 i 的每个值。如果你这样做,我会把它写到数据框的列中。

我有点困惑的另一件事是你的情节在某些情况下被称为“plt”,而在其他情况下被称为“情节”。我建议保持它与您导入它的方式一致(在 中作为“情节” import matplotlib.pylab as plot

for i in theta: # Calculate trajectory for every angle
    x = [((v*k)*xs_euler*numpy.cos(i)) for k in t] # get positions at every point in time
    y = [((v*k)*ys_euler*numpy.sin(i))-((0.5*g)*(k**2)) for k in t]

    plot.plot(x, y) # Plot for every angle
plot.show()

推荐阅读