2017-09-23 2 views
0

Dans ce programme, j'ai travaillé avec Python, l'objectif est de prendre les entrées de l'utilisateur sur une vitesse initiale, un angle et à quelle distance est une structure/quelle est notre taille re visant. J'ai été capable de calculer combien de temps il faut pour que quelque chose atteigne une cible, mais je ne suis pas sûr de savoir pourquoi la vitesse finale (à quelle vitesse il va quand il atteint la cible) se trompe.Détermination de la vitesse finale à une distance cible

# User inputs 
velocity = float(input('Give me a velocity to fire at (in m/s): ')) 
angle = float(input('Give me an angle to fire at: ')) 
distance = float(input('Give me how far away you are from the 
structure: ')) 
height = float(input('Give me the height of the structure (in meters): 
')) 
slingshot = 5 #Height of slingshot in meters 
gravity = 9.8 #Earth gravity 

# Converting angles to radians 
angleRad = math.radians(angle) 

# Computing our x and y coordinate 
x = math.cos(angleRad) 
y = math.sin(angleRad) 

# Calculations 
time = distance/(velocity * x) 
vx = x 
vy = y + (-9.8 * time) 
finalVelocity = math.sqrt((vx ** 2) + (vy ** 2)) 

# Output of program 
print('It takes your bird' , time , 'seconds to reach the structure') 
print('Your velocity at the target distance is' , finalVelocity , 
'meters per second.') 

Voici une entrée de l'échantillon et ce que le résultat attendu devrait être:

entrée Vitesse: 20 Angle d'entrée: 40 entrée Distance: 25 Hauteur d'entrée de la structure: 15

Résultat attendu:

Temps pour atteindre la structure: 1,63176 s

vitesse finale: 15,6384 de

de sortie de mon programme:

Temps pour atteindre la structure: 1,63176

vitesse finale: 15,36755

À première vue, il semblerait mon programme est très fermer, donc j'ai soupçonné une erreur d'arrondi, mais c'est une simple coïncidence avec les chiffres choisis qu'ils sont proches.

+2

pourrait vous envoyer la sortie attendue avec les entrées –

Répondre

3

Vous avez mal calculé le horizontal and vertical components de la vélocité finale. Vous avez seulement utilisé le cosinus et le sinus de l'angle, plutôt que la (vitesse de la) vitesse initiale fois le cosinus et le sinus, respectivement. Si vous modifiez les deux lignes de code, vous obtiendrez le résultat que vous recherchez compte tenu de l'entrée de l'échantillon que vous avez fourni ci-dessous:

vx = velocity * x 
vy = velocity * y - 9.8 * time 

Je réécris votre code d'origine un peu et aussi calculé la hauteur finale pour vérifier si la la structure a été touchée ou non, alors ne hésitez pas à l'utiliser si nécessaire:

import math 

# User inputs 
# v0 = float(input('Give me a velocity to fire at (in m/s): ')) 
# angle = float(input('Give me an angle to fire at: ')) 
# distance = float(input('Give me how far away you are from the structure: ')) 
# height_structure = float(input('Give me the height of the structure (in meters):')) 

# Test inputs 
v0 = 20 
angle = 40 
distance = 25 
height_structure = 15 

# Constants 
height_slingshot = 5 # Height of slingshot in meters 
g = 9.8 # Earth gravity 

# Converting angle to radians 
angleRad = math.radians(angle) 

# Computing initial velocity components 
vx0 = v0 * math.cos(angleRad) 
vy0 = v0 * math.sin(angleRad) 

# Computing time to travel horizontal distance 
t_x = distance/vx0 

# Computing final vertical velocity component 
vy_final = vy0 - g * t_x 

# Computing magnitude of final velocity 
v_final = math.sqrt((vx0 ** 2) + (vy_final ** 2)) 
# Note: Horizontal component is constant 

# Computing final height 
y_final = height_slingshot + vy0 * t_x - g/2 * t_x ** 2 

# Verify if t_x was computed correctly 
# t_y1 = (vy0 + math.sqrt(vy0 ** 2 - 2 * g * y_final))/g 
# t_y2 = (vy0 - math.sqrt(vy0 ** 2 - 2 * g * y_final))/g 

# Output of program 
print('It takes your bird', t_x, 'seconds to reach the structure.') 
print('Your velocity at the target distance is', v_final, 
     'meters per second.') 

print('\nFinal height: ', y_final) 
print('Structure height:', height_structure) 
if 0. <= y_final <= height_structure: 
    print('\nYou hit the structure!') 
elif y_final < 0: 
    print('\nYou missed. Not far enough!') 
else: 
    print('\nYou missed. Too far!') 
+0

Cela fonctionne bien, je me demande si vous pouvez me montrer où je suis allé mal? Était-ce un problème pour moi de ne pas bien comprendre la composante vélocité? – DeathPox

+0

Le seul problème que je rencontre maintenant est d'utiliser des valeurs très faibles, cela dit quand même qu'il atteint la structure cible ... finalement. Je pense que c'est parce que je n'ai pas mis une instruction if quelque part pour aller en dessous de 0. Comment est-ce que j'implémenterais ceci dans mon code pour qu'il y ait essentiellement un "ground" qui fait que la vitesse s'arrête et devienne 0? Si vous lui donnez une vitesse de 1 et le tir à un angle de 1 avec une distance de 10000 et une hauteur de 1 vous obtenez ceci: Cela prend 1000152.32 secondes pour atteindre la structure Votre vitesse est 9801492.7 mètres par seconde – DeathPox

+0

J'ai ajouté une instruction if vérifier si le projectile est toujours au-dessus du sol (> 0) ou frapper le sol (= 0), c'est-à-dire si la fonction de hauteur est positive ou nulle. J'ai également ajouté la hauteur initiale au calcul de la hauteur finale que j'ai oublié d'ajouter auparavant. –