# Activité 13 - Chute d'un corps dans un milieu visqueux¶

## Présentation¶

- 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)

Out[4]:

    ([0, 0.08220000000000001, 0.13563, 0.1703595, 0.192933675],
     [8.22, 5.343, 3.472950000000001, 2.2574175000000007, 1.467321375000001])

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]:

    %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]:

    %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())

Out[6]:
Once Loop Reflect