[英]decrementing in matplotlib.pyplot and numpy
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()
好的,所以我的问题是,当时间大于或等于50时,它不会将vE更改为0,我得到的结果是:
您的问题在于代码的这一部分:
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
长度相同但只有零的列表,并将每个元素的值更改为2580,对应于时间<50。
正如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)
因此,您不必使用循环来填充列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.