﻿### Importation des bibliotheques

import numpy as np
import matplotlib.pyplot as plt

#################################################
### INITIALISATION DES VARIABLES - MODIFIABLE ###
#################################################

m=0.05   #Masse (kg)
θo=10     #Angle initial (deg)
L= 0.5   #Longueur du fil (m)
c=0.5 #Coefficient amortissement (SI)
g= 9.8   #Norme du champ de pesanteur (m par s2)
tmax=  5 #Temps maximal affichage courbes (s)

#################################################
#################################################

θo=θo*(np.pi/180) #Conversion des degres en radians

### Calcul des differentes grandeurs au cours du temps

omega=np.sqrt(g/L) #Calcule la pseudo periode des oscillations

def θ(t):
    res=θo*np.exp(-c*t)*np.cos(omega*t)
    return(res) #Renvoie angle du pendule au temps t

def altitude(θ):
    return(L*(1-np.cos(θ))) #Renvoie altitude de la masse au temps t

def vitesse(t):
    res=-L*θo*np.exp(-c*t)*(c*np.cos(omega*t)+omega*np.sin(omega*t))
    return(res) #Renvoie vitesse pendule au temps t

### Calcul des energies en fonction du temps

def energieCinetique(vitesse):
    return(0.5*m*(vitesse**2)) #Renvoie energie cinetique

def energiePotentielle(altitude):
    return(m*g*altitude) #Renvoie energie potentielle

def energieMecanique(Ec, Epp):
    return(Ec+Epp) #Renvoie energie mecanique

### Calcul des grandeurs pour plusieurs temps

temps=np.linspace(0,tmax,1000) #Valeurs abscisse

angles=θ(temps)
altitudes=altitude(angles)
vitesses=vitesse(temps)

energiesC=energieCinetique(vitesses)
energiesP=energiePotentielle(altitudes)
energiesM=energieMecanique(energiesC, energiesP)

### Trace des fonctions

plt.xlim(0,tmax)

plt.plot(temps, energiesC, '-', label=r'Energie cinétique')
plt.plot(temps, energiesP, '-', label=r'Energie potentielle')
plt.plot(temps, energiesM, '-', label=r'Energie mécanique')

plt.legend()
plt.grid()

plt.xlabel(r'Temps (s)')

plt.show()
