import matplotlib.pyplot as plt
import numpy as np
import os
import sys
import time
MissionName = "Mars"
savename = "Mission"
start_time = time.time()
t = np.arange(0.0, 200.0, 10)
M0 = 2970000
mps = 12857.1429
mT = (mps * t)
m = (M0 - mT)
Fstuw = 35100000
a = Fstuw / m
for time in t:
if time >= 50:
vE = 0
for time in t:
if time < 50:
vE = 2580
h1 = (vE * M0/mps)
h2 = (1-(m / M0))
h3 = (np.log(M0 / m) / np.log(2.718281828)) + 1
h = h1 * h2 * h3
v = vE * (np.log(M0 / m) / np.log(2.718281828))
plt.plot(t,v)
plt.xlabel('time (s)')
plt.ylabel('Velocity (m/s)')
plt.title('Model raketmissie ' + str(MissionName))
plt.grid(True)
plt.savefig(savename + ".png")
plt.show()
&#13;
好的,我的问题是,当时间大于或等于50时,它不会将vE更改为0,我得到的结果是:
答案 0 :(得分:2)
您的问题出在代码的这一部分:
for time in t:
if time >= 50:
vE = 0
for time in t:
if time < 50:
vE = 2580
现在你的vE只是一个值,而不是列表或其他一些集合。你迭代两次。第一次设置vE=0
时,第二次将其设置为vE=2580
,覆盖零,您先设置。
如果您想要每个时间点的值,您可以执行以下操作:
vE=[0.0]*len(t)
for i, time in enumerate(t):
if time < 50:
v[i] = 2580.0
因此,您只使用零初始化与t
相同长度的列表,并将对应于时间<50的每个元素的值更改为2580。
如Mad Physicist所建议的更好的方法是使用numpy数组:
t = np.arange(0.0, 200.0, 10)
vE = np.zeros_like(t);
vE[t < 50] = 2580
或一行
vE = np.where(t<50, 2580, 0)
因此您不必使用循环来填充列表。