我不理解将其元素也是列表元素的元组添加到包含所有信息的另一个列表的语法。
我正在尝试创建一个轨迹列表,其中包含飞行过程中射弹的飞行数据元组。我想使用元组,以便能够及时查看每个时刻的所有信息。
import random
import math
gg = -9.81 # gravity m/s**2
tt = 10 **-9 # seconds
wind = random.randint(-10,10) # m/s
#position
x=random.randint(0,100) # m/s
#projectile
v0 = float(raw_input('Enter the initial velocity (m/s) -> '));
theta = float(raw_input('Enter the initial launch angle of projectile (degrees) -> '));
theta *= (180/3.14159265359)
xx = [x]
yy = [.000000000000000000001]
dz =[v0]
time = [0];
data = ( time, xx, yy, dz)
traj = [data]
while yy[-1] >0:
traj.append ( math.sqrt( (traj[-1][3][-1] * math.sin(theta) + gg * tt)** 2+ (traj[-1][4] * math.cos(theta) -wind) ** 2 )) # velocity
traj.append ( traj[-1][2][-1] + dz[-1] * math.sin(theta) * tt + .5* gg * tt) # y position
traj.append ( traj[-1][1][-1] * dz[-1] * math.cos(theta) - wind * tt) # x position
traj.append ( traj[-1][0][-1] + tt) # time
print traj
编辑: 我会输入初始角度和速度的整数(即-45,45)。预期输出将是包含分别对应于时间,x坐标,y坐标和速度的四个元素的元组列表。目前,我收到的元组索引超出范围错误。
答案 0 :(得分:1)
你在哪里
traj[-1][4]
在您的第一个traj.append
行中,traj[-1]
为data
,而data
只有四个元素长,因此最后一个项目位于索引3处。
答案 1 :(得分:0)
您的代码的问题在于您将在while循环中计算的值附加到traj
列表。这不会更新列表xx
,yy
,time
或dz
。
您可以按以下方式修改代码
while yy[-1] > 0:
dz_next = math.sqrt( (yy[-1] * math.sin(theta) + gg * tt)** 2+(dz[-1] * math.cos(theta) -wind)** 2)
yy_next = yy[-1] + dz[-1] * math.sin(theta) * tt + .5* gg * tt
xx_next = xx[-1] * dz[-1] * math.cos(theta) - wind * tt
dz.append(dz_next) # velocity
yy.append(yy_next) # y position
xx.append(xx_next) # x position
time.append(time[-1] + tt) # time
我认为更好的方法是以下
data = ( 0, x, 1e-20, v0) # initial data
traj = [data]
while True:
t, x, y, v = traj[-1]
if y < 0:
break
traj.append((t + tt, # time
x * v * math.cos(theta) - wind * tt, # x position
y + v * math.sin(theta) * tt + .5* gg * tt, # y position
(y* math.sin(theta) + gg * tt)** 2 + (v*math.cos(theta) -wind) ** 2) # velocity
)
print traj
t_traj, x_traj, y_traj, z_traj = zip(*traj)