繁体   English   中英

在matplotlib.pyplot和numpy中递减

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM