#!/usr/bin/env python
# coding: utf-8
# # Chute d'un corps dans un milieu visqueux
# ## Présentation
# - **Voie et niveau de classe :**
# - Technologique: Première (STI2D-STL, spécialité physique-chimie et mathématiques)
# - **Référence au programme :**
# - Spécialité physique-chimie et mathématiques de première technologique : *Construire différents points d’une approximation de courbe intégrale par la méthode d’Euler.*.
# - **Description de l'activité :** cette activité permet d'utiliser la méthode d'Euler dans le contexte de la chute d'un corps dans un milieu visqueux.
# Un corps s'enfonce dans un milieu visqueux selon le modèle régi par l'équation :
# $$
# a(t) = k\times v(t) + g_0
# $$
# où $a$ représente l'accélération, $v$ la vitesse et $g_0$ une constante gravitationnelle.
# ## Constantes
# Fixons les constantes à $k=35$ et $g_0=8,22$.
# In[2]:
k = 35
g0 = 8.22
# ## Méthode d'Euler
# La fonction `acceleration` prend en paramètre un flottant `v` représentant la vitesse et renvoie l'accélération.
# In[3]:
def acceleration(v):
return -k*v+g0
#
#
# Suggestions pédagogiques
#
#
# * **Écrire un programme**
#
# Écrire la fonction `acceleration`.
# La fonction `euler` prend en paramètres `v0` représentant la vitesse initiale, `n` représentant le nombre d'itérations de la méthode d'Euler et `dt` le pas de temps. Elle renvoie la liste des vitesses et des accélérations calculées au fur et à mesure avec la méthode d'Euler.
# In[4]:
def euler(v0,n,dt):
listeVitesses = [v0]
a0 = acceleration(v0)
listeAccelerations = [a0]
v =v0
a = a0
for i in range(n-1):
v = v + a*dt
listeVitesses.append(v)
a = acceleration(v)
listeAccelerations.append(a)
return listeVitesses,listeAccelerations
euler(0,5,0.01)
#
#
# Suggestions pédagogiques
#
#
# * **Expliquer un programme**
#
# - Que représente `a0` ?
# - Expliquer l'égalité de la ligne 8.
#
# * **Compléter un programme**
#
# Le programme précédent étant fourni en remplaçant les lignes 4, 6 et 8 par `listeAccelerations = [...]`, `a = ...`, `v = ...`, demander aux élèves de compléter les lignes 4, 6 et 8.
# ## Représentation graphique
# In[5]:
get_ipython().run_line_magic('matplotlib', 'inline')
import matplotlib.pyplot as plt
fig, (ax1,ax2) = plt.subplots(1, 2,figsize=(12, 5))
def plotEuler(v0,n,dt):
t0 = 0
X = [t0 + i*dt for i in range(n)]
listeVitesses,listeAccelerations = euler(v0,n,dt)
ax1.plot(X,listeVitesses,'r--',label='Vitesse')
ax2.plot(X,listeAccelerations,'b--',label='Accélération')
plotEuler(0,30,0.01)
ax1.legend(loc="lower right")
ax2.legend(loc="upper right")
plt.show()
#
#
# Suggestions pédagogiques
#
#
# * **Interprétation du résultat**
# - Commenter la forme des courbes. Est-ce cohérent ?
# ## Animation susceptible d'être présentée aux élèves
# La courbe de gauche donne la vitesse du corps en fonction du temps et la courbe de droite son accélération construite avec la méthode d'Euler.
# In[6]:
get_ipython().run_line_magic('matplotlib', 'inline')
from matplotlib.pyplot import plot,show,subplots,close
import matplotlib.animation
from IPython.display import HTML
#ctes:
n =40
v0 = 0
dt = 0.01
t0 = 0
#Création des figures
fig, (ax1,ax2) = subplots(1, 2,figsize=(12, 6))
courbeVitesses, = ax1.plot([],[],'.-',color="#1e7fcb")
courbeAcceleration, = ax2.plot([],[],'.-',color="#C4151C")
#Réglage des axes
ax1.set_xlim(( 0, 0.4))
ax1.set_ylim(( 0, 0.3))
ax2.set_xlim(( 0, 0.4))
ax2.set_ylim(( 0, 9))
def init():
global courbeVitesse
courbeVitesses.set_data([], [])
courbeAcceleration.set_data([], [])
return (courbeVitesses,)
def animate(j):
global courbeVitesse,courbeAcceleration,v0,t0,n
listeAbscisses = [t0 + i*dt for i in range(j+1)]
listeVitesses,listeAccelerations = euler(v0,j+1,dt)
#print(euler2(0,5,0.1))
courbeVitesses.set_data(listeAbscisses,listeVitesses)
courbeAcceleration.set_data(listeAbscisses,listeAccelerations)
ax1.set_title('Vitesse',color="#1e7fcb")
ax2.set_title('Accélération',color="#C4151C")
return (courbeVitesses,)
close ()
ani = matplotlib.animation.FuncAnimation(fig, animate, frames=n,init_func=init,blit=False,interval=200)
# l'un ou l'autre
HTML(ani.to_jshtml())
#HTML(ani.to_html5_video())