Oscillateur harmonique amorti

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 :

  • $\mathsf{m}$, masse accrochée au ressort,
  • $\mathsf{k}$, constante de raideur du ressort,
  • $\mathsf{\alpha}$, coefficient de frottement.

Plusieurs aspects sont abordés ici :

  • Influence du coefficient de frottement (ou du fecteur de qualité) sur l'allure des solutions,
  • Tracés de l'énergie cinétique, de l'énergie potentielle et de l'énergie mécanique au cours du temps.

Bibliothèques utilisées


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 scipypermet d'intégrer numériquement une équation différentielle.


Principe de la résolution numérique


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 :

  • la fonction $\mathsf{f}$
  • les conditions initiales sous forme d'une liste,
  • la liste des temps 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 :

  • liste des valeurs de $\mathsf{x}$ : ajouter [:,0] (1ère colonne)
  • liste des valeurs de $\mathsf{\frac{dx}{dt}}$ : ajouter [:,1] (2ème colonne)

Influence du facteur de qualité et des conditions initiales


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.

In [14]:
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()

Aspect énergétique


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é.

In [29]:
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() 
Out[29]:
<matplotlib.legend.Legend at 0x7fe9859e9910>

Cette fois, trois graphiques sont supersosés pour comparer l'effet du facteur de qualité sur la dissipation de l'énergie mécanique.

In [30]:
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()