Académique Documents
Professionnel Documents
Culture Documents
TD Méthodes numériques
Automne 2022
Enseignants : R ODOLPHE B OISGARD, D ENIS D UMORA , N ICOLAS FARES , J ÉRÔME G AUDIN , E MMANUEL
D ’H UMIÈRES , L IONEL T RUFLANDIER
Version originale du document : R ODOLPHE B OISGARD (2013)
TABLE DES MATIÈRES
I Travaux Dirigés 3
1 Premiers pas 5
A Découverte de l’environnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
A.1 Le mode « console » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
A.2 Premiers scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
B Tracé de courbes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4 Équations différentielles 23
A Équation différentielle du premier ordre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
A.1 Principe : la méthode d’Euler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
A.2 La fonction odeint de scipy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
B Système du 1er ordre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
B.1 Système proie-prédateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
B.2 Cinétique chimique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
C Systèmes du second ordre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2
Première partie
Travaux Dirigés
3
I NTRODUCTION
Les TDs de Python de ce module de S3 ont lieu, suivant les groupes sur les machines du CRPhy au premier
étage du bâtiment A1 (PC/Linux, Python 3.x) ou sur les machines de l’espace Lavoisier (Mac/Mac OS X, Python
2.7). Python 3.x n’étant pas l’héritier direct de python 2.7, mais plutôt une évolution parallèle des différences
existent entre les deux langages. En effet, le projet d’écrire une version 3 de Python a démarré en 2008 alors que la
version courante était Python 2.5. L’idée de départ était de proposer une version plus cohérente du langage avec
la conséquence de rendre Python 3 non rétrocompatible avec python 2.x...
Au vu des millions de ligne de code à réécrire pour produire Python 3, l’exercice a pris un certain temps pen-
dant lequel Python 2 a continué à évoluer. Python 3.0 est donc sorti à peu près en même temps que Python 2.6.
Ce dernier a intégré un module __future__ chargé de préfigurer dans Python 2.x les principaux changements
apportés par Python 3.x.
Au cours des années suivantes les deux Pythons ont continué à évoluer en parallèle et une version 2.7 de
Python 2 est apparue pendant que des versions 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7 et maintenant (en 2020) 3.8 se sont
succédées afin d’inclure de plus en plus de modules originellement écrits en Python 2 dans Python 3.
Depuis le 1er Janvier 2020, Python 2.7 n’est plus supporté, actant ainsi l’arrivée à maturité de Python 3.
Il est donc conseillé à tout nouvel utilisateur de Python d’installer Python 3 (3.8 actuellement)... et à tout
ancien utilisateur d’envisager sérieusement la migration de ses codes Python 2 vers Python 3.
Les différences entre Python 2 et Python 3 qui seront rencontrées dans ce cours sont assez minimes. Elles
feront l’objet d’un exemple clairement identifié pour chaque version.
Quand il ne sera pas explicitement fait mention de la version de Python, le code sera rédigé en utilisant la
syntaxe Python 3. Généralement, dans ce cas, le code s’avèrera aussi compatible avec Python 2.
4
TD 1
P REMIERS PAS
A Découverte de l’environnement
A.1 Le mode « console »
Python est un langage « dit » interprété, l’interface de développement va donc donner accès à une console
dans laquelle les commandes python tapées par l’utilisateur sont immédiatement interprétées. Nous utiliserons
la console pour faire des essais mais nous ne privilégieront pas cette approche pour la programmation. Un des
objectifs du module numérique est de pouvoir construire des programmes complets.
Deux types de consoles sont accessibles sur l’IDE Spyder (c’est aussi vrai pour d’autres IDE),
Console Classique reconnaissable à son prompt (ou invite de commande) python à 3 chevrons >>>.
Console IPython reconnaissable à son prompt (ou invite de commande) Ipython donnant le numéro d’ins-
truction entre crochets [1].
La console permet à la fois un accès direct à l’interpréteur, elle sera aussi comme nous le verrons plus tard l’endroit
où apparaissent les messages liés à l’exécution des programmes.
Remarque préliminaire : le symbole ␣ dans les portions de code signifie qu’on a introduit une espace 1
Confortable, non ?
2. Problème de la division Attention ce « problème » n’existe qu’en python 2.7, donc ceux qui sont sous
python 3 ne sont pas concernés. Taper dans la console : >>> 2/3. Comparer avec >>> 2./3.
Pour éviter cet inconvénient il suffit d’introduire la ligne : from␣__future__␣import␣division
5
6 TD 1. PREMIERS PAS
3. Affectation dans des variables. On veut calculer le nombre complexe, résultat de la formule :
x = a + j b2
avec a = 3, b = 6.5 et afficher le résultat. Tapez les lignes suivantes dans la console
>>> a = 3
>>> b = 6.5
>>> x = a+1j*(b**2)
>>> print x
(3+42.25j)
>>> print "x =",x
x = (3+42.25j)
>>> type(a), type(b),type(x)
(<type ’int’>, <type ’float’>, <type ’complex’>)
4. On notera à cette occasion que l’opérateur « puissance » s’écrit : ** et que la fonction type() permet
d’afficher le type de la variable ainsi définie.
Console IPython sous Spyder
1. Taper quelques opérations élémentaires : addition In [1]: 5+4 , soustraction In [2]: 5-14, multipli-
cation In [3]: 3*8. Ces opérations fonctionnent avec des entiers on vient de le voir, avec des réels bien
sûr
In [1]: 3.5*3.14
Out [1]:10.99
In [2]: 1.6e-19*6.6e-34
Out [2]:1.056e-52
Confortable, non ?
2. Affectation dans des variables. On veut calculer le nombre complexe, résultat de la formule :
x = a + j b2
avec a = 3, b = 6.5 et afficher le résultat. Tapez les lignes suivantes dans la console
In [1]: a = 3
In [2]: b = 6.5
In [3]: x = a+1j*(b**2)
In [4]: print x (ou In [4]: print(x) en python 3)
Out [4]: (3+42.25j)
In [5]: print "x =",x (ou In [5]: print("x =",x))
Out [5]: x = (3+42.25j)
In [6]: type(a), type(b),type(x)
Out [6]: (<type ’int’>, <type ’float’>, <type ’complex’>)
On ne distinguera pas les deux environnements par la suite. La syntaxe utilisée dans le fascicule sera celle de
python 3
(a) Première méthode, on appelle la bibliothèque par son nom puis on va chercher la fonction (ici la fonc-
tion sinus) :
>>> import numpy
>>> numpy.sin(0.1)
0.099833416646828155
(b) Deuxième méthode, on donne un surnom (ou alias) la bibliothèque pour alléger l’écriture :
>>> import numpy as np
>>> np.sin(0.1)
0.099833416646828155
On a choisi ici arbitrairement le surnom « np » mais « toto » pourrait tout aussi bien faire l’affaire.
(c) Troisième méthode, on importe directement la fonction recherchée de façon à enrichir le langage py-
thon initialement très limité :
>>> from numpy import sin
>>> sin(0.1)
0.099833416646828155
(d) Quatrième et dernière méthode (dite du « paresseux »), on importe toutes les fonctions de la biblio-
thèque en une seule fois
>>> from numpy import *
>>> sin(0.1), cos(2), log(4)
(0.099833416646828155, -0.41614683654714241, 1.3862943611198906)
Inconvénients :
si la bibliothèque est volumineuse cela augmente quelque peu la durée d’exécution et la mémoire
est inutilement surchargée
il peut y avoir conflit entre deux bibliothèques utilisant des fonctions différentes qui ont le même
nom (ça arrive !)
Tout bon programmeur un tant soit peu sérieux devrait donc éviter cette dernière méthode...
Avantage :
c’est tellement plus confortable...
Dans le cadre du cours Python :
on proscrira cette quatrième méthode, l’importation des modules se fera exclusivement en utilisant l’une
des trois premières méthodes. La quatrième méthode d’importation n’est donnée que dans un but de
compréhension de codes déjà rédigés qui l’utiliseraient.
from␣__future__␣import␣division
import␣numpy␣as␣np
import␣scipy␣as␣sc
import␣matplotlib.pyplot␣as␣plt
Python 3
#!␣/usr/bin/env␣python
#␣-*-␣coding:␣utf-8␣-*-
"""
Commentaires
"""
import␣numpy␣as␣np
import␣scipy␣as␣sc
import␣matplotlib.pyplot␣as␣plt
La seconde bibliothèque (pyplot) nous sera utile par la suite pour les représentations graphiques.
Vous ferez appel à ce programme modèle pour tout nouveau script python afin de vous épargner la mé-
morisation de ces lignes de code. Néanmoins vous placerez dans la zone « commentaires » un descriptif
concis mais explicite de ce que votre programme est sensé réaliser.
2. Créer alors un programme (lance_balle.py par exemple) calculant la position d’une balle lancée vers
le haut avec une vitesse initiale de 15 m.s−1 dans le champ de pesanteur terrestre à partir de son point de
lancé après : t = 1 s, t = 2 s et t = 5 s. On rappelle que l’équation horaire pour cette situation s’écrit
1
z = − g t 2 + v0 t
2
une liste peut donc être un ensemble de nombre (entier, réel ou complexe) ou bien une liste de n’importe quel
objet python : nombre, chaîne de caractères ou même d’autres listes 2 .
Un tableau (array) est, dans la bibliothèque numpy (la bibliothèque de base sur laquelle s’appuient les biblio-
thèques scipy et pyplot), une liste de nombres un peu particulière que l’on définira de la façon suivante :
>>> A = np.array([1,4,3.14])
>>> L = [5,pi/2]
>>> B = np.array(L)
>>> print (A,L,B)
[ 1. 4. 3.14] [5, 1.5707963267948966] [ 5. 1.57079633]
>>> type(A),type(L),type(B)
(<type ’numpy.ndarray’>, <type ’list’>, <type ’numpy.ndarray’>)
Attention cependant les 2 types sont différents et l’opérateur « + » ne produit pas le même effet comme on peut
le tester sur l’exemple suivant :
>>> L1 = [3,6,2]
>>> L2 = [8,14,4]
>>> L = L1+L2
>>> print (L)
[3, 6, 2, 8, 14, 4]
>>> A1 = np.array(L1)
>>> A2 = np.array(L2)
>>> A = A1+A2
>>> print (A)
[11 20 6]
L’opérateur « + » réalise la concaténation des listes tandis qu’il agit comme l’addition vectorielle sur les tableaux.
"En python 3, pour des raisons d’efficacité la nature de range(4,15,3) a été modifiée, la liste n’est plus
générée à l’appel de la fonction range mais au fur et à mesure (techniquement range() est désormais une
classe).
>>> L = range(4,15,3)
>>> print (L)
range(4,15,3)
3
>>> print (MM[0,:]) # ligne "zéro"
[1 2 3]
>>> print (MM[:,1]) # colonne "un"
[ 2 11 21]
Matrices et vecteurs Les tableaux numpy.array permettent d’effectuer de nombreuses opérations sur les
éléments qui les composent et sur leur structure (redimensionnement, découpage, ...), il est assez aisé de com-
prendre qu’à partir des tableaux numpy, on va pouvoir dériver des objets de type matrice et vecteur. Ces objets
apparaissent notés entre double crochets.
>>> a = np.array([1,2,3])
>>> print("a est un tableau à 1 dimension:",a)
a est un tableau : [1 2 3]
>>> m = np.mat(a)
>>> print("m est une matrice à 1 dimension (vecteur ligne):",m)
m est une matrice : [[1 2 3]]
Les matrices apparaissent comme des tableaux exclusivement bi-dimensionnels, il faut noter la syntaxe
particulière pour leur déclaration.
Remarque : Toutes les opérations s’appliquant aux matrices s’appliquant également aux tableaux dans un
cadre plus général (déterminant, inversion, transposition, diagonalisation, recherche de valeurs propres et
vecteurs propres....), le type matrice n’est pas nécessairement très utile et peut être aisément remplacé par
un objet de type array.
B Tracé de courbes
Exercice no 5 Premiers plots
B. TRACÉ DE COURBES 11
1. Utiliser les tableaux pour créer un programme de base permettant le tracé de courbes (on fait appel aux
fonctions plot() et show() de la bibliothèque matplotlib) :
Listing 1.1 – Code écrit pour python 2.7 (pour nous IDE Spyder)
#!/usr/bin/env␣python
#␣-*-␣coding:␣utf-8␣-*-
"""
Programme␣minimal␣de␣tracé␣d’une␣fonction
Python␣2.7
"""
from␣__future__␣import␣division
import␣numpy␣as␣np
import␣matplotlib.pyplot␣as␣plt
x␣=␣np.linspace(0,␣10,␣400)
y␣=␣np.sin(x)*np.exp(-x/5)
plt.plot(x,y,␣label=ur"fonction␣$\sin(x)*\exp(-x/5)$")
plt.legend()
plt.show()
Listing 1.2 – Code écrit pour python 3.x (pour nous IDE Pyzo)
#!/usr/bin/env␣python
#␣-*-␣coding:␣utf-8␣-*-
"""
Programme␣minimal␣de␣tracé␣d’une␣fonction
Python␣3.x
"""
import␣numpy␣as␣np
import␣matplotlib.pyplot␣as␣plt
x␣=␣np.linspace(0,␣10,␣400)
y␣=␣np.sin(x)*np.exp(-x/5)
plt.plot(x,y,␣label="fonction␣$\sin(x)*\exp(-x/5)$")
plt.legend()
plt.show()
"On notera les légères différences entre les codes écrits pour python 2.7 et python 3
On a déjà vu la différence dans l’écriture de la commande print() pour laquelles la mise entre
parenthèses des arguments est obligatoire en python 3.
La ligne from __future__ import division est inutile en python 3 puisque la division est par dé-
faut considérée comme réelle.
Le modifieur de chaine de caractère r ( qui apparaît ur"fonction $\sin(x)*\exp(-x/5)$") n’existe
pas en Python 3, l’interprétation des symboles mathématiques à la LATEXse fait par défaut.
Le modifieur de chaine de caractère u ( qui apparaît ur"fonction $\sin(x)*\exp(-x/5)$") pour le
codage des caractère Unicode (caractères accentuées par exemple) est inutile en Python 3. Contrai-
rement à r, le modifieur u ne génère pas d’erreur d’interprétation en Python 3.
2. Prenons l’exemple d’une molécule diatomique. L’énergie potentielle qui traduit l’interaction entre les deux
atomes est souvent modélisée par une fonction analytique appelée « potentiel de Morse » dont voici l’ex-
pression en fonction de la distance interatomique R :
£ ¤2
V (R) = D e 1 − exp(−β(R − R eq ))
Reproduire la courbe de Morse pour la cas de la molécule Cl2 (R eq = 0.198 nm, D e = 243 kJ.mol−1 , β =
20.0 nm−1 ).
Tracer sur la figure précédente les courbes représentant le potentiel de Morse des molécules F2 et I 2 carac-
térisées par les paramètres suivants :
— F2 : (R eq = 0.142 nm, D e = 150 kJ.mol−1 , β = 23.9 nm−1 )
— I2 : (R eq = 0.267 nm, D e = 148 kJ.mol−1 , β = 15.0 nm−1 )
Quelques indications :
le nom des axes est fixé grâce aux fonctions xlabel() et ylabel()
le titre est indiqué à l’aide de la fonction title()
les marqueurs de ligne sont donnés par : ’o’ pour les cercles, ’s’ pour les carrés (square), ’v’ pour les
triangles pointe vers le bas et ’^’ pour les triangles pointes vers le haut
on peut fixer le domaine de représentation graphique à l’aide de la fonction axis([xmin,xmax,ymin,ymax
]).
B. TRACÉ DE COURBES 13
Comme tout langage de programmation Python possède des structures de boucles et des structures condi-
tionnelles. Après un rapide survol de ces différentes structures, on traitera sur 3 exemples portant sur le domaine
de la spectroscopie.
A Rappels
A.1 Les boucles
Elles permettent d’effectuer de façon itérative une suite d’instructions dont la fin est programmée par un test
conditionnel. On a ainsi formellement
Faire (pour un itérateur prenant ces valeurs dans une liste) la suite d’instructions suivantes
" : on prendra garde de ne pas oublier les 2 points à la fin de liste for et d’indenter TOUTES les instructions
contenues dans la boucle.
Par exemple si on a la liste liste_particules = ["proton","neutron","quark","boson de Higgs"] on peut
afficher les différents éléments de cette liste à l’aide de la boucle for suivante :
for particule in liste_particules:
print particule
qui affichera
proton
neutron
quark
boson de Higgs
On peut ainsi facilement itérer sur des entiers en créant une liste d’entiers à l’aide de la fonction range(). Par
exemple
for n in range(4):
print n**3
14
A. RAPPELS 15
0
1
8
27
On peut de cette manière écrire la suite des cubes des 4 premiers entiers comme vu plus haut
n = 0 # initalisation du compteur
while (n<4):
print n**3
n = n+1
" : comme dans le cas des structure de boucles on n’oubliera pas les 2 points à la fin de la ligne du if ET du
else, ainsi que l’indentation (impérative) de TOUTES les instructions répondant à la condition logique.
Exemple : on veut savoir si un corps est un conducteur ou non. On pourra écrire le code suivant :
rho = 22e-9 # résistivité de l’or en Ohm.m
if (rho < 1.e-6):
print u"ce corps est un conducteur"
else:
print u"ce corps n’est pas un conducteur"
Si on reprend le cas de la résistivité d’un corps, on peut répondre à la question plus précise : s’agit-il d’un conduc-
teur, d’un semi-conducteur ou d’un isolant
rho = 2.5e-4 # résistivité intrinsèque du silicium en Ohm.m
if (rho < 1.e-6):
print u"ce corps est un conducteur"
elif (rho > 1.e-6 and rho < 1.e10):
print u"ce corps est un semi-conducteur"
else:
print u"ce corps est un isolant"
B Applications
B.1 Structures conditionnelles
Exercice no 6 Ondes électromagnétiques
On demande de réaliser un petit programme qui, après introduction de la longueur d’onde λ en nanomètre
d’une onde électromagnétique, permette à la demande de l’opérateur d’avoir ou bien la fréquence de l’onde cor-
respondante (en Hz ou MHz), ou bien le nombre d’onde σ = 1/λ ou enfin l’énergie du photon correspondant
E = hc/λ.
Le programme aura donc la structure suivante :
1. Entrer la longueur d’onde en nanomètre et la convertir en mètre
2. A la demande de l’opérateur entrer un caractère et choisir entre la fréquence "f", le nombre d’onde "s" et
l’énergie "e".
(a) si "f" demander à l’opérateur de choisir "h" (pour Hz) ou "mh" (pour MHz) et afficher le résultat dans
l’unité choisie.
(b) si "s" demander à l’opérateur de choisir "m" (pour m−1 ) ou "cm" (pour cm−1 ) et afficher le résultat dans
l’unité choisie.
(c) si "e" demander à l’opérateur de choisir "j" (pour Joule) ou "ev" (pour électron-volt) et afficher le
résultat dans l’unité choisie.
Indications :
la fonction raw_input() permet de rentrer de façon interactive une chaîne de caractère
la fonction float() convertit une chaîne de caractère en nombre (si cela a un sens bien sûr !)
attention lambda est un mot réservé du langage python.
on donne les valeurs numériques des constantes physiques :
— c = 3, 00.108 m.s−1 vitesse de la lumière dans le vide
— h = 6, 67.10−34 J.s−1 constante de Planck
— q e = 1.60.10−19 C charge élémentaire
mq e4 1
En = −
8ϵ20 h 2 n 2
B. APPLICATIONS 17
2. Écrire un programme qui donne toutes les longueurs possibles (en nanomètre) pour des transitions issues
du niveau p = 7.
On donne :
m = 9, 109 10−31 kg
h = 6, 626 10−34 J.s−1
ϵ0 = 8, 854 10−12 F.m−1
c = 2, 9979 108 m.s−1
q e = 1, 602 10−19 C
Depuis Galilée les sciences physiques se caractérisent par la confrontation entre une compréhension d’un
phénomène reposant sur un modèle mathématique et des données issues de l’expérience. Tout scientifique est
donc confronté un jour ou l’autre à la récupération de données expérimentales et à leur traitement afin de tester
la pertinence d’un modèle théorique.
Dans une première partie, on se propose de récupérer des données que l’on a stockées dans un fichier. Après
extraction de ces données, on effectue un affichage graphique de celles-ci.
La seconde partie consiste a appliquer un traitement mathématique (méthode des moindres carrés) afin d’ex-
traire les paramètres d’ajustement correspondant à une modélisation du phénomène physique étudié (ici une
simple régression linéaire).
Enfin dans une dernière partie on propose de montrer comment fabriquer un fichier de données directement
exploitable en python.
A Préparation
Exercice no 9 Récupération et affichage
Récupérez sur l’ENT le fichier dataMalus.dat qui contient les données d’une expérience visant à vérifier la
loi de Malus. Cette expérience consiste à vérifier qu’une lumière polarisée rectilignement traversant un analy-
seur faisant un angle α avec la polarisation initiale produit une intensité lumineuse proportionnelle au cosinus
de l’angle α. Dans l’expérience une photodiode fournit en sortie de l’analyseur, une tension U proportionnelle à
l’intensité lumineuse. Les données sont représentées dans le fichier sous la forme de deux colonnes correspon-
dant aux angles α et aux tensions U correspondantes. Une ligne d’en-tête permet d’identifier à quelle grandeur
physique se rapporte chaque colonne ainsi que les unités utilisées.
18
B. AJUSTEMENTS 19
1. Écrire un programme qui récupère les données du fichier dataMalus.dat, les convertit en réels (float),
puis les stocke dans des tableaux (array) qu’on pourra noter U et alpha , d’après le modèle suivant :
f = open("monFichierData.dat", ’r’)
f.readline() # on saute la première ligne si nécessaire (en-tête)
# itération sur le nombre de lignes
for ligne in f:
mots = ligne.split() # découpe la ligne en "mots"
x = float(mots[0]) # conversion du type "text" en type "float"
y = float(mots[1])
2. Tracer avec la fonction plot, le graphe U = f cos2 α (cf. figure 3.1a). On prendra soin de convertir les degrés
¡ ¢
en radians.
3. Rajouter un décalage systématique α0 sur les angles. Combien faut-il prendre pour que les données semblent
« bien alignées » ? Comment appelle-t-on ce type d’erreurs ?
4. Reprendre le tracé des données en rajoutant des barres d’erreurs (5% sur la mesure plus une erreur de
10 mV due au calibre) à l’aide de la fonction de matplotlib : errorbar, dont voici la syntaxe errorbar(x,
y, yer, fmt=’o’) (cf. figure 3.1b)
450 tension diode en fonction de l'intensité lumineuse 500 tension diode en fonction de l'intensité lumineuse
400
400
350
300 300
250
U en mV
U en mV
200
200
150 100
100
0
50
00.0 0.2 0.4 0.6 0.8 1.0 1000.0 0.2 0.4 0.6 0.8 1.0
cos2 α ou Intensité cos2 α ou Intensité
B Ajustements
On veut dans cette partie obtenir les paramètres d’une formule d’ajustement sur les données numériques (fit
en anglais) ; ajustement linéaire dans un premier temps, puis non-linéaire dans une seconde étape.
Ce qui donne
N Σx i y i − Σx i Σy i Σy i Σx i2 − Σx i Σx i y i
A= et B =
∆ ∆
avec ∆ = N Σx i2 − (Σx i )2 .
On suppose que tous les points y i sont soumis à la même loi de distribution dont on estime l’écart type à l’aide
de l’expression
1 X N £ ¤2
σ2y = y i − (Ax i + B )
N − 2 i =1
où popt est un vecteur qui renvoie les paramètres optimisés de la fonction et pcov est une matrice dont les
éléments diagonaux correspondent aux écarts type aux carrés (variances) de chacun des paramètres. Comparer
avec les résultats de votre programme précédent.
A B 1,2 2,5
1 1, 2 2, 5 1,4 3,25
2 1, 4 3, 25 ⇒ 1,44 4,56
3 1, 44 4, 56
Le fichier CSV créé n’est pas directement lisible par un code python puisque les réels ne seront pas recon-
nus comme tels. Afin de rendre le fichier exploitable, il faut transformer toutes les virgules décimales en points
décimaux. Cet exercice de conversion de format est malheureusement très fréquent lorsqu’on passe d’un envi-
ronnement logiciel à un autre.
Méthode automatique avec Python Les fichiers issus de tableurs et sauvegardés au format CSV sont comme
nous l’avons vu des fichiers textes (on peut les ouvrir avec Notepad++ sous Windows, gedit sous Linux, TextEdit
sous Mac).
Fichier CSV
Fichier Excel ou OpenOffice (séparateur ; et réels francisés)
Téléchargez sur l’ENT le fichier dataMalus.csv. Ecrire le code Python qui lit le fichier et convertit chaque
colonne en nombre du type de ceux sur lesquels on a travaillé au début du TP. Afin de comprendre le rôle de
chaque ligne, on imprimera à l’écran le contenu de chaque colonne à chaque étape de la transformation.
TD 4
É QUATIONS DIFFÉRENTIELLES
# Initialisations
alpha = 3
Nini = 1e3
tini = 0
tfin = 2
Npt = 30
t_tab = np.linspace(tini, tfin, Npt)
CI = Nini
23
24 TD 4. ÉQUATIONS DIFFÉRENTIELLES
1.6
1.4
1.2
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
# Initialisations
alpha = 3
yini = 1
tini = 0
tfin = 2
Npt = 20 # nombre de points sur l’axe des temps
t_tab = np.linspace(tini, tfin, Npt)
CI = np.array([yini]) #condition initiale
y = odeint(F, CI, t_tab)
plt.plot(t_tab, y, ’o’, label="solution numérique")
où les deux points (:) signifient que l’on récupère tous les éléments de ce tableau pour l’indice
correspondant.
(c) Tracé S (t ) et R (t ) en prenant comme conditions initiales S (0) = s 0 = 2 et R (0) = r 0 = 0.1 et pour para-
mètres a = 0.5 et c = 1.
Explorez le comportement des solutions en modifiant (un peu) les paramètres a et c.
26 TD 4. ÉQUATIONS DIFFÉRENTIELLES
2.0
1.0
0.5
0.00 10 20 30 40 50
temps
F IGURE 4.2 – Exemple d’évolution des populations de sardines et de requins pour les paramètres a = 0.5 et c = 1
k1 k2
A ⇌ B ⇌ C
k −1 k −2
k1 k2
A B C
→ →
Nous pouvons alors exprimer les lois de vitesse qui conduisent au système différentiel suivant :
d [A]
= −k 1 [A]
dt
d [B ]
= k 1 [A] − k 2 [B ]
dt
d [C ]
= k 2 [B ]
dt
La résolution de ces équations donne les relations suivantes :
³ ´
1 k2
On remarque également que la quantité [B ] passe par un maximum à : t m = k 2 −k 1 ln k1
Dans cette seconde partie du TD on se propose de résoudre le problème de cinétique chimique précédent
sans faire d’approximations et/ou d’hypothèses particulières. Il s’agit d’une résolution exacte par un traitement
numérique des équations.
Les conditions initiales sur les concentrations des trois espèces sont identiques au cas précédent (i.e. [A] =
[A]0 = 1, [B ] = [B ]0 = 0 et [C ] = [C ]0 = 0).
Soit le système différentiel :
d [A]
= k −1 [B ] − k 1 [A]
dt
d [B ]
= k 1 [A] − k 2 [B ] − k −1 [B ] + k −2 [C ]
dt
= k 1 [A] − (k 2 + k −1 )[B ] + k −2 [C ]
d [C ]
= k 2 [B ] − k −2 [C ]
dt
10 Chute d'une bille dans g uniforme 10 Chute d'une bille dans g uniforme avec frottement
solution numérique solution numérique
solution exacte 0 solution exacte
5 sans frottement
10
20
0
30
z (en m)
z (en m)
40
5
50
10 60
70
150.0 0.5 1.0 1.5 2.0 2.5 3.0 800 1 2 3 4 5
t (en s) t (en s)
2. Cette équation différentielle du deuxième ordre peut s’écrire comme un système d’équations différentielles
du premier ordre (
dz
dt = v
dv
dt = −g
Comme vu plus haut on définit les « vecteurs » suivants (tableaux en python) :
· ¸ · ¸
z v
Y = et F =
v −g
et on obtient l’équation formelle
dY
= F (Y , t )
dt
(a) Définir une fonction (au sens de python def F(Y,t) avec comme arguments le tableau Y et le temps t)
dans laquelle
on décompactera le tableau Y en deux sous-tableaux [z,v] = Y,
on construira ensuite les éléments du tableau F
F1 = v
F2 = -g
où les deux points (:) signifient que l’on récupère tous les éléments de ce tableau pour l’indice corres-
pondant.
(c) Tracer la solution numérique sous forme de points dans un plot superposé à la solution analytique
comme indiqué sur la figure (4.3a)
3. Reprendre le problème en ajoutant un frottement visqueux Fv = −αv dans le bilan des forces. On prendra
par exemple α = 0.5 kg.s−1 et on tracera sur le même graphe la solution numérique, la solution analytique
sans frottement et la solution analytique exacte avec frottement visqueux (à calculer !) comme indiqué sur
la figure (4.3b)
C. SYSTÈMES DU SECOND ORDRE 29
θ (en rd.s−1 )
0.00
0.05
0.10
0 1 2 3 4 5
t (en s)
Pendule (grands angles)
1.0 solution numérique
solution harmonique
0.5
θ (en rd.s−1 )
0.0
0.5
1.0
0 1 2 3 4 5
t (en s)
F IGURE 4.4 – Comparaison de la solution numérique de l’équation du pendule avec son approximation harmonique
Exercice no 19 Pendules
On considère un pendule simple c’est-à-dire un objet de masse m suffisamment petit pour être considéré
comme ponctuel que l’on accroche à un fil inextensible, de masse négligeable et de longueur L à un point fixe O.
1. Retrouver (par exemple à partir du théorème du moment cinétique) que l’angle θ que fait le pendule avec
la verticale obéit à l’équation différentielle
d 2θ
+ ω20 sin θ = 0
dt2
g
avec ω20 = L où g est l’accélération de la pesanteur. On a bien entendu négligé ici les frottements.
2. Résoudre numérique cette équation en suivant la méthode développée dans l’exercice précédent : trans-
formation de l’équation différentielle du second ordre en un système différentiel du premier ordre, puis
utilisation de la fonction odeint de scipy. On comparera cette solution numérique avec la solution har-
monique de l’équation numérique aux petits angles pour lesquels on peut utiliser l’approximation sin θ ≃ θ
(cf. figure 4.4).
3. On se place à présent dans le régime harmonique mais on rajoute une force de frottements visqueux.
θ̈ + 2λθ̇ + ω20 θ = 0
(b) Vérifier numériquement que l’on a bien les 3 régimes : pseudo-périodique si λ < ω0 , critique si λ = ω0
et sur-amorti si λ > ω0 (cf. figure 4.5)
30 TD 4. ÉQUATIONS DIFFÉRENTIELLES
0.00
0.05
0.10
0 1 2 3 4 5
t (en s)
F IGURE 4.5 – Les 3 régimes d’amortissement pour un oscillateur harmonique soumis à des frottements visqueux