Почему мой код Python не обновляет одну из моих переменных?

У меня есть тело, которое я хочу ускорить по прямой через итеративный процесс, однако, когда я смотрю на свои переменные, оно никогда не добавляет обновленную скорость в массив скоростей.

import numpy as np
import matplotlib.pyplot as plt

g = 9.81  # Gravity
pa = 1.2  # Air density
m = 250  # mass of bike
h = 0.69  # centre of mass height
ha = 0.69  # height of centre pressure
w = 1.5  # wheelbase
b = 0.73  # longitudinal distance of centre of mass
CdA = 0.2  # drag coefficient
PMax = 180000  # max power
ux = 1.2  # Longitudinal friction coefficient
uy = 1.44  # Lateral friction coefficient

St1Length = 400

ds = 40
vel = np.zeros(St1Length//ds)
s = np.linspace(0, St1Length, len(vel)) 

while s[-1] < St1Length:
    Fd = 0.5 * pa * CdA * vel[-1]**2
    Ap = ((PMax / ((m * vel[-1]) + 1e-9)) - (Fd / m)) / g  
    yw = 0
    Aw = (((b * np.sqrt((yw)**2 + g**2)) / h) - ((Fd * ha) / (m * h))) / g
    Wheelie_Min = np.minimum(Ap, Aw)
    vel_new = np.sqrt(vel[-1]**2 + 2*Wheelie_Min*ds)
    vel = np.append(vel, vel_new)

    s_new = s[-1] + ds 
    s = np.append(s, s_new)

plt.plot(s, vel)
plt.xlabel('Distance (m)')
plt.ylabel('Velocity (m/s)')
plt.show()

Далее следует график, который выглядит следующим образом:

И вот как выглядит мой список переменных:

Это, вероятно, легко исправить, но я не вижу, что не так.

Я ожидаю, что массив обновится, а скорость на графике увеличится из-за ускорения.

Что не показано: какова ценность vel_new?

mkrieger1 02.04.2023 18:09

Просто запустил ваш код и обнаружил, что s[-1]==400.0 и St1Length==400. Ваш цикл while никогда не запускается.

Marcelo Paco 02.04.2023 18:13

Я рекомендую вам установить точку останова и немного пройтись по коду. Посмотрите, что делает каждая строка.

5eb 02.04.2023 18:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ничего не обновляется, потому что s[-1] = 400 (то есть s[-1] никогда не меньше 400). Этот код должен исправить проблемы.

import numpy as np
import matplotlib.pyplot as plt

g = 9.81  # Gravity
pa = 1.2  # Air density
m = 250  # mass of bike
h = 0.69  # centre of mass height
ha = 0.69  # height of centre pressure
w = 1.5  # wheelbase
b = 0.73  # longitudinal distance of centre of mass
CdA = 0.2  # drag coefficient
PMax = 180000  # max power
ux = 1.2  # Longitudinal friction coefficient
uy = 1.44  # Lateral friction coefficient

St1Length = 400

ds = 40
vel = [0.]
s = [0.]

while s[-1] < St1Length:
    Fd = 0.5 * pa * CdA * vel[-1]**2
    Ap = ((PMax / ((m * vel[-1]) + 1e-9)) - (Fd / m)) / g  
    yw = 0
    Aw = (((b * np.sqrt((yw)**2 + g**2)) / h) - ((Fd * ha) / (m * h))) / g
    Wheelie_Min = np.minimum(Ap, Aw)
    vel_new = np.sqrt(vel[-1]**2 + 2*Wheelie_Min*ds)
    vel.append(vel_new)

    s_new = s[-1] + ds 
    s.append(s_new)

plt.plot(s, vel)
plt.xlabel('Distance (m)')
plt.ylabel('Velocity (m/s)')
plt.show()


Другие вопросы по теме