Le script aborde le modèle d'un oscillateur amorti de type masse-ressort dont l'équation différentielle du mouvement est :
\begin{equation} \mathsf{ \frac{d^2 x}{dt^2} + \frac{\omega_0}{Q} \cdot \frac{d x}{dt} + \omega_0^2 \cdot x =0 } \end{equation}Les coefficients de l'équation différentielle sont tels que : \begin{equation} \mathsf{ \omega_0=\sqrt{\frac{k}{m}} \\ Q=\frac{\omega_0}{\alpha} } \end{equation} avec :
Plusieurs aspects sont abordés ici :
La bibliothèque numpy
est utilisée pour sa collection de fonctions (sin par exemple) et pou générer une liste d'abscisses avec la fonction linspace
.
La bibliothèque matplolib
est utilisée pour tracer des graphiques.
Le module integrate
de la bibliothèque scipy
permet d'intégrer numériquement une équation différentielle.
L'intégration de l'équation différentielle est ici réalisée grâce à la fonction odeint
. Il est ici nécessaire de définir une fonction $\mathsf{f}$ qui dérive un vecteur $\mathsf{X}$ dont les composantes sont $\mathsf{{x}}$ et $\mathsf{\frac{dx}{dt}}$ :
Exemple avec l'équation différentielle précédemment décrite : \begin{equation} \mathsf{ f : \begin{pmatrix} x \\ xpoint \end{pmatrix} \mapsto \begin{pmatrix} xpoint \\ -\frac{\omega_0}{Q} \cdot xpoint - \omega_0^2 \cdot x \end{pmatrix} } \end{equation}
Les trois arguments de odeint
sont :
t
.odeint
renvoie un tableau dont la première colonne est la liste des valeurs successives de $\mathsf{x}$ et la seconde, celles des valeurs succesives de la dérivée première $\mathsf{\frac{dx}{dt}}$.
Pour extraire une partie des données :
[:,0]
(1ère colonne)[:,1]
(2ème colonne)Le script permet de résoudre l'équation différentielle et de superposer les courbes d'évolution de $\mathsf{z}$ au cours du temps pour différents facteurs de qualité et différentes conditions initiales, afin de faire le lien entre celles-ci et l'allure du tracé.
Manipulation du script
L'utilisateur peut notamment modifier les valeurs du facteur de qualité ainsi que celles des conditions initiales.
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
#Saisie de données
omega0=100
t = np.linspace(0,.4,500)
#%%# Résolution de l'équation différentielle du second ordre sans approximation
def f(X,t):
z,zpoint = X
return zpoint , -omega0/Q*zpoint - omega0**2 * z
def sol(z0,zpoint0):
return odeint(f,[z0,zpoint0],t)[:,0]
#Simulation avec modification du facteur de qualité
plt.figure(1)
z0=2
zpoint0=0
for Q in [0.5,1,2,5] :
plt.plot(t,sol(z0,zpoint0),label=f'Q = {Q}')
plt.xlabel('temps en s')
plt.ylabel('z en m')
plt.title('Influence du facteur de qualité')
plt.grid()
plt.legend()
plt.show()
#Simulation avec modification de la vitesse initiale
plt.figure(2)
z0=2
Q=5
for zpoint0 in [0,100,400] :
plt.plot(t,sol(z0,zpoint0),label=f'v0 = {zpoint0} m/s')
plt.xlabel('temps en s')
plt.ylabel('z en m')
plt.title('Influence de la vitesse initiale')
plt.grid()
plt.legend()
plt.show()
#Simulation avec modification de la position initiale
plt.figure(3)
zpoint0=0
Q=5
for z0 in [0,10,20] :
plt.plot(t,sol(z0,zpoint0),label=f'z0 = {z0} m')
plt.xlabel('temps en s')
plt.ylabel('z en m')
plt.title('Influence de la position initiale')
plt.grid()
plt.legend()
plt.show()
Le script calcule les valeurs de l'énergie cinétique et de l'énergie potentielle à chaque instant. Ces énergies sont sommées pour obtenir l'énergie mécanique.
Le graphique généré permet de visualiser l'effet du coefficient de frottement sur la vitesse de dissipation d'énergie.
Manipulation du script
L'utilisateur peut notamment modifier les valeurs du facteur de qualité.
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
# Résolution de l'équation différentielle du second ordre sans approximation
def f(X,t):
z,zpoint = X
return zpoint , -omega0/Q*zpoint - omega0**2 * z
def pos(z0,zpoint0):
return odeint(f,[z0,zpoint0],t)[:,0]
def vit(z0,zpoint0):
return odeint(f,[z0,zpoint0],t)[:,1]
def Ep(z0,zpoint0):
return .5*k*pos(z0,zpoint0)**2
def Ec(z0,zpoint0):
return .5*m*vit(z0,zpoint0)**2
#Saisie de données
k=10
m=.1
t = np.linspace(0,1,500)
#Conditions initiales
z0=2
zpoint0=0
Q=5
# Paramètres de l'équation différentielle
omega0=(k/m)**.5
alpha = m * omega0 /Q
# Tracé
plt.figure()
plt.title(f'Q= {Q} \n alpha = {alpha}')
plt.plot(t,Ec(z0,zpoint0),label='Ec')
plt.plot(t,Ep(z0,zpoint0),label='Ep')
plt.plot(t,Ec(z0,zpoint0)+Ep(z0,zpoint0),label='Em')
plt.xlabel('temps en s')
plt.ylabel('Energies (J)')
plt.grid()
plt.legend()
Cette fois, trois graphiques sont supersosés pour comparer l'effet du facteur de qualité sur la dissipation de l'énergie mécanique.
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
# Résolution de l'équation différentielle du second ordre sans approximation
def f(X,t):
z,zpoint = X
return zpoint , -omega0/Q*zpoint - omega0**2 * z
def pos(z0,zpoint0):
return odeint(f,[z0,zpoint0],t)[:,0]
def vit(z0,zpoint0):
return odeint(f,[z0,zpoint0],t)[:,1]
def Ep(z0,zpoint0):
return .5*k*pos(z0,zpoint0)**2
def Ec(z0,zpoint0):
return .5*m*vit(z0,zpoint0)**2
#Saisie de données
k=10
m=.1
omega0=(k/m)**.5
t = np.linspace(0,1,500)
#Simulation avec 3 valeurs de coefficient de qualité
z0=2
zpoint0=0
plt.figure()
plt.title("Dissipation d'énergie")
for Q in [20,10,5,2,1,.5] :
plt.plot(t,Ec(z0,zpoint0)+Ep(z0,zpoint0),label=f'Q={Q}')
plt.xlabel('temps en s')
plt.ylabel('Energie mécanique (J)')
plt.grid()
plt.legend()
plt.show()