Попытка заставить цикл остановиться, когда достигнуто определенное значение, но он всегда выполняет 1 шаг слишком много - PullRequest
0 голосов
/ 16 января 2019

Как следует из названия. Глядя на блок кода:

m = 100
a = -9.8
y0 = 30000
t0 = 0
v0 = 0
dt = 0.01

yAF = np.array([])
yAF = np.append(yAF, y0)

tAF = np.array([])
tAF = np.append(tAF, t0)

speedAF = np.array([])
speedAF = np.append(speedAF, v0)

def dy_dt(t):
    return a * t 

i = 0

while yAF[i] >= 0:
    i = i + 1
    tAF = np.append(tAF, tAF[i-1] + dt)
    speedAF = np.append(speedAF, dy_dt(tAF[i-1]))
    yAF = np.append(yAF, yAF[i-1] + dt * dy_dt(tAF[i-1]))

Как видите, я пытаюсь выполнить условие, когда значение yAF [i] становится меньше нуля, я не хочу добавлять его в массив и хочу завершить цикл.

Код в настоящее время все еще добавляет первое значение меньше 0 в массив перед остановкой. Есть ли способ исправить эту ошибку?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы поменяли порядок проверки и добавления. Вы должны сначала проверить и только потом добавлять:

yAF, yAF, speedAF = [], [], []
yAF_next, tAF_next, speedFA_next = y0, t0, v0

while yAF_next >= 0:
    yAF.append(yAF_next)
    tAF.append(t0_next)
    speedAF.append(speedFA_next)

    tAF_next = tAF[-1] + dt
    speedAF_next = dy_dt(tAF[-1])
    yAF_next = yAF[-1] + dt * dy_dt(tAF[-1])

Интересно, что вам даже не нужна переменная i. И да, работайте со списками, позже конвертируйте их в массивы.

0 голосов
/ 16 января 2019

Просто измените условие while на > 0 вместо >= 0, чтобы сэкономить одну петлю.

Кроме того, просто просмотр этого кода даст бесконечный цикл, потому что вы увеличиваете i, но выходите, когда i меньше 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...