Phys Numérique Python
Phys Numérique Python
Journée de formation
1 Loi horaire 1
1.1 Position du problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Mise en équation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 Méthodologie de tracé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.4 Modules et packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.5 Codage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.6 Compléments graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.7 À vous de jouer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Frottements fluides 5
2.1 Position du problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Étude de la vitesse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Schémas d’Euler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4 Méthodologie de tracé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.5 Codage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.6 Solution exacte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.7 Solution Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.8 À vous de jouer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3 Trajectoire 11
3.1 Position du problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Mise en équation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3 Méthodologie de tracé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.4 Codage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.5 Système différentiel et Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.6 À vous de jouer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4 Oscillateurs 15
4.1 Position du problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.2 Notations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.3 À vous de jouer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5 Canon de newton 17
5.1 Position du problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.2 Mise en équation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.3 À vous de jouer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.4 Données numériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6 Petit vade-mecum 19
6.1 Tracé d’une courbe à partir d’une fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
6.2 Tracé d’une courbe à partir de données tabulaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
6.3 Ajustements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Introduction
L’objet de ce document est d’illustrer l’utilisation de Python dans le cadre de problèmes de physique. Les thèmes
proposés s’appuient largement sur les contenus du programme de physique de TS. Partant de situations simples
rencontrées en TS, on présente quelques pistes d’utilisation de résolution numérique avec Python. Certains exemples
admettant une solution analytique, une confrontation avec les résultats numériques permet de mesurer la pertinence
d’une approche informatique. D’autres exemples plus complexes, sans solution analytique simple pour des élèves de
TS, voire sans solution analytique du tout, sont traités par approche numérique. Ces exemples peuvent être envisagés
comme des prolongements du programme.
Une première série de trois activités propose de se familiariser avec le graphisme élémentaire de Python et avec
les méthodes numériques de résolution numérique d’équations différentielles. Le problème de la chute sert de fil
conducteur à ces quatre activités.
Une quatrième activité vise à mettre en application les compétences acquises avec des activités précédentes. Le fil
conducteur est celui de l’oscillateur : oscillateur linéaire d’abord, oscillateur forcé ensuite, oscillateur non-linéaire
enfin.
La cinquième activité illustre le problème du canon de Newton. À quelle condition une masse lancée depuis une
certaine altitude, dans une certaine direction, peut-elle se satelliser ou échapper à l’attraction terrestre ? Cette activité
est l’occasion d’illustrer la mécanique gravitationnelle dans la situation simple à deux corps en interaction. Elle requiert
toute les compétences et la technicité des activités précédentes.
Un très grand merci à mes collègues Christophe Casseau et Marc Eldin pour leur aide à la construction et à la relecture
de ce document.
Un grand merci également à David Boyer, IA-IPR de sciences-physiques, à l’initiative de ces journées, pour nous avoir
réuni et donné l’occasion de monter cette première formation qui, nous l’espérons, sera suivie d’autres rencontres
autour de la physique et de l’informatique. À suivre. . .
Laurent Sartre
[Link]@[Link]
iii
Physique numérique et Python iv
◾ définir les paramètres physiques g et h en précisant Il convient de savoir qu’il est possible d’éviter la définition
leurs valeurs numériques ; et l’utilisation d’alias en important globalement toutes les
instructions d’un module. Il suffit de réaliser l’import de la
◾ définir la fonction z ∶ t ↦ h − g t 2 /2 ;
manière suivante.
◾ préciser l’intervalle de temps [t min , t max ] sur lequel
from [Link] import *
on désire tracer la courbe ;
from numpy import *
◾ tracer la courbe et l’afficher.
1. comme les fonctions trigonométriques, la racine carrée, etc.
1
Physique numérique et Python 2
Cette importation est à utiliser avec prudence. Certains # tableau des instants
modules définissent de nouvelles commandes qui portent tab_t = [Link](t_min,t_max,n_t)
le même nom que d’autres commandes qui préexistent
dans Python. Dès lors, la dernière définition écrase toute
L’une des forces du module numpy est de permettre la
autre définition préalable. Ce qui peut présenter des incon-
construction d’un tableau en appliquant une fonction sur
vénients. Dans la suite, nous utilisons systématiquement
un autre tableau. Le script suivant affecte à la variable
la notation pointée associée à la définition d’alias.
tab_z le tableau obtenu en appliquant la fonction z au
1.5 Codage tableau tab_t et aux variables g et h. Cette facilité est l’un
des points forts de Python pour le calcul scientifique.
Pour tracer la courbe représentative de la loi horaire de
z, les modules nécessaires sont d’abord chargés. Le script # tableau des z
suivant permet le tracé de la loi horaire avec h = 5 m sur un tab_z = z(tab_t,g,h)
intervalle de temps [0, 1 s] 2 . La courbe obtenue est celle
de la figure 1.1.
Il reste à tracer la courbe en portant, dans un système
# importation de numpy d’axes orthogonaux, les valeurs présentes dans la tableau
# alias np tab_z en fonction des valeurs présentes dans le tableau
import numpy as np tab_t. Noter que le nombre de valeurs dans chaque ta-
# importation de [Link] bleau doit être le même pour que cette opération ait du
# alias plt sens.
import [Link] as plt
# tracé de tab_z en fonction de tab_t
On définit ensuite une fonction qui rend compte de la loi # option 'r-' : tracé en rouge (r)
horaire. Dans le script suivant, cette fonction est notée z # en reliant les points (-)
et trois arguments doivent lui être transmis pour qu’elle [Link](tab_t,tab_z,'r-')
renvoie un résultat. Cela permettra de faire tracer des tra- # affichage de la courbe
jectoires en faisant varier les paramètres physiques h et [Link]()
3
g .
Le résultat de l’exécution de la séquence des instructions
# fonction associée à la loi horaire
précédentes est le graphique suivant.
def z(t,g,h):
return h - g * t**2 / 2
# paramètres physiques
g = 9.81 # accélération de la pesanteur
h = 1.0 # hauteur initiale en m
F IGURE 1.2
F IGURE 1.5
∀ t ∈ R+
1
v̇ (t ) = g − v (t ) (2.2)
τ
On s’intéresse à présent à la recherche de solutions numé-
riques approchées à cette équation, v (0) = 0 (corps lâché
Activité 2 sans vitesse initiale). Pour mettre en œuvre les schémas
numériques d’Euler, la relation précédente est mise sous
forme intégrée.
Frottements fluides ∀ t ∈ R+ ∫
0
t
v̇ (u ) du = ∫
0
t 1
(g − v (u )) du
τ
Le membre de gauche s’intègre immédiatement sous la
forme :
t
∫ v̇ (u ) du = v (t ) − v (0)
2.1 Position du problème 0
L’objectif de cette activité est de se familiariser avec des Le membre de droite ne s’intègre que partiellement.
méthodes numériques de résolution d’équations différen- L’équation finalement obtenue se met sous la forme in-
tielles. La méthode d’Euler est introduite de trois façons tégrale suivante.
pour en montrer les avantages et les inconvénients. Puis t
∀ t ∈ R+
1
une méthode interne à Python, qui s’appuie sur des mé- v (t ) − v (0) = g t − ∫ v (u ) du (2.3)
τ 0
thodes numériques classiques, est présentée comme un
prolongement à même de répondre aux besoins numé- La condition initiale v (0) = 0 permet de simplifier le
riques du physicien. membre de gauche. Mais pour des raisons pédagogiques, il
L’étude de la chute libre est encore le fil conducteur de peut être intéressant de conserver la présence de ce terme
cette activité. Des frottements fluides sont ajoutés à la si- en vue de préparer la mise en œuvre des techniques nu-
tuation précédente. A priori, cette situation, à un degré de mériques.
liberté encore, peut être modélisée par une équation diffé-
rentielle du second ordre dont l’inconnue est l’altitude du 2.3 Schémas d’Euler
corps. Bien qu’une solution analytique existe, sa détermi- L’idée des schémas numériques d’Euler est de remplacer
nation ne peut cependant pas être trouvée par des élèves l’intégrale précédente par une valeur approchée. Cepen-
de TS. En introduisant la vitesse du corps, on se ramène dant, une telle approximation ne peut être faite sans pré-
à une équation différentielle du premier ordre. Des mé- caution. Elle sera d’autant plus raisonnable que le terme
thodes numériques fournissent des solutions approchées sous le signe intégral varie peu sur l’intervalle d’intégra-
à cette équation. L’enseignant peut alors fournir l’expres- tion. En pratique, il y a peu de chance que cette propriété
sion de la solution analytique afin d’observer l’efficacité soit vérifiée. La vitesse peut varier de manière importante
des méthodes numériques. Une discussion peut s’engager sur l’intervalle d’observation du phénomène. En revanche,
sur la confiance à accorder aux résultats numériques en si cet intervalle est divisé en de nombreux sous-intervalles
vue de sensibiliser les élèves aux problèmes numériques suffisamment petits pour que la vitesse y varie peu, l’ap-
d’une part, de montrer la nécessité d’une attitude critique proximation devient plus raisonnable.
à l’égard des résultats fournis par l’outil numérique d’autre Notons t max l’instant final d’observation de la chute. Dé-
part. Fort de ces compétences, le travail peut être poursuivi coupons la durée ∆t = t max − 0 en n t intervalles de mêmes
pour étudier l’évolution de l’altitude du corps et pour faire durées δt = ∆t /n t . Définissons les instants :
un bilan énergétique numérique.
∀i ∈ {0, 1, . . . , n }, t i = i × δt
2.2 Étude de la vitesse Plus n t est grand, plus δt est petit et plus il y a de valeurs
La force de frottements fluides est modélisée par le vecteur d’instants t i . En augmentant la valeur de n t , on peut rai-
force F⃗f = −λż ê z , λ étant un coefficient strictement positif
sonnablement penser que les intervalles temporels de-
lié aux frottements, ê z désignant un vecteur unitaire ver- viennent suffisamment petits pour que la vitesse y varie
tical ascendant. L’équation donnant l’évolution de z est à peu. L’idée des schémas d’Euler est d’exploiter cette ana-
présent : lyse pour donner une forme pratique à l’équation (2.3)
λ
∀ t ∈ R+ z̈ (t ) = −g − ż (t ) en intégrant sur un intervalle de la forme [t i , t i +1 ], i =
(2.1)
m {0, 1, . . . , n − 1}. Ainsi, il est possible d’écrire, pour tout en-
En raison du choix d’orientation de l’axe vertical, ż est né- tier i prenant ses valeurs dans l’ensemble {0, 1, . . . , n − 1} :
gative : la vitesse du corps augmente en descendant. Il peut 1 t i +1
être commode de poser v = −ż de manière à raisonner sur v (t i +1 ) − v (t i ) = g × δt − ∫ v (u ) du
τ ti
une vitesse positive dont la valeur croît au fur et à mesure
que le corps perd de l’altitude. Par ailleurs, une analyse Si sur chaque intervalle [t i , t i +1 ], la vitesse varie peu, elle
dimensionnelle de l’équation précédente montre que le varie quand même. La question est alors de savoir quelle
rapport m /λ est homogène à un temps caractéristique τ. valeur choisir pour l’approcher.
5
Physique numérique et Python 6
◾ Le schéma d’Euler explicite propose de remplacer illustrant la construction du tableau à l’aide du schéma
v (u ) par v (t i ) sur cet intervalle. L’équation inté- d’Euler explicite, la boucle for parcourt une liste d’entiers
grale prend alors la forme approchée suivante. de 0 à n_t-1. C’est la fonction range(n_t) qui définit
cette liste. Noter que la dernière valeur définie par cette
v (t i ) fonction est n_t-1 et non n_t. D’autres utilisations de la
v (t i +1 ) − v (t i ) ≈ (g − ) × δt
τ fonction range reçoivent plusieurs arguments. Si a et b
sont deux nombres entiers :
◾ Le schéma d’Euler implicite propose de remplacer
v (u ) par v (t i +1 ) sur cet intervalle. L’équation inté- ◾ range(a,b) définit un objet itérable
grale prend alors la forme approchée suivante. [a,a+1,a+2,...,b-1] ;
◾ range(b) définit un objet itérable [0,1,2,...,b-1] ;
v ( t i +1 )
v (t i +1 ) − v (t i ) ≈ (g − ) × δt ◾ range(a,b,c) définit un objet itérable
τ [a,a+c,a+2c,...] ;
Ces relations permettent de calculer, de proche en proche, La création d’un tableau se fait à l’aide de l’instruction
les valeurs approchées de la vitesse aux différents instants [Link], du module numpy. En tapant
t i . Ces valeurs ne sont pas les valeurs exactes et seront no-
tab_v = [Link](n_t)
tées v i ≈ v (t i ) de sorte que les relations établies ci-dessus
se traduisent par les égalités suivantes.
on crée un tableau vide à n_t+1 éléments. Les éléments
v i +1 − v i = (g − τ ) × δt
vi
(Euler explicite) d’un tableau sont accessibles par l’intermédiaire de leur
{ rang dans le tableau, en commençant par le rang 0. Ainsi, à
v i +1 − v i = (g − iτ+1 ) × δt (Euler implicite)
v
chaque rang dans le tableau tab_v est associée une valeur
En isolant v , on obtient des relations de récurrence qui approchée de vitesse selon les correspondances suivantes.
i +1
permettent le calcul de proche en proche des valeurs ap- tab_v[0] ←→ v 0
prochées.
tab_v[1] ←→ v 1
⎧ δt
⎪v i +1 = (1 − τ ) v i + g × δt (Euler explicite)
⎪ ...
⎨
⎪
⎪ v i +1 = δt (v i + g × δt ) (Euler implicite)
1
tab_v[n_t] ←→ v n t
⎩ 1+ τ
Le script suivant présente la fonction euler_explicite
2.4 Méthodologie de tracé qui calcule et retourne le tableau des vitesses.
Pour tracer la courbe représentative de la loi horaire de v
def eulerExp(t_min,t_max,n_t,g,h,v0,tau):
avec Python, on doit : # création d'un tableau vide
◾ définir les paramètres physiques g et h en précisant # des vitesses
leurs valeurs numériques ; # à (n_t + 1) éléments
tab_v = [Link](n_t)
◾ préciser l’intervalle de temps [t min , t max ] sur lequel
# affectation de la vitesse initiale
on désire tracer la courbe ;
# au premier élement du tableau
◾ discrétiser cet intervalle de temps ; tab_v[0] = v0
◾ évaluer de proche en proche les valeurs approchées # calcul de delta_t
de vitesses ; delta_t = (t_max - t_min) / n_t
# boucle de calcul
◾ tracer la courbe et l’afficher. # des vitesses approchées
for i in range(n_t-1):
2.5 Codage tab_v[i+1] = (1 - delta_t / tau) *
Le début du script comporte les mêmes importations que ↪ tab_v[i] + g * delta_t
celles rencontrées dans l’activité 1. return tab_v
# importation de numpy D’autres choix de codage sont possibles. Le choix fait ici
# alias np
est celui de la simplicité et d’un lien étroit avec les expres-
import numpy as np
sions mathématiques établies plus haut.
# importation de [Link]
# alias plt Le script suivant définit les paramètres physiques du pro-
import [Link] as plt blème.
# paramètres physiques
À présent, il nous faut construire l’équivalent de la loi ho- g = 9.81 # accélération de la pesanteur
raire définie par une fonction dans l’activité 1. Une fonc- m = 1.0 # masse
tion Python remplit ce rôle. Elle reçoit un ensemble d’argu- lamb = 0.1 # coef. de frottement
ments nécessaires au calcul des différentes valeurs appro- tau = m / lamb
chées de la vitesse et retourne un tableau de ces valeurs. v0 = 0.0 # vitesse initiale
D’un point de vue informatique, le calcul de proche en h = 5.0 # hauteur initiale
proche associé aux relations de récurrence fait appel à
une structure répétitive (ou boucle). Dans le script suivant Puis les tableaux des instants et des vitesses sont calculés.
# paramètres physiques
Enfin, la courbe et quelques informations sont affichées. g = 9.81 # accélération de la pesanteur
m = 1.0 # masse
[Link](tab_t,tab_v,'r-',label="h = " +
lamb = 0.1 # coef. de frottement
str(h) + " m")
tau = m / lamb
↪
[Link]('Temps (en s)')
v0 = 0.0 # vitesse initiale
[Link]('Vitesse de $M$ (en m/s)')
h = 5.0 # hauteur initiale
[Link]("Chute libre avec frottements
↪ fluides et sans vitesse initiale")
[Link](0.7 * t_max,10.0,r'$h = ' + str(h) + # tracé des trajectoires
↪ '$ m') t_min = 0.0 # instant initial
[Link](0.7 * t_max,5.0,r'$t_{max} = ' + t_max = 5.0 * tau # instant final
↪ str(t_max) + '$ s') n_t = 100
[Link](0.7 * t_max,15.0,r'$m = ' + str(m) + # tableaux
↪ '$ kg') tab_t = [Link](t_min,t_max,n_t)
[Link](0.7 * t_max,20.0,r'$\lambda = ' + tab_v = v(tab_t,g,h,tau)
↪ str(lamb) + '$ kg/s')# h = 10.0 # hauteur # tracé
↪ initiale [Link](tab_t,tab_v,'g--',label="Solution
[Link]() ↪ exacte")
[Link]('Temps (en s)')
Le résultat graphique est présenté figure 2.1. [Link]('Vitesse de $M$ (en m/s)')
[Link]("Chute libre avec frottements
↪ fluides et sans vitesse initiale")
[Link](0.7 * t_max,40.0,r'$h = ' + str(h) +
↪ '$ m')
[Link](0.7 * t_max,35.0,r'$t_{max} = ' +
↪ str(t_max) + '$ s')
[Link](0.7 * t_max,45.0,r'$m = ' + str(m) +
↪ '$ kg')
[Link](0.7 * t_max,50.0,r'$\lambda = ' +
↪ str(lamb) + '$ kg/s')
[Link](loc=4)
[Link]()
F IGURE 2.1
import numpy as np
2.7 Solution Python
import [Link] as plt D’autres méthodes numériques, plus efficaces que les
schémas d’Euler, permettent d’approcher la solution d’une
def eqDif(v,tab_t,g,tau):
return g - v / tau
# paramètres physiques
g = 9.81 # accélération de la pesanteur
m = 1.0 # masse
F IGURE 2.3
lamb = 0.5 # coefficient de frottement
tau = m / lamb # temps caractéristique
h = 5.0 # hauteur initiale La méthode odeint fournit des résultats numériques tout
# vitesse initiale à fait pertinents. Elle est plus précise que les schémas d’Eu-
v0 = 0.0 ler dont l’objet était de présenter une technique numé-
rique simple, à la base de nombreuses autres méthodes.
Le script suivant précise les différentes étapes menant à la
résolution. Le résultat de l’appel à odeint est un tableau
2.8 À vous de jouer
qui contient autant de valeurs que le tableau tab_t. Ce ▶ Question 1. Mettre en œuvre le schéma d’Euler impli-
tableau est affecté à la variable tab_v. cite pour tracer l’évolution temporelle de la vitesse.
Sur un même graphique, tracer les courbes obtenues par
1. Le package scipy
2. Celle-ci peut d’ailleurs être vectorielle, ce qui permet la résolution de certaines équations différentielles d’ordre supérieur à 1. C’est souvent le
cas en physique.
3. Nous verrons plus loin qu’il peut s’agir d’un ensemble de variables, sous la forme d’un tableau.
F IGURE 2.4
v (t ) = g τ (1 − e −t /τ )
∀t ∈ R+ , z (t ) = h + g τ2 (1 − − e −t /τ )
t
τ
∀t ∈ R+ , ż (t ) = −g t − (z (t ) − h )
1
(2.4)
τ
3.4 Codage
Activité 3 Le début du script reprend en grande partie celui écrit dans
l’activité 1. Il est complété par la définition de la fonction
x et par la construction du tableau tab_x.
Trajectoire
import numpy as np
import [Link] as plt
# fonctions associée aux lois horaires
def x(t,g,v0,alpha):
3.1 Position du problème return v0 * [Link](alpha) * t
Les activités précédentes ont permis d’acquérir les mé- def z(t,g,h,v0,alpha):
thodes élémentaires de tracé de courbes et de résolution return h + v0 * [Link](alpha) * t - g *
numérique d’équations différentielles simples. Ces com- ↪ t**2 / 2
pétences peuvent être mises à profit pour étudier un mou- # paramètres physiques
g = 9.81 # accélération de la pesanteur
vement plan et tracer la trajectoire d’un corps à partir de
h = 5.0 # altitude initiale
la solution approchée d’un système différentiel.
v0 = 10.0 # vitesse initiale
La trajectoire plane du point matériel peut aisément être # angle en degrés
numériquement tracée dans le cas de la chute libre avec alpha_deg = 45.0
vitesse initiale, sans frottement. La prise en compte de # Python calcule en radians
frottements fluides est abordé sous forme d’exercice pour alpha = alpha_deg * [Link] / 180.0
compléter la prise en main de Python. # intervalle temporel d'étude
t_min = 0.0 # instant initial
3.2 Mise en équation t_max = 1.0 # instant final
n_t = 100 # nombre de points
Le point matériel M de masse m, soumis à la seule force
# tableaux
de pesanteur, est initialement lancé avec une vitesse v 0
tab_t = [Link](t_min,t_max,n_t)
faisant un angle α avec l’axe horizontal (Ox ), depuis le tab_x = x(tab_t,g,v0,alpha)
point de coordonnées (0, h ). Son vecteur vitesse initiale se tab_z = z(tab_t,g,h,v0,alpha)
décompose dans la base (ê x , ê z ) sous la forme :
ẍ (t ) = 0 [Link](tab_x,tab_z,'r-')
{ (3.1)
z̈ (t ) = −g
x (t ) = v 0 t cos α
∀ t ∈ R+ { (3.2)
z (t ) = h + v 0 t sin α − 21 g t 2 [Link]('Abscisse (en s)')
[Link]('Cote (en m)')
[Link]("Chute libre avec vitesse
3.3 Méthodologie de tracé ↪ initiale")
Tracer la trajectoire revient à tracer z (t ) en fonction [Link](0.7 * t_max,35.0,r'$t_{max} = ' +
de x (t ) pour t ⩾ 0. En Python, cela revient d’abord à ↪ str(t_max) + '$ s')
construire les tableaux de valeurs des coordonnées x et z [Link](0.7 * t_max,40.0,r'$h = ' + str(h) +
pour t variant dans un intervalle fixé. La méthodologie est ↪ '$ m')
très proche de celle présentée dans l’activité. Il convient [Link](0.7 * t_max,45.0,r'$v_{0} = ' +
↪ str(v0) + '$ m/s')
simplement d’ajouter la construction du tableau associé
[Link](0.7 * t_max,50.0,r'$\alpha = ' +
aux valeurs de x.
↪ str(alpha_deg) + '$°')
◾ Définir les paramètres physiques du problème en [Link]()
précisant leurs valeurs numériques.
◾ Définir deux fonctionsx ∶ x ↦ v 0 t cos α et z ∶ t ↦ h +
v 0 t sin α − g t 2 /2. Le résultat graphique est donné figure 3.1
11
Physique numérique et Python 12
suivant :
⎧
⎪ ẋ (t ) = p (t )
⎪
⎪
⎪
⎪
⎪
⎪ (t ) = f x (x (t ), y (t ), z (t ), p (t ), q (t ), r (t ), t )
⎪
⎪
⎪
ṗ
⎪
⎪
⎪ ẏ (t ) = q (t )
∀ t ∈ R+ , ⎨
⎪
⎪
⎪ q̇ (t ) = f y (x (t ), y (t ), z (t ), p (t ), q (t ), r (t ), t )
⎪
⎪
⎪
⎪
⎪
⎪ ż (t ) = r (t )
⎪
⎪
⎪
⎪
⎩r˙(t ) = f z (x (t ), y (t ), z (t ), p (t ), q (t ), r (t ), t )
muni des conditions initiales :
x (0 ) = x 0 y (0 ) = y 0 z (0 ) = z 0
p (0) = v 0x q (0) = v 0y r (0) = v 0z
1. Cette analyse, a priori mathématique, est à rapprocher des modalités d’étude des mouvements en mécanique analytique et de la notion
d’espace de phases.
2. auxquelles il est souvent possible de donner un sens physique
# paramètres physiques
g = 9.81 # accélération de la pesanteur
x0 = 0.0
z0 = 5.0 # altitude initiale
v0 = 10.0 # vitesse initiale
# angle en degrés
alpha_deg = 45.0
# Python calcule en radians
alpha = alpha_deg * [Link] / 180.0
cond_init = [x0,v0 * [Link](alpha),z0,v0 *
↪ [Link](alpha)]
# intervalle temporel d'étude
t_min = 0.0 # instant initial
t_max = 1.0 # instant final
n_t = 3 # nombre de points
# tableaux
tab_t = [Link](t_min,t_max,n_t)
sol_num = odeint(F,cond_init,tab_t,args=(g,))
tab_x = sol_num[:,0] # tableaux des x
tab_z = sol_num[:,2] # tableaux des z
F IGURE 3.2
Oscillateurs
4.2 Notations
On s’intéresse tout d’abord au mouvement à un seul degré
de liberté d’un point matériel soumis à une force de rappel
élastique et à une force de frottements fluides. Le corps
n’est soumis à aucune autre force. Cette situation peut être
modélisée par l’équation différentielle du second ordre
suivante.
x (0 ) = x 0 ẋ (0) = v 0
F IGURE 4.2
En posant p (t ) = ẋ (t ), l’équation (4.1) est équivalente au
système différentiel du premier ordre suivant :
ẋ (t ) = p (t )
∀t ∈ R+ , { ▶ Question 3. Pour disposer de plusieurs tracés dans
ṗ (t ) = −2ζω0 p (t ) + ω20 x (t )
une même fenêtre graphique, Python dispose de la com-
muni des conditions initiales : mande subplot. Le script suivant illustre son utilisation.
x (0 ) = x 0 p (0 ) = v 0
import numpy as np
L’objet de cette activité est de résoudre numériquement ce import [Link] as plt
système puis d’étudier des systèmes oscillants plus com- # fonction à tracer
plexes. L’outil numérique se révèlera ici particulièrement def f(x,k):
efficace pour atteindre ces objectifs. return [Link](k * x)
def g(x,k):
4.3 À vous de jouer return [Link](k * x)
# données de tracé
▶ Question 1. Proposer un script complet qui donne
x_min = 0.0
l’évolution temporelle de x pour différentes valeurs de x_max = 2 * [Link]
ζ. Ces valeurs seront choisies de manière à mettre en évi- n_x = 100
dence différents comportements oscillatoires. Les courbes tab_x = [Link](x_min,x_max,n_x)
seront tracées sur un même graphique.
15
Physique numérique et Python 16
F IGURE 4.3
F IGURE 4.4
M v⃗0
r α
Activité 5 θ
x
O M0
Canon de newton
L2 GM L
r¨ = − θ̇ =
m2r 3 r2 mr 2
17
Physique numérique et Python 18
def f(x):
return [Link](-x * x)
[Link](x,y)
[Link]()
6.2 Tracé d’une courbe à partir de
données tabulaires
En physique, les données numériques sont d’origine ex-
1.0
périmentales. Obtenues à partir de mesures (acquisitions
de données via un CAN), elles peuvent être enregistrées
dans un fichier. Python peut lire les données pour ensuite
0.8 afficher une courbe.
Le format .csv est fréquemment adopté pour enregistrer
0.6 des données ou les exporter depuis un logiciel. En pratique,
les données sont stockées dans un fichier sous forme de
flottants, séparés par un point virgule. Le module csv de
0.4
Python fournit quelques fonctions pratiques pour mani-
puler les fichiers .csv.
0.2 Dans l’exemple suivant, le fichier de données [Link]
contient des lignes de deux flottants séparés par un point-
0.0 virgule.
4 3 2 1 0 1 2 3 4 5
19
Physique numérique et Python 20
[Link](xFit,yFit,label='fit',color='r')
[Link](x,y,'b-') [Link](x,y,'bo')
[Link](x,y 'ro') [Link]()
[Link]()
3.0
3.0
2.5
2.5
2.0
2.0 1.5
1.5 1.0
1.0 0.5
0.5 0.0
0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4
0.0
0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 F IGURE 6.4
F IGURE 6.3
6.3 Ajustements
Il est parfois nécessaire de déterminer un modèle mathé-
matique rend compte de l’évolution d’un phénomène phy-
sique. Par exemple, une série de mesures a fourni un en-
semble de couples de points (x i , y i ) qui semblent s’aligner.
Comment déterminer l’équation de la droite de régres-
sion associée ? Python dispose d’une fonction curve_fit
du module from [Link] qui permet tout type
d’ajustement : ajustement linéaire, ajustement gaussien,
etc. L’exemple suivant présente un ajustement gaussien de
données. Il reprend une partie du code vu ci-dessus. Noter
la conversion des données en tableau (fonction ar).
def gauss(x,a,x0,sigma):
return a*[Link](- (x - x0)**2 / sigma**2
↪ / 2)
source = open('[Link]','r')
x, y = [], []
for row in [Link](source,delimiter=';'):
x1, y1 = map(float,row)
[Link](x1)
[Link](y1)
x, y = ar(x), ar(y)
xmin, xmax, n_x = min(x), max(x), 100