簡體   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