
"""
PENDULE SIMPLE AMORTI PAR LA METHODE D'EULER EXPLICITE

"""

## Importation des bibliothèques utiles
## ------------------------------------

import numpy as np                  # pour la manipulation des tableaux
import matplotlib.pyplot as plt     # pour les représentations graphiques
from scipy.integrate import odeint

## Saisie des données du problème
## ------------------------------------
# Définition des constantes utiles
L = 21      #Longueur du pendule, en mètres
m = 53      #Masse du pendule, en kg
k = 1       #Coef de frottement visqueux, en kg.s-1  
g = 9.81    #Accélération de la pesanteur, en m.s-2     

To = 2*np.pi*np.sqrt(L/g)    #Période propre (en secondes)
print("Période propre des oscillations :{:.2f} s".format(To))

#Conditions initiales
theta0 = ??????  #Angle initial en °
dtheta0= ??????   #Vitesse angulaire initiale en °/s
 
#Paramètres de la résolution numérique 
r0 = [??????]       # vecteur initial (en rad et rad.s-1)
dt=1e-3*To                                         # pas de temps d'intégration
t0, tf = 0, 10.5*To                                 # bornes de l'intervalle de résolution 

## Implémentation de la méthode d'Euler explicite
## ----------------------------------------------

def euler(F, r0, t0, tf, dt):

    # A COMPLETER  

## Application au pendule amorti
## ---------------------------------------

def Pendule(r, t):
    """
    Fonction explicitant dr/dt en fonction de r et t.
    Le vecteur r, de dimension 2 est composé de :
        r[0] : theta(t)
        r[1] : d(theta)/dt
    """
# A COMPLETER
        

## Résolution et représentation graphique
## ---------------------------------------

t,r=euler(Pendule, r0, t0, tf, dt)

#Conversion en degres pour l'affichage
theta_d=r[:,0]*180/np.pi    #angle en degrés
dtheta_d=r[:,1]*180/np.pi   #vitesse angulaire en degrés par seconde

# Définition de la taille de la fenêtre
plt.figure(figsize=(14,10))  # Largeur = 6, Hauteur = 8 (unités en pouces)

plt.plot(t, theta_d)   
                                    
plt.ticklabel_format(style='plain')
plt.title("Trajectoire du pendule amorti par la méthode d'Euler explicite")        
plt.xlim(t0,tf), plt.xlabel(r"$t$ ($s$)")   # habillage de l'axe des abscisses
plt.ylim(1.05*min(theta_d),1.05*max(theta_d)), plt.ylabel(r"$\theta$ (°)")     # habillage de l'axe des ordonnées
plt.grid()

# Ajustement de l'affichage
plt.tight_layout()
plt.show()



