Utilisation de python pour le calcul numérique
Résumé
L’objectif de ce TP est de découvrir quelques possibilités de python pour le calcul numérique. Il
pourra également vous servir de référence si vous avez besoin de faire du calcul numérique en TIPE.
Il existe trois librairies en python permettant de résoudre la plupart des problèmes numériques auxquels
on peut être confronté :
La librairie NumPy implémente des tableaux de données.
La librairie SciPy, qui s’appuie sur NumPy implémente de nombreuses fonctions de calcul numé-
rique (résolution d’équations, calcul d’intégrales, intégration d’équation différentielles, régression
linéaire, etc.)
La librairie matplotlib permet de tracer des graphes.
1 Rapide introduction aux tableaux
Recopier et exécuter les lignes de code ci-dessous.
1 import numpy as np
2 tablea u = np . array ( [ [ 0 , 1 , 2 ] ,
3 [ 1 , 2 , 3 ] ,
4 [ 4 , 6 , 1 2 ] ,
5 [ 4 4 , 5 5 , 5 6 ] ] )
6 n = tablea u [ 3 , 0 ]
7 c = tableau [ : , 0 ]
8print(n)
9print( c )
La ligne 1 permet d’importer la librairie NumPy qui contient de nombreuses fonctions permettant de
travailler avec des tableaux. À la ligne 2, on appelle ainsi la fonction array de NumPy sous la forme
np.array.Bfrom numpy
import * importe
toutes les fonctions
de la libraire, ce
qui peut ralentir
le programme. De
plus, si une fonc-
tion array avait
déjà été définie, elle
est écrasée.
Il existe deux autres manières d’importer une librairie :
import numpy, on appelle alors la fonction array avec : numpy.array,
from numpy import *, on appelle alors directement la fonction array avec : array.
Déterminer la syntaxe permettant d’afficher le nombre en quatrième ligne et deuxième colonne du
tableau (55) et celle permettant d’afficher la troisième ligne du tableau (qui contient 4, 6, 12).
Deux fonctions de NumPy sont utiles pour la suite : arange et linspace.
Que fait le code ci-dessous?
1 tableau_1 = np . arange ( 1 , 1 0 , . 3 )
2print(tableau_1)
3 tableau_2 = np . l i n s p a c e ( 1 , 10 , 15 )
4print(tableau_2)
O
θ l
m
g
Nous allons nous intéresser dans la suite au mouvement d’un pendule simple : une bille M de masse m
est suspendue à une tige rigide OM de longueur let de masse négligeable. Le pendule est libre d’osciller
dans le champ de pesanteur terrestre
g(g= 9,81 m·s2).
2 Résolution de systèmes d’équations linéaires avec NumPy
Le code ci-dessous résout le système d’équations :
x+ 2y= 3
3x4y= 1
1
1 systeme = np . array ( [ [ 1 , 2 ] ,
2 [3 , 4 ]] )
3 val e ur = np . array ( [ [ 3 ] ,
4 [1]])
5 s ol = np . l i n a l g . so lv e ( systeme , va leu r )
6print("x=" , s o l [ 0 , 0 ] , "ety=" , s o l [ 1 , 0 ] )
En présence de frottements importants, on peut montrer que le mouvement du pendule est donné par
θ(t) = Aer1t+Ber2t
Si l’on lâche le pendule d’un angle θ0sans vitesse initiale, A et B sont alors solutions du système :
A+B=θ0
r1A+r2B= 0
On donne r1=0,316 s1et r2=31,0s1. Déterminer les valeurs numériques de A et B pour
θ0= 0,2rad.
3 Résolution d’équations avec SciPy et matplotlib
3.1 Cas d’une solution unique
La fonction brentq contenue dans la librairie SciPy permet de déterminer numériquement les racines
d’une équation quelconque, on peut s’en servir pour résoudre une équation de la forme f(x)=0. Le code
ci-dessous résout l’équation (ln x)x= 3, soit (ln x)x3=0.BIl est im-
portant lorsqu’on
utilise SciPy de
travailler avec les
fonctions usuelles
(sin,ln, etc.) de
NumPy ou de
SciPy, conçues
pour travailler avec
des tableaux. Il ne
faut surtout pas
utiliser celles de
la librairie math
vue dans un TP
précédent qui ne
sont pas conçues
pour travailler avec
des tableaux et
peuvent mener à
des résultats faux.
C’est pour cela
qu’on utilise from
scipy import *.
1 from sci py import #Pour utiliser les fonctions mathématiques de scipy
2 from sci py . optimize import brentq #Pour utiliser directement brentq
3def f ( x ) :
4return log ( x)x3
5 s o l = brentq ( f , 1 , 10 0)
6print("racine pourx=" , s o l )
L’instruction from scipy import * permet d’importer toutes les fonctions de SciPy, entre autres les
fonctions usuelles comme log, qui correspond au logarithme népérien (log10 correspond au logarithme
en base 10), ainsi que toutes les fonctions de la librairie NumPy qui est incluse dans SciPy.
La documentation de la fonction brentq sur le site internet de scipy précise son mode d’emploi.
D’après la documentation, quelle est la signification des trois arguments de la fonction brentq ?
Revenons au pendule, on veut déterminer l’instant tpour lequel θ(t)vaut θ0= 0,1rad. Dans le cas
général, l’équation θ0=Aer1t+Ber2tn’a pas de solution analytique : on doit la résoudre numériquement.
Adapter le code proposé pour déterminer l’instant pour lequel θ(t)vaut θ0= 0,1rad. (Utiliser les
valeurs de A et B déterminées précédemment).
3.2 Cas de solutions multiples
Quand une équation a plusieurs solutions sur un domaine donné, brentq n’en retourne qu’une seule,
qui dépend des paramètres de l’algorithme de résolution. Pour déterminer les différentes solutions d’une
équation, on peut s’appuyer sur une étude graphique de la fonction associée.
Le code ci-dessous trace l’allure de sin x+x2pour x[0,2] :
1 from sci py import
2 import m at p l ot l i b . pyp lo t as p l t #Permet de tracer des graphes
3 x = l i n s p a c e ( 0 , 2 , 50 )
4 y = s in ( x) + x2
5 p l t . p l ot ( x , y )
6 p l t . show ( )
Revenons au pendule, si l’amortissement n’est pas trop important, il oscille et son mouvement est de
la forme θ(t) = θmet/τ cos(ωt +ϕ). On s’intéresse à un cas particulier où θm= 0,2rad, τ= 3 s,
ω= 3 rad ·s1et ϕ= 0.
2 TP Informatique - Python
Lycée Montesquieu
Tracer l’allure de θ(t)pour les premières oscillations.
On veut déterminer les trois plus petits instants positifs t1,t2et t3pour lesquels θvaut 0,05 rad.
Déterminer grossièrement à l’aide du graphe les intervalles dans lesquels sont contenus t1,t2et t3et
déterminer précisément leurs valeurs à l’aide de la fonction brentq.
4 Résolution d’équations différentielles avec SciPy
4.1 Résolution d’équations différentielles du premier ordre
SciPy permet d’intégrer (de résoudre) numériquement des équations différentielles. Le code ci-dessous
permet de résoudre l’équation différentielle du premier ordre suivante : y0=y·sin(y) + sin(x)avec
y(x= 0) = 2.
1 from sci py import
2 from s ci p y . i n t e g r a t e import o de int #Pour résoudre lé quation diffé rentielle
3 import m a t pl o t li b . p yp lot as p l t #Permet de tracer des graphes
4
5def der iv (y , x ) :
6return ysi n (y ) + s in ( x)
7
8#Choix de lintervalle dintégration
9 x0 = 0
10 xmax = 20
11 npoi nts = 1000
12 x = l i n s p a c e ( x0 , xmax , np oi nt s )
13
14 #Condition initiale
15 y0 = 2 # y(x0) = y0
16
17 s o l u t i o n = o de in t ( der iv , y0 , x )
18
19 y = s o l u t i o n [ : , 0 ]
20
21 p l t . p l ot ( x , y )
22 p l t . show ( )
On coupe la tige du pendule lorsqu’il est au repos. La bille de masse m= 2,0×102kg, en polystyrène,
subit alors une chute verticale sans vitesse initiale. En plus de son poids, elle subit un force de frottements
de la forme
f=αv
v, avec α= 3 ×102kg ·m1. En utilisant les lois de la mécanique, on montre
que la vitesse vérifie l’équation différentielle :
dv
dt=gα
mv2.(1)
Adapter le code précédent pour tracer l’évolution de la vitesse de la bille sur les 4 premières secondes
de sa chute. Estimer le temps au bout duquel la bille atteint sa vitesse limite.
4.2 Résolution d’équations différentielles du deuxième ordre
On attache à nouveau la bille au pendule. En l’absence de frottements, les oscillations du pendule vérifient
l’équation différentielle : ¨
θ+ω2
0sin θ= 0 (2)
On prendra dans toute la suite ω0= 3 rad ·s1.
Dans le cas des petits angles θ1, on a sin θ'θ, et l’on retrouve l’équation différentielle d’un oscillateur
harmonique : ¨
θ+ω2
0θ= 0 (3)
L’équation 2n’a pas de solutions analytiques, on se propose donc de l’intégrer avec SciPy pour comparer
ses solutions à celles de l’équation 3. On prendra comme conditions initiales θ(t=0)=0,1rad et
˙
θ(t= 0) = 0.
TP Informatique - Python
Lycée Montesquieu
3
Les algorithmes d’intégration numérique dont on dispose ne permettent d’intégrer que des équations
différentielles du premier ordre.
Pour intégrer une équation différentielle du deuxième ordre, il faut la convertir en un système de deux
équations différentielles du premier ordre. On pose θp=˙
θ, alors ˙
θp=¨
θ.
L’équation 3est équivalente au système d’équations du premier ordre :
˙
θ=θp
˙
θp=ω2
0θ(4)
Ce système d’équations peut se résoudre avec SciPy à l’aide du code ci-dessous :
1 from s c ipy import
2 from s c ip y . i n t e g r a t e import od ei nt
3
4 omega0 = 3# rad/s
5
6def de r iv (TH, t ) :
7# prend comme arguments :
8# TH : une liste contenant theta et thetap
9# t : un instant donné
10 # retourne la liste : [ thetap ,-omega **2* theta]
11 theta = TH[ 0 ]
12 thetap = TH[ 1 ]
13 return [ thetap ,omega02theta ]
14
15 #définition de lintervalle de temps
16 t0 = 0
17 tmax = 15
18 npo i nts = 1000
19 t = l i n s p a c e ( t0 , tmax , n po in ts )
20
21 #Définition des conditions initiales
22 theta0 = . 1 #rad
23 thetap0 = 0#rad/s
24 c i = [ theta0 , thetap0 ]
25
26 s o l u t i o n = o de in t ( der iv , ci , t ) #la ré solution proprement dite
27
28 th et a = s o l u t i o n [ : , 0 ]
29 t heta p = s o l u t i o n [ : , 1 ]
Recopier le code proposé et le compléter pour tracer l’allure de θ(t)pendant les 15 premières secondes
des oscillations à l’aide de matplotlib.
Modifier le code pour calculer la solution de l’équation différentielle non linéaire (équation 2) avec les
mêmes conditions initiales et pour tracer sur un même graphe les solutions des deux équations différen-
tielles. Y a-t-il une différence importante entre les deux solutions ?
Choisir des conditions initiales correspondant à un lâcher avec un angle initial θ0de 90˚, puis avec
un angle proche de 170˚. Comparer les solutions de l’équation non-linéaire (équation 2) et de l’équation
linéarisée (équation 3) dans les deux cas.
La librairie SciPy définit une variable pi qui contient la valeur de π.
Que se passe-t-il si l’on résout l’équation non-linéaire (équation 2) avec la condition initiale theta0 =
pi ? Avec la condition initiale theta0 = 3.14159 ? Comparer à la solution exacte de l’équation différen-
tielle pour θ0=π.
5 Calcul d’intégrales avec SciPy
Bien que l’équation différentielle 2n’ait pas de solution analytique, il est possible de déterminer une
expression théorique de la période Tdu pendule. On peut montrer que :
T=22
ω0Zθ0
θ=0
dθ
cos θcos θ0
(5)
4 TP Informatique - Python
Lycée Montesquieu
Cette intégrale n’a pas d’expression analytique simple. On se propose de la calculer numériquement avec
python. On pourra prendre ω0= 3 rad ·s1.
L’exemple ci-dessous, tiré de la documentation de la fonction quad sur internet montre comment calculer
l’intégrale : R4
0x2dx.
1 from s c ip y . i n t e g r a t e import quad
2def f ( x ) :
3return x2
4 i n t e g r a l e , e rr e u r = quad ( f , 0 , 4 )
5print(integrale)
Adapter l’exemple proposé et calculer la période Tdes oscillations pour θ0= 0,1rad, pour θ0= 3 rad.
Comparer les résultats obtenus aux valeurs qu’on obtient pour le cas linéarisé (équation 3) : T=2π
ω0
.
6 Fonctions spéciales
Au lieu de calculer numériquement l’intégrale, on aurait pu continuer un peu le calcul 1et s’apercevoir
qu’on peut aussi écrire :
T=4
ω0Zπ/2
φ=0
dφ
p1k2sin2φ=4
ω0
Kk2,avec k= sin θ0
2(6)
où K est une fonction spéciale, appelée intégrale elliptique complète de première espèce (ou complete
elliptic integral of the first kind).
L’avantage d’utiliser cette formule est que les fonctions spéciales comme celle-ci sont définies dans SciPy.
L’implémentation de SciPy est généralement meilleure (plus rapide, plus précise, etc.) que celle qu’on
pourrait proposer, on a tout intérêt à l’utiliser.
Utiliser la documentation de SciPy pour trouver la fonction correspondant à K et calculer la valeur de
Tpour θ0= 0,1rad et θ0= 3 rad. Comparer le résultat au calcul de l’intégrale.
7 Pour aller plus loin
Tracer la courbe donnant la période Tdes oscillations du pendule simple en fonction de l’angle initial
θ0.
Il existe une formule approchée donnant la période du pendule meilleure que la formule pour les petites
oscillations (T=2π
ω0
). Il s’agit de la formule de Borda :
T'2π
ω01 + θ2
0
16.(7)
Compléter le graphe précédent avec la période donnée par la formule de Borda.
Écrire une fonction borda_juste(p) qui retourne l’angle θmax tel que la formule de Borda donne le
vrai résultat à moins de ppourcent près pour θ < θmax .
1. On peut passer de la première intégrale à la deuxième en remarquant que cos θ= 1 2 sin2(θ/2), puis en posant
k= sin(θ0/2) et en introduisant φtel que ksin φ= sin(θ/2).
TP Informatique - Python
Lycée Montesquieu
5
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !