在matplotlib.pyplot和numpy中递减

时间:2018-02-08 07:49:00

标签: python numpy matplotlib



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;
&#13;
&#13;

好的,我的问题是,当时间大于或等于50时,它不会将vE更改为0,我得到的结果是:

enter image description here

1 个答案:

答案 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)

因此您不必使用循环来填充列表。