Чего мне не хватает в этом методе рабочего процесса?

#python

#python

Вопрос:

Я учусь использовать методы из книги, и в этом упражнении я пытаюсь найти максимальную высоту снаряда. Я почти уверен, что правильно сформулировал уравнение в projectile.py , но каждый раз, когда я выполняю упражнение 1.py результат, который я cball.getMaxY() всегда получаю "-0.0 meters." , таков: Какие простые вещи я, возможно, пропустил?

 # projectile.py

"""projectile.py
Provides a simple class for modeling the 
flight of projectiles."""

from math import sin, cos, radians

class Projectile:

    """Simulates the flight of simple projectiles near the earth's
    surface, ignoring wind resistance. Tracking is done in two
    dimensions, height (y) and distance (x)."""

    def __init__(self, angle, velocity, height):
        """Create a projectile with given launch angle, initial
        velocity and height."""
        self.xpos = 0.0
        self.ypos = height
        theta = radians(angle)
        self.xvel = velocity * cos(theta)
        self.yvel = velocity * sin(theta)

        #Find time to reach projectile's maximum height
        self.th = self.yvel/9.8

    def update(self, time):
        """Update the state of this projectile to move it time seconds
        farther into its flight"""
        #Find max height
        self.maxypos = self.yvel - (9.8 * self.th)

        self.xpos = self.xpos   time * self.xvel
        yvel1 = self.yvel - 9.8 * time
        self.ypos = self.ypos   time * (self.yvel   yvel1) / 2.0
        self.yvel = yvel1

    def getY(self):
        "Returns the y position (height) of this projectile."
        return self.ypos

    def getX(self):
        "Returns the x position (distance) of this projectile."
        return self.xpos

    def getMaxY(self):
        "Returns the maximum height of the projectile."
        return self.maxypos
 

 # Exercise 1.py
from projectile import Projectile

def getInputs():
    a = eval(input("Enter the launch angle (in degrees): "))
    v = eval(input("Enter the initial velocity (in meters/sec): "))
    h = eval(input("Enter the initial height (in meters): "))
    t = eval(input("Enter the time interval between position calculations: "))
    return a,v,h,t

def main():
    angle, vel, h0, time = getInputs()
    cball = Projectile(angle, vel, h0)
    while cball.getY() >= 0:
        cball.update(time)        
    print("nDistance traveled: {0:0.1f} meters.".format(cball.getX()))
    print("nMaximum height traveled: {0:0.1f} meters.".format(cball.getMaxY()))

if __name__ == "__main__":
    main()
 

Комментарии:

1. где код, который использует это

2. Извините, только что добавил его.

3. Совет по отладке. Добавьте оператор печати в update() и посмотрите, как изменяется значение maxypos .

4. Спасибо, Дэвид. После отладки я обнаружил, что НЕПРАВИЛЬНО понял уравнение 🙂

Ответ №1:

Эта строка не имеет особого смысла:

 self.maxypos = self.yvel - (9.8 * self.th)
 

Сохраняйте простоту; попробуйте что-то вроде:

 self.maxypos = max(self.maxypos, self.ypos)
 

после обновления self.ypos . Вам также потребуется выполнить инициализацию self.maxypos = self.ypos __init__ .

Вам не нужны все эти тривиальные методы получения; просто получите доступ к атрибуту (Python — это не Java).