# -*- coding: utf-8 -*-
"""
@author: Delphine

DESCRIPTION

Ce code propose une résolution numérique, basée sur la méthode d'Euler, d'un problème de chute libre d'une balle sans prendre en compte les frottements de l'air.
La trajectoire et la vitesse sont calculées jusqu'à ce que la balle touche le sol.
"""

"""
BIBLIOTHEQUES
"""
# import de la bibliothèque numpy (gestion de matrices et routines mathématiques) en lui donnant le surnom np
import numpy as np
# import de la bibliothèque matplotlib (graphiques) en lui donnant le surnom plt
import matplotlib.pyplot as plt



""" INITIALISATION ET DEFINITION DES PARAMETRES DE SIMULATION"""
# accélération de la pesanteur 9,81 N.m-2
g = 9.81

# définition du pas de temps = 0,001 seconde
dt = 0.001

# rayon de la balle (en m)
r = 0.03
# ordonnée initiale du corps (en m)    
y_0 = 1.5
# vitesse verticale initiale du corps (en m/s)
vy_0 = 0

"""
INITIALISATION DES VARIABLES DE CALCUL
"""
# ordonnée initiale = y0
y = y_0
# vitesse verticale initiale = vy_0
vy = vy_0

# Calcul du mouvement
i = 0        # indice de la boucle
temps = 0    # compteur de temps

"""
CALCUL DU MOUVEMENT
"""
# La boucle est exécutée tant que le corps n'a pas touché le sol :
# (tant que la position y de son centre d'inertie est supérieure à son rayon)
while (y > r) :
    vy = vy - g*dt
    y = y + vy*dt
    
    i = i + 1
    temps = temps + dt
    
    plt.plot(temps,y,"bo")
    
plt.title("Position verticale de la balle au cours du temps")
plt.xlabel("temps (s)")  
plt.ylabel("position (m)")
plt.grid(True)
plt.plot(temps,y,"bo", label="résolution numérique") # on fait apparaitre la légende correpondante 

# Résolution analytique
temps_analyt = np.linspace(0,temps,500)   
y_analyt = - 1/2 * g * temps_analyt **2 + vy_0 * temps_analyt + y_0

plt.plot(temps_analyt,y_analyt,"-r", lw=2.5, label="résolution analytique")
plt.legend()

print("La balle a atteint le sol en",round(temps,3), "s")
print("Le calcul a réalisé",i,"itérations avec un pas de temps de",dt,"s")