La boˆıte `a outils de la ´ PHYSIQUE NUMERIQUE Licence de physique L3 Physique fondamentale et PHYTEM Universit´e Pierre et Marie Curie Paris-6
—
ENS-Cachan
Ph. Depondt1 Ann´ee 2008-2009
1
INSP (Institut des NanoSciences de Paris), CNRS UMR 7588 & Universit´e P. et M. Curie Paris-6. Contact :
[email protected]
2
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Table des mati` eres 1 Introduction 1.1 Des m´ethodes num´eriques, pour quoi 1.1.1 Quelques jalons. . . . . . . . . 1.1.2 . . . et quelques exemples. . . 1.2 Plan succinct. . . . . . . . . . . . . .
faire ? . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
2 Notions pratiques de FORTRAN95. 2.1 Qu’est-ce qu’un langage de programmation ? . . . . . . . . . . 2.2 Notions ´el´ementaires. . . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Instructions. . . . . . . . . . . . . . . . . . . . . . . . 2.2.2 D´eclarations. . . . . . . . . . . . . . . . . . . . . . . . 2.2.3 Op´erations ´el´ementaires sur les nombres. . . . . . . . . 2.3 Premi`eres boucles. . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Pour quoi faire ? . . . . . . . . . . . . . . . . . . . . . 2.3.2 Pratiquement. . . . . . . . . . . . . . . . . . . . . . . . 2.3.3 Boucles imbriqu´ees . . . . . . . . . . . . . . . . . . . . 2.3.4 Boucles munies d’un nom . . . . . . . . . . . . . . . . 2.4 Conditions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 Entr´ees-sorties. . . . . . . . . . . . . . . . . . . . . . . . . . . ´ 2.5.1 Ecran et clavier. . . . . . . . . . . . . . . . . . . . . . 2.5.2 Les fichiers. . . . . . . . . . . . . . . . . . . . . . . . . 2.5.3 Les formats. . . . . . . . . . . . . . . . . . . . . . . . . 2.6 Les fonctions intrins`eques. . . . . . . . . . . . . . . . . . . . . 2.7 Autres boucles. . . . . . . . . . . . . . . . . . . . . . . . . . . 2.7.1 do while . . . . . . . . . . . . . . . . . . . . . . . . . 2.7.2 Boucles infinies : exit et cycle. . . . . . . . . . . . . 2.7.3 Boucles implicites. . . . . . . . . . . . . . . . . . . . . 2.8 Tableaux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.8.1 D´eclaration . . . . . . . . . . . . . . . . . . . . . . . . 2.8.2 Manipulation globale de tableaux . . . . . . . . . . . . 2.8.3 Fonctions intrins`eques et tableaux . . . . . . . . . . . 2.8.4 Allocation dynamique de m´emoire . . . . . . . . . . . 2.9 Fonctions et sous-programmes. . . . . . . . . . . . . . . . . . 2.9.1 Les function. . . . . . . . . . . . . . . . . . . . . . . 2.9.2 Et les subroutine. . . . . . . . . . . . . . . . . . . . . 2.9.3 L’intention . . . . . . . . . . . . . . . . . . . . . . . . 2.9.4 La mise en commun de variables. . . . . . . . . . . . . 2.9.5 Mettre un nom de sous-programme comme argument. 2.9.6 Les biblioth`eques. . . . . . . . . . . . . . . . . . . . . 2.10 Les commentaires. . . . . . . . . . . . . . . . . . . . . . . . . 2.11 Une instruction sur plusieurs lignes. . . . . . . . . . . . . . . 2.12 Les chaˆınes de caract`eres. . . . . . . . . . . . . . . . . . . . . 2.12.1 D´eclaration . . . . . . . . . . . . . . . . . . . . . . . . 2.12.2 Op´erations sur les chaˆınes . . . . . . . . . . . . . . . . 2.12.3 Conversion chaˆıne ⇔ nombres . . . . . . . . . . . . . . 2.13 D´etection de fin de fichier. . . . . . . . . . . . . . . . . . . . . 2.14 FORTRAN77-90-95 : filiation et diff´erences. . . . . . . . . . . 2.14.1 kind . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.14.2 Interfaces. . . . . . . . . . . . . . . . . . . . . . . . . . 2.14.3 Objets de type d´eriv´e. . . . . . . . . . . . . . . . . . . 2.14.4 Pointeurs. . . . . . . . . . . . . . . . . . . . . . . . . . 3
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . .
7 8 8 10 13
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15 15 17 17 19 20 20 20 21 21 21 21 23 23 23 24 25 25 25 25 26 26 26 27 28 29 30 30 31 31 31 32 32 33 34 34 34 34 34 35 35 36 36 37 38
4
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
2.14.5 R´ecursivit´e. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Un prototype de TP 3.1 Introduction. . . . . . . . . . . . . . . . 3.2 L’´equation logistique. . . . . . . . . . . . 3.2.1 De la multiplication des insectes. ´ 3.2.2 Etude pr´ealable. . . . . . . . . . ´ 3.2.3 Etude num´erique. . . . . . . . .
38
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
41 41 41 41 41 42
4 M´ ethodes num´ eriques. 4.1 Recherche des z´eros d’une fonction. . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 M´ethode de la dichotomie. . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2 M´ethode de Newton. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.3 Comment s’y prendre ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Repr´esentation des nombres dans un ordinateur. . . . . . . . . . . . . . . . . 4.2.1 Les nombres entiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2 Les nombres r´eels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3 Cons´equence. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Suites et s´eries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1 G´en´eralit´es et premi`eres difficult´es. . . . . . . . . . . . . . . . . . . . . 4.3.2 Calcul des int´egrales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ´ 4.4 Echantillonnages, interpolation. . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.1 Interpolation lin´eaire. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.2 Approximation parabolique. . . . . . . . . . . . . . . . . . . . . . . . . 4.4.3 Polynˆ omes de Lagrange. . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.4 D´eriv´ees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5 Alg`ebre lin´eaire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.1 Un exemple : la diffusion de la chaleur `a une dimension. . . . . . . . . 4.5.2 Syst`emes d’´equations lin´eaires. . . . . . . . . . . . . . . . . . . . . . . 4.5.3 Une g´en´eralisation de la m´ethode de Newton `a plusieurs dimensions. . 4.5.4 Probl`emes de vecteurs propres et de valeurs propres ou eigenproblems. 4.6 Probl`emes autocoh´erents. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6.1 Qu’est-ce donc ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6.2 Formulation g´en´erale. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6.3 Est-ce que c¸a converge ? . . . . . . . . . . . . . . . . . . . . . . . . . . 4.7 Recherche des minima d’une fonction. . . . . . . . . . . . . . . . . . . . . . . 4.7.1 Du mouvement des amibes (m´ethode du simplex). . . . . . . . . . . . 4.7.2 M´ethode de Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.7.3 Recherche ` a une dimension : interpolation parabolique. . . . . . . . . 4.7.4 M´ethode du gradient conjugu´e. . . . . . . . . . . . . . . . . . . . . . . 4.7.5 Minimisation avec contrainte : les multiplicateurs de Lagrange. . . . . 4.8 Mod´elisation de donn´ees exp´erimentales. . . . . . . . . . . . . . . . . . . . . . 4.8.1 Donn´ees et moindres carr´es. . . . . . . . . . . . . . . . . . . . . . . . . 4.8.2 Ajustement d’une fonction lin´eaire. . . . . . . . . . . . . . . . . . . . . 4.8.3 Ajustement d’un polynˆ ome. . . . . . . . . . . . . . . . . . . . . . . . . 4.8.4 D´eriv´ee locale d’une courbe exp´erimentale. . . . . . . . . . . . . . . . 4.8.5 Lissage : a dirty trick ! . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.8.6 Ajustement non-lin´eaire. . . . . . . . . . . . . . . . . . . . . . . . . . . 4.9 Syst`emes d’´equations diff´erentielles ordinaires. . . . . . . . . . . . . . . . . . . 4.9.1 Un exemple : les lignes de champ. . . . . . . . . . . . . . . . . . . . . 4.9.2 La m´ethode d’Euler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.9.3 La m´ethode d’Euler « am´elior´ee » ou m´ethode de Heun. . . . . . . . . 4.9.4 La m´ethode de Runge-Kutta d’ordre 4. . . . . . . . . . . . . . . . . . 4.9.5 La m´ethode de Cranck et Nicholson . . . . . . . . . . . . . . . . . . . ´ 4.9.6 Equations d’ordre sup´erieur ` a 1. . . . . . . . . . . . . . . . . . . . . . 4.9.7 M´ethode de Verlet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.9.8 Le probl`eme du pas d’int´egration. . . . . . . . . . . . . . . . . . . . . 4.9.9 Quelle m´ethode choisir ? . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10 Transform´ees de Fourier rapides. . . . . . . . . . . . . . . . . . . . . . . . . . 4.10.1 La transform´ee de Fourier en physique. . . . . . . . . . . . . . . . . . 4.10.2 La transform´ee de Fourier discr`ete. . . . . . . . . . . . . . . . . . . . . 4.10.3 Filtrage de donn´ees exp´erimentales. . . . . . . . . . . . . . . . . . . . 4.11 Les m´ethodes de Monte-Carlo. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45 45 45 46 48 48 48 49 49 49 49 50 53 54 54 55 55 55 55 56 58 59 61 61 61 62 62 63 63 63 64 65 66 66 67 68 69 69 70 71 71 72 72 73 74 74 75 75 76 78 78 84 86 86
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
5
Physique num´erique, Philippe Depondt
4.11.1 4.11.2 4.11.3 4.11.4 4.11.5 4.11.6 4.11.7 4.12 Le tri.
Processus stochastiques et chaˆınes de Markov. . . . . . . . . Les vicissitudes de π. . . . . . . . . . . . . . . . . . . . . . . . La production de nombres « al´eatoires ». . . . . . . . . . . . Obtenir une distribution autre qu’uniforme. . . . . . . . . . . Int´egration multidimensionnelle sur des domaines compliqu´es. Simulation de Monte-Carlo-Metropolis. . . . . . . . . . . . . Recherche du minimum d’une fonction : le recuit simul´e. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5 Introduction ` a la simulation num´ erique 5.1 Pourquoi la Simulation num´erique ? . . . . . . . 5.2 La mati`ere consid´er´ee comme un milieu continu. 5.2.1 Quels types de questions se pose-t-on ? . . 5.2.2 La m´ethode des diff´erences finies . . . . . 5.2.3 Les m´ethodes spectrales . . . . . . . . . . 5.2.4 Introduction aux ´el´ements finis . . . . . . 5.3 La mati`ere comme une collection de particules. . 5.3.1 Matrice dynamique . . . . . . . . . . . . . 5.3.2 Simulations Monte-Carlo. . . . . . . . . . 5.3.3 Simulations de dynamique mol´eculaire. . . 5.3.4 Simulations ab-initio. . . . . . . . . . . . 6 Optimisation de code. ´ 6.1 Eviter les calculs inutiles . . . . . . . 6.2 Utiliser les sym´etries. . . . . . . . . . 6.3 Stocker des r´esultats interm´ediaires. 6.4 Utilisation des caches . . . . . . . . . 6.5 Eviter les interruptions . . . . . . . . 6.6 Ne pas r´einventer ce qui existe d´ej` a.
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
86 87 87 88 89 92 94 95
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
97 97 97 97 98 103 104 105 105 110 110 111
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
115 115 115 116 116 117 117
et parall´ elisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
119 119 119 120 120
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
121 121 122 122 122 122 122 122 122 123 123 124 124 124 124 124 125
9 La question du calcul formel. 9.1 Calcul formel, calcul num´erique : quelle diff´erence ? . . . . . 9.2 Quelques exemples . . . . . . . . . . . . . . . . . . . . . . . 9.2.1 ax + b = 0 . . . . . . . . . . . . . . . . . . . . . . . . 9.2.2 Le gaz de Van der Waals . . . . . . . . . . . . . . . 9.2.3 Mod`ele de Brillouin-Weiss . . . . . . . . . . . . . . . 9.2.4 Le projectile . . . . . . . . . . . . . . . . . . . . . . 9.2.5 Une « grosse » simulation : les anneaux de Saturne. 9.3 Que peut-on en conclure ? . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
127 127 127 127 128 128 129 131 134
7 Calculs tr` es lourds : vectorisation 7.1 L’architecture vectorielle . . . . . 7.2 Parall`elisme . . . . . . . . . . . . 7.2.1 M´emoire partag´ee . . . . 7.2.2 M´emoire distribu´ee . . . .
. . . . . .
. . . . . .
. . . . . .
8 Quelques ´ el´ ements de C++ 8.1 Avant mˆeme de commencer . . . . . . . . 8.2 D´eclarations . . . . . . . . . . . . . . . . . 8.3 Structures de base diverses . . . . . . . . 8.3.1 Boucles . . . . . . . . . . . . . . . 8.3.2 Conditions . . . . . . . . . . . . . 8.3.3 Sauvegardes . . . . . . . . . . . . . 8.4 Tableaux . . . . . . . . . . . . . . . . . . 8.4.1 Tableaux de taille fixe . . . . . . . 8.4.2 Les pointeurs : premiers pas . . . . 8.4.3 Tableaux dynamiques . . . . . . . 8.5 Fonctions . . . . . . . . . . . . . . . . . . 8.5.1 Une fonction tr`es simple . . . . . . 8.5.2 Prototype . . . . . . . . . . . . . . 8.5.3 Passage d’arguments par valeur . . 8.5.4 Passage d’arguments par r´ef´erence 8.6 Les classes . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
6 10 Bibliographie.
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
135
Chapitre 1
Introduction tion d’irradiation de mat´eriaux divers ou r´egulation de la distribution d’´electricit´e ; les fabriquants de turbines qui cherchent `a optimiser leur fonctionnement simulent les ph´enom`enes tr`es complexes li´es aux instabilit´es dans les chambres de combustion. Il n’y a gu`ere de domaine qui ´echappe : mˆeme la finance recrute des scientifiques capables de mod´eliser sur ordinateur ! Un(e) physicien(e) de formation, que ce soit dans un environnement recherche ou industriel peut difficilement ignorer ce domaine dont l’importance est de plus en plus massive, mˆeme si il/elle n’est pas directement impliqu´e(e) dans des calculs l´egers ou lourds. L’´evolution fulgurante de la capacit´e de calcul disponible ne peut toutefois ˆetre utile et profitable que s’il y a des personnes comp´etentes pour s’en servir de fa¸con pertinente et donc convenablement form´ees : il s’agit l` a d’une double comp´etence `a la fois scientifique dans la discipline d’origine (physique, chimie, math´ematiques, science de la vie, etc.) et de simulation : « Some jog along with the technology while others lag behind 3 . . . ». Ce monde ´evolue rapidement et le but de ce cours est de fournir les bases et les d´emarches permettant de s’y rep´erer.
« Si vous pensez que le calcul num´erique, c’est l’affaire des autres, c’est qu’il est temps de vous recycler » : cette affirmation p´eremptoire, et volontairement provocatrice1 , est `a comprendre dans un contexte o` u le CEA, le CNRS, la Communaut´e Europ´eene et les grands industriels s’´equipent r´esolument de moyens de calcul toujours plus consid´erables. Le sigle HPC (High Performance Computing) jaillit un peu partout. . . On parle volontier, et le plus s´erieusement du monde, de PetaFlops 2 (sans forc´ement toujours tr`es bien comprendre de quoi il s’agit. . .). C’est sans doute que l’enjeu en paraˆıt important aux d´ecideurs (et aux payeurs) ` a la fois pour la recherche scientifique et pour la recherche et d´eveloppement (R & D) industriel. Les demandeurs de ce genre de calculs lourds voire tr`es lourds sont divers ; par exemple et dans le d´esordre : – La m´et´eorologie est l’un des utilisateurs civils les plus importants : les pr´evisions au quotidien bien sˆ ur, mais aussi les recherches sur le r´echauffement climatique, essayer d’en pr´evoir les cons´equences, voire trouver des rem`edes requi`erent des simulations tr`es ´elabor´ees des mouvements atmosph´eriques et des ´echanges chimiques et ´energ´etiques. – La mati`ere condens´ee, les mat´eriaux et les nanosciences en physique et en chimie offrent une vari´et´e incroyable de probl`emes mettant en jeu un grand nombre (entre quelques dizaines et le nombre d’Avogadro !) d’atomes : des calculs classiques ou quantiques, parfois assez simples, parfois tr`es lourds, sont mis en œuvre pour tenter de comprendre ou de pr´edire leurs propri´et´es. – Les sciences de la vie se pr´eoccupent, au niveau microscopique, de mol´ecules ´enormes, extraordinairement complexes. Des efforts consid´erables sont faits pour tenter de mod´eliser ces objets, avec des enjeux importants : repliement de proteines, cons´equences pour la maladie d’Alzheimer ou celle de Parkinson, drug design, etc. La g´enomique, de son cˆ ot´e, doit utiliser des bases de donn´ees colossales en utilisant des m´ethodes qui doivent ˆetre efficaces et n’ont rien de trivial. – Les sciences de l’ing´enieur sont aussi tr`es demandeuses. Les simulations a´erodynamiques permettent de pr´evoir et d’optimiser les caract`eristiques d’un avion avant mˆeme son premier vol ; un industriel comme EDF d´eveloppe des calculs souvent tr`es lourds dans des domaines d’une grande diversit´e : simula-
L’exp´erience tend `a montrer que ce cours de Physique num´erique surprend parfois un peu ceux `a qui il s’adresse. Il commence, en effet, par de la programmation et quelques notions d’Unix : serait-ce alors un « cours d’info », comme on l’entend souvent appeler ? Tr`es rapidement toutefois, apr`es quelques semaines, on ne parle plus, ou presque plus, d’informatique ou de programmation : c’est suppos´e acquis ; on parle de physique principalement, parfois orn´ee d’un peu de math´ematiques appliqu´ees. En outre, cette physique ne paraˆıt, parfois, gu`ere famili`ere `a des ´etudiants habitu´es `a r´esoudre des probl`emes dont la solution analytique est connue : c’est qu’ici, justement, l’objectif est de r´esoudre des probl`emes pour lesquels il n’y a pas de solution analytique, c’est-`a-dire l’immense majorit´e. . . L’informatique est alors pour nous un outil - qu’il faut bien sˆ ur maˆıtriser - pour s’attaquer `a des probl`emes de physiques vari´es. Le charme de cet enseignement, pour les enseignants mais aussi souhaitons-le pour ceux qui le re¸coivent, une fois - r´ep´etons-le - l’outil acquis, est qu’il ne se cantonne pas `a tel ou tel domaine de la physique, mais qu’il pioche ses exemples dans des champs aussi vari´es que possible, dans des questions souvent tr`es contemporaines, avec des approches parfois inattendues. Le pr´esent polycopi´e d´eborde assez largement le strict minimum n´ecessaire `a la r´eussite `a l’examen. . . c’est vo-
1 faite par un professeur de math´ ematiques a ` l’UPMC en introduction a ` un colloque intitul´ e Penser PetaFlops en mai 2008. 2 1015 floating point operations per second. La premi` ere machine « p´ etaflopique » a fonctionn´ e au printemps 2008. L’´ etape suivante est l’ExaFlops : 1018 flops. . .
3 « Certains accompagnent le peloton tandis que d’autres traˆ ınent derri` ere. »
7
8
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
lontaire : `a chacun de s´electionner ce qui lui paraˆıt utile, Un autre exemple, moins c´el`ebre sans doute, est les s´eances de travaux dirig´es et de travaux pratiques ´etant l’ensemble des op´erations qui, pendant la R´evolution de bons guides en la mati`ere4 . Fran¸caise, ont abouti `a la d´efinition du m`etre, en remplacement du maquis d’unit´es de l’Ancien R´egime, par un syst`eme uniforme et rationnel. On voulait que le m`etre fˆ ut 1.1 Des m´ ethodes num´ eriques, universel (on aurait certes put choisir comme r´ef´erence les unit´es en vigueur `a Paris, mais l’id´eal universaliste pour quoi faire ? des r´evolutionnaires l’interdisait) et l’on choisit ainsi une ut ˆetre commune `a toute l’humanit´e : la dix` titre de provocation, on pourrait dire que l’objet de ce r´ef´erence qui pˆ A millioni`eme partie du quart du m´eridien terrestre. Encore cours est de faire aussi peu d’informatique que possible. Il fallait-il en mesurer la longueur. . . On envoya donc deux s’agit plutˆ ot d’utiliser les ressources fournies par les ordimath´ematiciens-astronomes r´eput´es pour leur pr´ecision et nateurs pour tenter de traiter des probl`emes de physique le soin avec lequel ils menaient leurs observations (Jeanaussi vari´es que possible, afin, soit de se simplifier la vie Baptiste-Joseph Delambre (1749-1822) et Pierre-Fran¸coiset gagner du temps en faisant faire par un ordinateur des Andr´e M´echain (1744-1804)) ´equip´es des instruments de calculs fastidieux que l’on pourrait sans doute faire soivis´ee les plus ´elabor´es, mesurer entre Dunkerque et Barmˆeme, soit au contraire de s’attaquer ` a des questions que celone la longueur de l’arc de m´eridien de Paris : en l’on ne pourrait en aucun cas traiter avec une feuille de d´eterminant tr`es pr´ecis´ement la latitude des deux villes papier et un crayon. . . Nous chercherons ainsi dans divers ´ (` a partir de la hauteur de l’Etoile Polaire et de quelques domaines de la physique des probl`emes, de pr´ef´erence peu autres) on en d´eduirait ais´ement la longueur du m´eridien susceptibles d’une solution analytique, afin de les traiter complet. num´eriquement `a l’aide d’un calcul sur ordinateur, l’obIl fallait donc ´etablir un r´eseau de triangles qui recouvre jectif ´etant d’apprendre comment aborder une question de compl´ etement l’arc de m´eridien compris entre les deux fa¸con qu’un calcul permette d’y r´epondre de mani`ere savilles, mesurer avec une pr´ecision m´eticuleuse les angles tisfaisante, quitte `a la reformuler au passage pour la faire aux sommets de tous ces triangles afin d’en calculer la entrer dans un cadre propice ` a ce genre de traitement. longueur des cˆ ot´es, puis par trigonom´etrie, la longueur de l’arc. Cette ´epop´ee (racont´ee par Ken Alder dans The mea1.1.1 Quelques jalons. . . sure of all things, Free Press (2002)) dura sept ans (17921799) dans une France en proie `a toutes sortes de vioIl ne faut cependant pas croire que les calculs num´e- lences (les invasions, les guerres r´evolutionnaires, la Terriques aient attendu l’invention de l’ordinateur pour voir reur, Thermidor. . .) : dans les jours qui suivirent la fuite le jour. Au XVIIe si`ecle d´ej` a, l’invention des logarithmes de Louis XVI `a Varennes, Delambre avec son attirail de par John Napier (1550-1616) fut une r´evolution (Miri- longue-vues et d’instruments, et, pire encore, son ordre de fici logarithmorum canoni descriptio, Edimbourg (1614)) : mission sign´e par le roi fugitif, fut arrˆet´e `a plusieurs reune multiplication se transformait en addition -beaucoup prises comme « espion » ; un peu plus tard, M´echain resta plus ais´ee-, une extraction de racine carr´ee en division bloqu´e en Catalogne quand l’Espagne bourbonnienne et par deux ! L’astronome Johannes Kepler (1571-1630) qui la France r´epublicaine se trouv`erent en guerre ; M´echain d´ecouvrit l’ellipticit´e des orbes plan´etaires, se livra `a dut aussi lutter en permanence contre un ´etat psycholodes calculs num´eriques vertigineux dans, par exemple, gique d´epressif li´e `a son inqui´etude quant `a la qualit´e de son œuvre principale, l’Astronomie Nouvelle (Astronomia ses mesures. Les deux hommes revinrent enfin `a Paris en Nova, (1609) ). Ainsi, par exemple, pour ´evaluer les posi- 1799 pour pr´esenter leurs r´esultats : une conf´erence intertions au cours du temps d’une plan`ete alors qu’elle parnationale de math´ematiciens devait : 1o v´erifier et valider court ce qui n’est encore qu’un « ovo¨ıde » avec une vitesse la coh´erence de leurs observations, et 2o en d´eduire la lonvariable5 , il divise la trajectoire en 360 petits segments gueur du m`etre. et additionne les r´esultats obtenus pour chaque segment : Il fallait donc, pour la deuxi`eme partie de ce travail, faire c’est ce que l’on appelle maintenant une discr´etisation. des calculs de trigonom´etrie sur une surface sph´erique. Kepler, lui, appelait cela un « morcellement num´erique » On savait cependant qu’outre les montagnes dont il falet se plaignait de ce que ce calcul fˆ ut « m´ecanique et enlait bien sˆ u r tenir compte, la Terre n’´etait pas une sph`ere nuyeux » : comme son employeur, l’empereur Rudolf II., parfaite mais plutˆ ot un ellipso¨ıde de r´evolution l´eg`erement ne payait son salaire qu’occasionnellement, il n’avait pas applati aux pˆ o les : toutefois, le choix d’un arc de m´eridien les moyens d’employer lui-mˆeme un assistant pour l’aisitu´ e a ` des latitudes interm´ediaires (le 45˚ parall`ele passe der. . . Il connaissait d’ailleurs les tables de logarithmes de a ` Bordeaux et donc coupe l’arc Dunkerque-Barcelone non Napier et en ´etablit lui-mˆeme dans ses Tables Rodolphines loin de son milieu) permettait d’esp´erer obtenir une va(Tabulæ Rudolphinæ, (1627) ). leur moyenne qui pˆ ut servir de r´ef´erence. On fit alors une 4 Le chapitre 5, en particulier doit ˆ ecouverte compl´etement inattendue : le g´eo¨ıde n’´etait pas etre consid´ er´ e comme la suite d´ logique du cours, mais n’en fait a ` proprement parler partie. r´egulier mais recouvert de bosses et de creux. La valeur 5 Jusqu’alors, on croyait, Copernic, Tycho Brahe et Galil´ ee y comdu rayon de courbure de la surface terrestre d´ependait de pris, que les mouvements plan´ etaires ´ etaient des mouvements ciru il ´etait mesur´e, or la pr´ecision magnifique des culaires uniformes, ou des combinaisons de mouvements circulaires l’endroit o` echain, le soin m´eticuleux uniformes, ce qui permettait un calcul facile des positions plan´ etaires observations de Delambre et M´ futures. Kepler, comme on le sait, introduisit, a ` cause d’un d´ esaccord -voire obsessionnel dans le cas de M´ echain- avec lequel de 8 minutes d’angle dans la position de Mars, les orbes, d’abord elles avaient ´et´e r´ealis´ees ne permettaient pas de mettre ce ovo¨ıdes puis elliptiques, parcourues a ` vitesse variable ; les pr´ edictions esultat sur le compte d’erreurs ou d’impr´ecisions de meen devenaient beaucoup plus difficiles : il fallut attendre Newton pour r´ voir la r´ esolution de ce probl` eme. sure. Apr`es de longues tergiversations, on finit n´eanmoins
9
Physique num´erique, Philippe Depondt
Curseur transparent
Réglette
a
Graduations logarithmiques
b a.b
Fig. 1.1 – La r`egle `a calcul, h´eriti`ere des tables de logarithmes de John Napier, en usage jusqu’` a la fin des ann´ees 1970. La r´eglette pouvait coulisser dans une gorge am´enag´ee dans la r`egle et le curseur pouvait glisser sur l’ensemble. Pour faire le produit de deux nombres a et b (par exemple pour convertir des calories en joules), on d´epla¸cait la r´eglette de telle fa¸con que son origine se trouve en face de la graduation a de la r`egle, puis on d´epla¸cait le curseur jusqu’` a la graduation b de la r´eglette pour lire le r´esultat : comme les graduations ´etaient logarithmiques, on additionnait ainsi deux logarithmes pour obtenir le produit de leurs arguments. par fixer la valeur du m`etre ` a 443,296 lignes (une unit´e en vigueur `a Paris alors) et l’on fondit le fameux m`etre-´etalon en platine irridi´e du pavillon de Breteuil. Au-del` a de l’histoire plus ou moins anecdotique, on devine en arri`ere-plan les prodigieux calculs num´eriques que les math´ematiciens de la conf´erence ont dˆ u faire (outre les travaux de d´egrossissage r´ealis´es par Delambre et M´echain : corrections pour l’altitude, la r´efraction atmosph`erique, la temp´erature, etc.) arm´es d’une plume pour ´ecrire et d’une table de logarithmes. Il ne se r´epartirent mˆeme pas la tˆ ache, car pour plus de sˆ uret´e, chaque participant devait faire ind´ependamment l’int´egralit´e des calculs en utilisant ses propres m´ethodes ! On reste pantois devant la dext´erit´e et l’acharnement calculatoires que cela repr´esente. . . Un peu plus tard, au XIXe si`ecle, Urbain Le Verrier ´etudia les perturbations observ´ees dans l’orbite d’Uranus et postula l’existence d’une autre plan`ete jusqu’alors inconnue. Il calcula la position de cette plan`ete et le directeur de l’observatoire de Berlin, Johann Galle, vit `a l’endroit indiqu´e, le 23 septembre 1846, la nouvelle plan`ete, Neptune : un triomphe pour le valeureux calculateur ! On imagine sans peine cependant l’´enorme labeur que repr´esent`erent, pour Le Verrier, ces calculs, enti`erement faits `a la main. . . Cependant, l’id´ee d’automatiser des calculs ennuyeux est ancienne. Le baron Gaspard de Prony ´etait charg´e pendant le Premier Empire d’´etablir des tables pour le calcul de l’impˆot foncier : pour cela, il divisa le travail en trois grands blocs. La premi`ere partie, la plus noble, ´etait confi´ee ` a des math´ematiciens : il s’agissait de d´ecomposer tous les calculs n´ecessaires en s´eries d’op´erations ´el´ementaires. La deuxi`eme tˆ ache consistait `a organiser le travail et ` a compiler les r´esultats. La troisi`eme, faire les calculs r´eduits ` a des op´erations tr`es simples, fut confi´ee `a une arm´ee de calculateurs humains dont la seule qualification ´etait d’ˆetre capable de faire des additions. L’´etape suivante fut franchie par Charles Babbage, un gentleman philosopher britannique du d´ebut du XIXe si`ecle qui eut l’id´ee d’associer cette d´ecomposition des calculs en tˆ aches ´el´ementaires avec une calculatrice du type
de celle de Pascal et un syst`eme de cartes perfor´ees issu des m´etiers `a tisser Jacquard. Malheureusement, malgr´e un financement public cons´equent, et une « communication » - comme on dirait maintenant - efficace assur´ee par Ada Byron6 , les r´ealisations pratiques ne donn`erent jamais satisfaction, `a cause semble-t-il des frottements excessifs des m´ecanismes. La premi`ere r´ealisation pratique de calculs massifs automatis´es est due `a Herman Hollerith qui inventa une machine pour traiter les donn´ees du recensement am´ericain de 1890 `a l’aide de cartes perfor´ees. Le r´esultat (62 622 250 habitants) fut obtenu en six semaines au lieu de sept ans pour le recensement pr´ec´edent. Fort de ce succ`es, Hollerith fonda en 1896 la Tabulating Machine Company qui changea de nom en 1924 pour devenir International Business Machines : ibm. . . sp´ecialis´ee dans la fabrication de calculatrices m´ecaniques de bureau, parfois mˆ ues par des moteurs ´electriques, ou utilisant des cartes perfor´ees. Un effort de recherche important sur le calcul automa´ tique fut men´e aux Etats-Unis pendant la deuxi`eme guerre mondiale pouss´e en grande partie par le Ballistic Research Laboratory. Il fallait calculer les trajectoires des projectiles tir´es par divers armements afin de fournir des tables de pointage aux artilleurs. Pour chaque nouvelle munition, il fallait produire une nouvelle table. Une arm´ee d’employ´es, dot´es de calculatrices m´ecaniques de bureau, faisait ces calculs, mais `a la fin de la guerre, ´etait litt´eralement submerg´ee par l’afflux de munitions de tous types et de tous calibres produits par une industrie de guerre en plein effort. . . La premi`ere calculatrice ´electronique, l’ENIAC en 1945, ´etait un monstre de 30 tonnes comportant 17 468 tubes `a vide7 et consommant 150 kW. La panne d’un seul tube arrˆetait la machine qui occupait un bˆ atiment `a elle toute seule et n´ecessitait un syst`eme de refroidissement puissant pour ´evacuer la chaleur produite ! Les premiers ordinateurs virent le jour `a la fin des ann´ees 1940, trop tard pour participer `a l’effort de guerre. Rapidement, les banques, les compagnies d’assurance8 6 la
fille du po` ete. n’y avait pas encore de transistors et encore moins de circuits int´ egr´ es. 8 Du point de vue des constructeurs d’ordinateurs, ce genre de 7 il
10
Licence de physique L3 : Physique Fondamentale & PHYTEM,
et toutes les entreprises astreintes ` a une comptabilit´e lourde comprirent l’usage qu’elles pouvaient faire de ces nouvelles machines et constitu`erent un march´e important pour les constructeurs. Cependant, la demande de calculs toujours plus importants venant des scientifiques, physiciens et astronomes en tˆete, n’a jamais cess´e d’ˆetre pressante, toujours de quelques ordres de grandeur au-del` a de ce que pouvaient fournir les ordinateurs les plus puissants du moment : cette histoire se poursuit actuellement, certains calculs quantiques, par exemple, se chargeant, par leurs exigences en termes de puissance de calcul, de ramener ` a une saine modestie les fabriquants des processeurs les plus ´eblouissants !
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
la fin de la d´ecennie. Un livre de « math´ematiques computationelles9 » r´eguli`erement r´e´edit´e jusqu’` a la fin des ann´ees 80 explique, dans un chapitre d’introduction intitul´e « General rules of computation work », que si l’on veut construire une table des valeurs de la fonction : ex + cos x p y= + 1 + sin2 x 1 + x2
il faut faire sur une feuille de papier un tableau `a 12 colonnes donnant, pour la premi`ere la liste des valeurs de x, la deuxi`eme celles de x2 , la troisi`eme ex , etc., la douzi`eme donnant enfin la liste des valeurs de y (voir la table 1.1) : il n’est pas inutile de r´ealiser que tous les calculs scientifiques ´etaient r´ealis´es de la sorte jusqu’` a un pass´e somme toute r´ecent `a l’´echelle d’une vie humaine10 . Sur l’histoire de l’informatique, on se reportera avec profit aux ouvrages suivants : Ph. Breton M. Campbell-Kelly & W. Aspray Ph. Breton
1.1.2
Fig. 1.2 – Page de garde de la table de logarithmes Bouvart et Ratinet (´edition 1957) en usage dans les classes scientifiques des lyc´ees jusque dans les ann´ees 1970. ` titre de t´emoignage de la rapidit´e avec laquelle la vie A des scientifiques a chang´e, rappelons qu’encore au d´ebut des ann´ees soixante-dix, les ´el`eves des classes pr´eparatoires passaient plusieurs heures par semaine ` a remplir des colonnes de chiffres, stylo d’une main, table de logarithmes (figures 1.2 et 1.3) de l’autre, un entraˆınement jug´e indispensable `a leur dext´erit´e calculatoire. . . les calculettes ´electroniques n’ayant d´etrˆ on´e l’invention de Napier qu’` a clients avait l’avantage d’ˆ etre largement solvable, un encouragement fort a ` faire les investissements n´ ecessaires a ` la production de calculatrices rapides et fiables !
Histoire de l’informatique, La D´ecouverte (1987) Computer. A history of the information machine, Basic Books (1996) Le premier ordinateur copiait le cerveau humain, La Recherche 290 (1996) p. 80
. . . et quelques exemples.
Au d´ebut du XXe si`ecle, le math´ematicien Henri Poincar´e, ´etudiant le probl`eme dit « `a N corps » par exemple N − 1 plan`etes et leur soleil, d´ecouvrit la « sensiblit´e aux conditions initiales » qui interdit de trouver des solutions g´en´erales aux syst`emes d’´equations diff´erentielles produites par ces probl`emes : une infime diff´erence dans les conditions initiales suffit `a induire un comportement radicalement diff´erent du syst`eme. Autant dire que, malgr´e le d´eterminisme intrins`eque de la m´ecanique newtonienne, un tel syst`eme devient rapidement impr´evisible11 . Toutefois, malgr´e cette d´ecouverte fondamentale, Poincar´e ne put gu`ere aller plus loin et l’on en resta l` a jusque vers les ann´ees 1960. C’est alors que le math´ematicien-m´et´eorologue am´ericain Edward Lorenz12 se mit `a r´esoudre sur ordinateur des ´equations diff´erentielles qui visaient `a simuler le comportement de l’atmosph`ere terrestre : il red´ecouvrit alors des syst`emes au comportement irr´egulier similaire `a ce qu’avait pr´edit Poincar´e. Le triangle simulation-surordinateur/th´eorie/exp´erience donna naissance `a un domaine de recherches nouveau et toujours actif de nos jours : le chaos, la turbulence, les fractals. . ., tout ce qui a trait `a la dynamique des syst`emes non-lin´eaires. Il fallait ´evidemment pour cela que l’on pˆ ut faire des simulations sur ordinateur, car le calcul analytique est insuffisant : d’ailleurs maintenant, la m´et´eorologie nationale est un des 9 Voir la r´ ef´ erence [2] dans la bibliographie. Il s’agit certes d’un livre sovi´ etique et l’informatique est sans doute l’un des domaines dans lequel le retard de l’Union sovi´ etique ´ etait sensible. 10 Pour fixer les id´ ees, pr´ ecisons que l’esp` ece Tyranosaurus Rex ´ etait d´ ej` a´ eteinte depuis quelques ann´ ees. . . 11 Voir par exemple : David Ruelle, Hasard et chaos, Odile Jacob (1991). 12 A ` ne pas confondre avec l’´ ethologiste autrichien Konrad Lorentz et ses oies.
Physique num´erique, Philippe Depondt
11
Fig. 1.3 – Une page de la table de logarithmes Bouvart et Ratinet. Admettons que l’on cherche le produit 0,1263×18,17 ; une calculette donne 2,2949. Avec la table, il faut d’abord chercher 1263, soit 120 puis la sixi`eme ligne pour 126 et enfin la colonne 3 : on y trouve 10140. La mˆeme op´eration pour 1817 donne 25935. La somme de ces deux nombres est 36075. En cherchant dans la table, on trouve que 39078 correspond `a 2295, reste `a d´ecaler la virgule convenablement pour obtenir le r´esultat. Si l’on veut avoir 5 chiffres significatifs, il faut utiliser les tables de multiplication fournies dans la marge pour faire des interpolations lin´eaires. Avec un peu d’habitude, c¸a va assez vite, plus vite en tous cas que la multiplication ` a la main ! plus gros consomateurs civils de calcul sur les ordinateurs les plus puissants. Dans un autre domaine, les exp´eriences faites par exemple `a l’aide du rayonnement synchrotron produit dans des laboratoires tels que SOLEIL ` a Orsay et l’ESRF a Grenoble, produisent une grande quantit´e de donn´ees ` num´eriques qui ne se traduisent pas imm´ediatement par des informations de type physique : par exemple, les positions des atomes d’une prot´eine, qui en comporte des centaines voire des milliers, destin´ee ` a soigner telle ou telle maladie. Survient alors une tˆ ache assez diffi-
cile, la « mod´elisation de donn´ees d’exp´erience » qui consiste `a ajuster un mod`ele th´eorique aux donn´ees exp´erimentales connues, en tenant compte des barres d’erreur exp´erimentales. Il s’agit en g´en´eral de minimiser autant que possible l’´ecart entre les donn´ees empiriques et les pr´edictions du mod`ele th´eorique : cette minimisation, une optimisation du mod`ele si l’on pr´ef`ere, est ´etablie en ajustant un nombre souvent ´elev´e de param`etres (les positions atomiques, la caract´erisation de l’agitation thermique) et ne peut pratiquement se faire qu’` a l’aide d’un ordinateur. L’´etude des syst`emes d´esordonn´es est aussi grosse
12 1 x
Licence de physique L3 : Physique Fondamentale & PHYTEM,
2 x2 (1)2
3 ex
4 sin x
5 cos x
6 e + cos x (3) + (5) x
7 1 + x2 1 + (2)
8 ex +cos x 1+x2
(6)/(7)
0 0.1 0.2 0.3 0.4 ...
9 sin2 x (4)2
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
10 1 + sin2 x 1 + (9)
p 11 1 + sin2 x p (10)
12 y (8) + (11)
ex + cos x p + 1 + sin2 x, `a remplir, colonne par colonne, `a l’aide 1 + x2 d’une machine a` calculer m´ecanique ou ´electro-m´ecanique. . . Tab. 1.1 – Feuille de calcul pour la fonction y =
Tab. 1.2 – Un article du journal Le Monde en 1957, les derniers progr`es de la pr´evision m´et´eorologique, il y a un demi-si`ecle : Une machine ` a pr´ edire le temps Quel temps fera-t-il demain ? Vieille question ` a laquelle les offices m´et´eorologiques s’efforcent de r´epondre. Mais voici que la machine ´electronique vient ` a leur secours. On connaˆıt les aptitudes extraordinaires de ces ordinateurs, v´eritables cerveaux de remplacement, dou´es de raisonnement et d’une fabuleuse m´emoire, qui peuvent aujourd’hui r´epondre en quelques secondes ` a des questions qui embarasseraient plus d’un auditoire savant. C’est ` a des machines semblables que le Bureau m´et´eorologique am´ericain demande de travailler pour lui, au moins pour un certain nombre de calculs. Ce bureau centralise des milliers d’observations qu’une arm´ee de savants, de ballons-sondes, toute une flotille de bateaux, tout un r´eseau de postes et de stations diss´emin´es aux quatre coins du monde, glanent quotidiennement et ` a chaque instant sur terre, sur mer et dans le ciel. Rien n’a chang´e dans le syst`eme, si ce n’est qu’une grande partie des op´erations math´ematiques, la plus dure, la plus longue, est confi´ee ` a l’ordinateur. A chaque instant on introduit dans la machine, sous forme de bandes magn´etiques, de nouvelles observations, de nouveaux chiffres, qui sont la nourriture de ce cerveau surhumain, et les savants n’ont plus qu’` a tirer leurs conclusions. Ils peuvent ainsi annoncer, avec une plus grande sˆ uret´e de diagnostic, l’´evolution du temps pour des p´eriodes de vingt-quatre, quarante-huit et mˆeme soixante-douze heures. (Le Monde, le 25 juillet 1957, reproduit le 25/07/2007).
consommatrice de moyens de calcul. Par exemple, une chaˆıne lin´eaire harmonique d’atomes, tous de masse m, est parcourue de vibrations de type onde plane xℓ = u ei(ωt−kℓa) , o` u xℓ est le d´epacement de l’atome ℓ par rapport `a sa position d’´equilibre et a est la distance interatomique. Un calcul classique13 ` a partir des ´equations du mouvement : mx ¨ℓ = C(xℓ+1 − 2xℓ + xℓ−1 )
m′ r´eparties al´eatoirement, le probl`eme devient beaucoup plus difficile `a r´esoudre. On montre cependant sans grande difficult´e que la solution est donn´ee par la recherche des valeurs propres et vecteurs propres d’une ´enorme matrice n × n, appel´ee « matrice dynamique » o` u n est le nombre d’atomes de la chaˆıne. Le probl`eme est tr`es facile `a r´esoudre num´eriquement `a l’aide d’un sous-programme de biblioth`eque, alors que le d´esespoir guette quiconque tenterait de le r´esoudre `a la main. . . On pourrait objecter `a ce qui pr´ec`ede qu’un probl`eme de physique qui n´ecessite plus qu’une r`egle de trois pour ˆetre r´esolu est un probl`eme mal pos´e. L’art du physicien th´eoricien n’est-il pas justement de faire des approximations adroites de fa¸con `a rendre r´esolubles ces probl`emes tout en isolant les principes importants ? L’int´erˆet n’est-il pas plutˆ ot dans les concepts que dans les techniques de calcul plus ou moins laborieuses ? Cette objection est parfaitement recevable et c’est toujours une bonne d´emarche que de tenter de r´efl´echir `a une question avant de se lancer dans des calculs effr´en´es. Il y a cependant des limites qui souvent arrivent tr`es vite : imaginons un pendule simple qui subit un frottement a´erodynamique. Il pend verticalement et on le lance avec une vitesse initiale donn´ee, suffisamment fort pour qu’il passe `a la verticale au dessus de son point d’´equilibre pour retomber de l’autre cot´e. Combien de tours fera-til autour de son axe avant de se mettre `a osciller ? Il est clair qu’on est fort loin des conditions o` u l’on peut faire les approximations usuelles (angle petit). En attendant de trouver le concept ad´equat, il n’est peut-ˆetre pas stupide de faire une petite simulation num´erique sur un ordinateur : cela ne repr´esente gu`ere plus que quelques dizaines de lignes de programme et quelques secondes de simulation sur une machine mˆeme de puissance m´ediocre. . .
Il ne faut pas croire non plus que le calcul num´erique sur ordinateur se limite `a la physique : les pr´evisions m´et´eorologiques (voir la table 1.2) sont ´evidemment un cas bien connu, mais aussi les simulateurs de vol permettent `a des pilotes d’essais de tester le comportement d’un nouvel avion sans risquer leurs vies et des simulateurs d’op´erations permettent `a des chirurgiens de s’entraˆıner o` u C est la constante de force entre deux atomes. Main- sans risquer celles de leurs patients ! Le dossier de la revue tenant, si la chaˆıne comporte des impuret´es de masse Pour la Science (voir la bibliographie, ref. (20)) consacr´e 13 Voir, par exemple : Charles Kittel, Introduction to Solid State`a la mod´elisation informatique parcourt quelques th`emes « `a la mode ». . . Physics, New York : Wiley, (1986).
donne la pulsation ω en fonction du vecteur d’onde k, c’esta-dire la relation de dispersion : ` r ka C sin ω(k) = 2 m 2
Physique num´erique, Philippe Depondt
1.2
Plan succinct.
La premi`ere ´etape est l’apprentissage d’un langage de programmation. Il faut pouvoir « dire » ` a l’ordinateur ce que l’on veut qu’il fasse. Le langage le plus adapt´e au calcul scientifique est le fortran95. Son concurrent, le langage C, plus g´en´eraliste et plus adapt´e ` a la programmation syst`eme -le syst`eme d’exploitation unix est programm´e en C-, n´ecessiterait un apprentissage plus long, qui n’apporterait rien de plus `a notre objectif, sans apporter la puissance qu’offre fortran95 en particulier dans la manipulation des tableaux. Afin d’illustrer l’objectif de ce cours, cette premi`ere partie est suivie d’un chapitre dont le but est de montrer sur un exemple la fa¸con dont on proc`ede pour aborder un probl`eme et en particulier essayer d’expliciter ce qui est attendu lors des s´eances de travaux pratiques. La deuxi`eme ´etape consistera ` a passer en revue les m´ethodes les plus utilis´ees par les physiciens, autant que possible `a l’aide d’exemples tir´es de la physique. L’accent ne sera pas forc´ement mis sur les d´etails les plus intimes des algorithmes, car des math´ematiciens seraient sˆ urement plus `a mˆeme de le faire que des physiciens dont ce n’est pas le centre d’int´erˆet principal : de fait, la pratique des physiciens est souvent d’utiliser des sous-programmes de biblioth`eque existants et ´eprouv´es que l’on « appelle » `a partir d’un programme sp´ecifique ` a un probl`eme donn´e. L’effort portera donc plutˆ ot sur les contraintes que ces algorithmes peuvent exercer sur les probl`emes que se posent les physiciens, ´eventuellement sur les pi`eges qu’ils rec`elent. En gros, il s’agit d’essayer de r´epondre ` a trois questions : « comment c¸a marche ? », « quelles cons´equences cela peut-il avoir pour moi, physicien ? » et bien sˆ ur : « qu’estce que je peux faire avec ? ». Une ouverture est donn´ee sur la simulation num´erique. La troisi`eme ´etape consistera ` a utiliser un logiciel de calcul formel pour tenter de r´esoudre les mˆemes probl`emes que pr´ec´edemment. Dans certains cas, le caract`ere convivial et automatique du logiciel tout fait fera des miracles, dans d’autres en revanche, c¸a sera moins convaincant. . . mieux vaut savoir se rep´erer, d’autant que, l` a encore, des pi`eges subsistent. Ainsi ce cours se veut, non pas un cours d’« informatique pour physiciens » mais un cours pratique de « Physique num´erique » c’est-`a-dire des m´ethodes qu’utilisent les physiciens pour r´esoudre un grand nombre de probl`emes de physique.
13
14
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Chapitre 2
Notions pratiques de FORTRAN95. Les notes ci-dessous ont pour but de donner rapidement au lecteur la capacit´e d’´ecrire des programmes ; elles ne remplacent pas, bien sˆ ur, un cours syst´ematique1. Il s’agit ici d’un outil dont la maˆıtrise est un pr´ealable indispensable `a tout travail de calcul num´erique : il n’est pas utile de connaˆıtre toutes les subtilit´es du Fortran95, mais il faut imp´erativement ˆetre capable d’´ecrire rapidement des programmes simples « qui marchent » car, sinon, les s´eances de travaux pratiques destin´ees ` a faire de la physique que l’on esp`ere int´eressante avec cet outil, en deviendraient suprˆemement ennuyeuses pour tous, enseignants compris. . .
2.1
Qu’est-ce qu’un langage de programmation ?
Un ordinateur, lorsqu’il ex´ecute un programme, lit l’une apr`es l’autre dans sa m´emoire des instructions ´el´ementaires, par exemple : « aller chercher un nombre a ` tel emplacement dans la m´emoire » ou « multiplier tel nombre par tel autre ». Ce sch´ema correspond ` a la c´el`ebre « machine de Turing » qui sert de mod`ele th´eorique `a l’immense majorit´e des ordinateurs (figure 2.1) : instructions et donn´ees sont inscrites sur un mˆeme support appel´e m´emoire2. La m´emoire est constitu´ee d’emplacements correspondant chacun ` a une adresse et contenant chacun une instruction ou une donn´ee : on peut se repr´esenter cette m´emoire comme une esp`ece de long ruban divis´e en cases, chacune d’entre elles ayant un num´ero, comme les maisons le long d’une rue, chaque num´ero constituant une « adresse ». La « machine » lit dans la m´emoire les instructions et les ex´ecute l’une apr`es l’autre s´equentiellement3 . Une instruction peut ˆetre l’ordre d’aller lire une donn´ee ` a l’adresse en m´emoire indiqu´ee par cette instruction, ou de modifier une donn´ee ou encore d’inscrire une donn´ee ` a une autre adresse dans la m´emoire : on peut donc modifier le contenu de la m´emoire. Chaque instruction est d´esign´ee par un code binaire constitu´e de 0 et de 1, et chaque emplacement dans 1 voir par exemple J. F. Kerrigan, r´ ef. [6] dans la bibliographie, ou, plus r´ ecent et plus complet M. Metcalf et al., r´ ef. [18]. 2 Le terme m´ emoire date des ann´ ees 1940, lorsque John Von Neumann s’est pr´ eoccup´ e de r´ ealisations pratiques de la machine de Turing qui dans son esprit devaient ˆ etre des cerveaux artificiels. Avant, on parlait, plus prosa¨ıquement, de storage en anglais, soit stockage. 3 d’o` u l’expression « machine s´ equentielle » que l’on retrouve fr´ equemment : il s’agit simplement d’une machine qui ex´ ecute les instructions l’une apr` es l’autre, par opposition aux machines dites « parall` eles ».
la m´emoire est aussi d´esign´e par une adresse binaire. C’est ce qu’on appelle le langage machine. R´ealiser un programme consiste donc `a fournir `a l’ordinateur une s´equence d’instructions de ce type pour qu’il la place dans sa m´emoire pour ex´ecution ; or il est rapidement fastidieux d’aligner des listes fort longues de 1 et de 0, sans compter les risques d’erreurs que cela comporte ! Un premier progr`es fut de remplacer le code binaire d’une instruction par un mot-clef, par exemple load (pour charger en m´emoire), et d’´ecrire les adresses en d´ecimal (ou en hexad´ecimal) plutˆ ot qu’en binaire. Cela donne quelque chose qui peut ressembler `a : load 150 aller chercher un nombre a ` l’adresse 150 add 200 additionner avec le contenu de l’adr. 200 store 220 ranger le r´esultat a l’adresse 220 C’est nettement plus lisible que : 0011010100101100011111100100001001110101...
Un programme sp´ecial, en g´en´eral fourni avec l’ordinateur et appel´e assembleur traduit alors toutes ces instructions en binaire ou langage machine, puis on peut faire ex´ecuter le programme (voir les tables 2.1 et 2.2). L’assembleur permet de faire beaucoup de choses, presque tout, `a vrai dire : `a une ´epoque (les ann´ees 80) o` u les m´emoires disponibles n’´etaient pas ce qu’elles sont devenues, la programmation en assembleur permettait d’´ecrire des programmes efficaces et peu encombrants, au d´etriment ´evidemment de la facilit´e et du temps pass´e `a la programmation, car tout cela reste tr`es « proche de la machine » et certainement assez peu convivial4 . L’´etape suivante fut donc de cr´eer des langages dits « ´evolu´es » avec lesquels on puisse faire ais´ement des instructions beaucoup plus compliqu´ees comme, par exemple : x = a*exp(i*(omega*t+phi))
qui ressemble beaucoup `a l’expression math´ematique : x = a ei(ωt+ϕ) et o` u x et i sont des nombres complexes, les autres variables ´etant r´eelles, exp d´esignant ´evidemment l’exponentielle et * la multiplication. Un autre programme appel´e compilateur doit alors d´ecomposer ces instructions ´evolu´ees en instructions ´el´ementaires, les coder en binaire et affecter des adresses en m´emoire `a toutes les variables pour produire un programme ex´ecutable : cette 4 J’ai, personnellement, quelques souvenirs cuisants a ` ce titre : a ` la suite -entre autres- d’une erreur dans le calcul d’une adresse, un programme pouvait tr` es bien ´ ecrire une donn´ ee a ` un emplacement r´ eserv´ e a ` une fonctionalit´ e de base du syst` eme, ce qui ´ etait ´ evidemment plutˆ ot catastrophique !
15
16
3
4
charger add. ranger aller 150 200 220 en 10
150 151 retour en 1
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
200 201
220
2. 64 58
2
1. 41 4 3. 14 16
1
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Fig. 2.1 – La machine th´eorique de Turing. Le curseur lit les instructions les unes apr`es les autres et la machine les ex´ecute. Par exemple : aller lire une donn´ee ` a un emplacement de la m´emoire vive, ou sauter `a une autre instruction, etc.
Tab. 2.1 – Pour comprendre comment « c¸a marche » : quelques ´el´ements d’assembleur L’unit´e centrale (CPU ou Central Processing Unit) d’un ordinateur ne travaille pas directement dans la m´emoire vive : elle a ses propres emplacements m´emoires appel´es « registres ». Elle doit donc aller chercher en m´emoire vive les grandeurs n´ecessaires ` a un calcul, les copier dans ses registres, faire les op´erations requises et stoker les r´esultats dans la m´emoire. Pourquoi toutes ces complications, pourquoi ne pas tout stocker d’embl´ee dans les registres de l’unit´e centrale ? Tout simplement parce qu’ils sont tr`es peu nombreux, de l’ordre de la dizaine. . . Certains ordinateurs tr`es puissants -et extrˆemement coˆ uteux- poss`edent des registres en grand nombre ce qui acc´el`ere consid´erablement les calculs mais suppose un budget cons´equent ! Mettons que l’ordinateur utilis´e poss`ede deux registres ` a usage g´en´eral appel´es « accumulateurs », d´esign´es par A et B dans lesquels on peut placer des nombres, par exemple. L’instruction pour charger le contenu d’un emplacement m´emoire dans le registre A est LDA et celle pour B est LDB (les syntaxes sont donn´ees ici ` a titre indicatif : cela d´epend du processeur). On peut donc ´ecrire, par exemple : LDA $40B6 ce qui signifie « charger le contenu de $40B6 dans le registre A, le symbole $ indiquant que l’adresse est donn´ee en hexad´ecimal (en base 16), soit : $40B6= 4 × 163 + 0 × 162 + 11 × 16 + 6 soit 16566.De mˆeme : ADDA $B003 additionne le contenu du registre A avec le contenu de l’emplacement $B003 et place le r´esultat dans A. (Suite : table 2.2)
traduction, ce programme ex´ecutable est g´en´eralement stock´e sur le disque dur de l’ordinateur dans un fichier dit « ex´ecutable » qu’il suffit d’invoquer (en g´en´eral en tapant son nom sur le clavier) pour qu’il s’ex´ecute. Ainsi, lorsqu’on ´ecrit un programme, que ce soit en fortran, C, pascal ou autre, on doit d’abord cr´eer, ` a l’aide d’un ´editeur de texte5 comme emacs, xedit, kedit, vi (pour les amateurs), voire ed, un fichier que l’on appelle le « fichier source » qui contient les instructions que l’on a ´ecrites en langage ´evolu´e. Ce fichier source n’est pas ex´ecutable : il ne contient que des caract`eres, a priori inutilisables en l’´etat par l’unit´e centrale. On doit alors compiler le programme pour obtenir un fichier ex´ecutable, et enfin lancer l’ex´ecution de celui-ci. Bien, ´evidemment, ` a chaque modification du fichier source, il faut re-compiler et relancer 5 et non un traitement de texte, dont les fonctionnalit´ es (mise en page, correction orthographiques, effets divers) sont infiniment plus riches qu’un simple ´ editeur qui se borne a ` enregistrer les caract` eres que l’on tape au clavier pour les inscrire dans un fichier texte sur le disque dur.
Tab. 2.2 – Suite de la table 2.1 Un autre registre tr`es important est le « compteur ordinal » : il contient l’adresse de la prochaine instruction qui doit ˆetre lue. Le contenu de ce registre est incr´ement´e automatiquement chaque fois qu’une instruction est lue, sauf si l’instruction pr´ec´edente est une instruction dite « de branchement ». Ainsi, le CPU lit une instruction, incr´emente le compteur ordinal, ex´ecute l’instruction, puis lit l’instruction suivante, incr´emente le compteur, ex´ecute l’instruction, etc. C’est ce qu’on appelle une « architecture s´equentielle ». Cependant, si l’instruction lue est une instruction de branchement, celle-ci modifie le contenu du compteur afin de forcer la lecture d’une autre instruction que la suivante. Ce branchement est en g´en´eral soumis au contenu d’un registre « d’´etat » qui dit si une grandeur derni`erement trait´ee et positive ou n´egative, s’il y a eu un d´epassement de capacit´e, etc. On peut modifier le registre d’´etat ` a l’aide d’instructions de comparaison, par exemple : CMPB $310F compare le contenu du registre B avec celui de l’emplacement $310F et modifie le registre d’´etat en cons´equence, puis BGE $11DA nous exp´edie ` a l’adresse m´emoire $11DA, si le r´esultat de la comparaison est positif (B veut dire branch et GE signifie Greater or Equal ), pour y lire une instruction. On obtient ainsi la possibilit´e d’instructions soumises ` a condition ; reste toutefois ` a esp´erer que l’emplacement en question contient bien une instruction, c’est une source de « plantages » spectaculaires, mais l` a r´eside une grande part du charme d´esuet de l’assembleur ! Si l’on souhaite un plat un peu plus cors´e encore, on peut placer un nombre d´esignant une adresse dans un emplacement de la m´emoire. Par exemple : LDA #$0114 place le nombre (et non le contenu de l’adresse) dans le registre A, STA $041E place ce nombre ` a l’emplacement $041E LDB [$041E] charge dans B, non pas le contenu de $041E, mais le contenu de l’adresse elle-mˆeme contenue dans $041E. Ainsi INC $041E incr´emente le contenu de cette adresse, et LDB [$041E] permet d’aller chercher ce qui se trouve ` a l’emplacement suivant : en accroissant pas ` a pas le contenu de l’emplacement $041E on peut parcourir l’un apr`es l’autre toute une s´erie d’emplacements successifs dans la m´emoire. Les amateurs de langage C auront reconnu ici un embryon de pointeur. En fortran ce genre de situation est g´er´e par les tableaux.
l’ex´ecution6 ! 6 il existe des environnements int´ egr´ es, en particulier sous Windows, dans lesquels ces ´ etapes sont plus ou moins automatiques et
17
Physique num´erique, Philippe Depondt
Le fortran est le premier de ces langages ´evolu´es `a avoir vu le jour, mais beaucoup d’autres ont suivi : algol, cobol, pl1, basic, pascal, forth, C, ada, occam. . . Pour ce qui est de la programmation scientifique, outre fortran, seul le langage C semble survivre. Le sigle fortran signifie « formula translator » (traducteur de formules) : l’id´ee est donc de coder des formules de fa¸con aussi proche que possible de ce que l’on fait lorsqu’on ´ecrit des ´equations ` a la main et de traduire ceci en instructions ex´ecutables par l’ordinateur. C’est ` a premi`ere vue une gageure, mais, en fait, fortran est un langage simple, bien adapt´e au calcul scientifique. Mis au point dans sa premi`ere version par John Backus en 1956, il n’a pas cess´e d’´evoluer depuis et ses variantes sont nombreuses tant les fa¸cons de programmer ont ´evolu´e. En effet, les moins jeunes de vos enseignants ont appris le fortranIV et ont travaill´e avec des cartes perfor´ees : ils ont bien sˆ ur des anecdotes `a raconter sur des paquets de cartes s’´echappant de leur carton et se r´epandant sur le sol ou de cartes abˆım´ees apr`es de nombreux usages (apr`es tout, il ne s’agissait que de morceaux de papier bristol) se coin¸cant dans le lecteur et dont il fallait aller chercher les d´ebris avec une pince `a ´epiler ! Le bruit des machines `a perforer7 a marqu´e un certain nombre de g´en´erations de pro` la fin des ann´ees soixante-dix et au d´ebut grammeurs. . . A des ann´ees quatre-vingt, les cartes perfor´ees disparurent, remplac´ees d’abord par des t´el´etypes puis par l’ensemble ´ecran-clavier que nous connaissons maintenant. Le fortranIV avait bien des d´efauts. Il comportait des instructions (go to et if « arithm´etique ») capables de produire des logiques ´echevel´ees, bondissant d’un bout a l’autre du programme en des itin´eraires dignes d’un ` plat de spaghettis : autant dire que ce n’´etait pas tr`es lisible et g´en´erateur d’erreurs retorses. Entre-temps, les id´ees li´ees `a la programmation dite « structur´ee » s’´etaient d´evelopp´ees, incarn´ees entre autres par le langage pascal, et le fortran a int´egr´e une bonne part de ces concepts. Deux normes officielles de fortran coexistent actuellement : fortran77 qui reste assez classique et fortran90 (ou fortran95 quasiment identique), beaucoup plus ´evolu´e, qui est appel´e ` a le remplacer progressivement et qui constitue la norme sur les gros calculateurs d´edi´es aux calculs lourds. Nous utiliserons ici la norme fortran95, principalement pour sa capacit´e ` a travailler sur des tableaux de nombres de fa¸con tr`es confortable et efficace8 . Le compilateur g77 qui fait partie de toutes les distributions Linux, librement diffus´e par gnu (Le mot anglais gnu d´esigne le gnou, une esp`ece de buffle, et le sigle gnu signifie : GNU’s Not Unix, un exemple d’autor´ef´erence typique d’un certain humour informatique), est bas´e sur fortran77, mais il int`egre un grand nombre de caract´eristiques de fortran90 ce qui en fait un outil puissant tout en gardant une grande simplicit´e. Toutefois, de bons compilateurs fortran95 (g95 et gfortran9) donc quasiment invisibles. 7 Il y eut aussi l’´ etape ruban perfor´ e qui permettait, avant les bandes, disquettes et autres supports magn´ etiques, d’enregistrer des donn´ ees : cet engin ´ etait -justement- surnomm´ e « la mitrailleuse » ! 8 Les programmes ´ ecrits en fortran77 peuvent ˆ etre compil´ es avec un compilateur fortran95. 9 Le compilateur g95 est ais´ ement t´ el´ echargeable sur http ://g95.org/. Le compilateur gnu gfortran commence a ` ˆ etre disponible comme faisant partie de certaines distributions
commencent `a ˆetre disponibles en libre diffusion et il n’y a donc gu`ere de raison de s’en priver. Des « nouvelles du front » ainsi que des compilateurs t´el´echargeables, peuvent ˆetre obtenus via le site : http ://programming.ccp14.ac.uk/fortran-resources/~ cgp/fortran.html
Dans les notes qui suivent, nous suivrons le « format libre » (ou free form) qui permet de s’affranchir de l’obligation de s’en tenir aux colonnes 7 `a 72 comme au bon vieux temps des cartes perfor´ees. . . Les compilateurs s’en accomodent en principe sans probl`eme encore que quelques fac´eties soient possible : on peut alors tenter d’utiliser l’option de compilation -ffree-form, voire lire le manuel d’utilisation du compilateur. . . La compilation s’effectue par la commande : g95 monboprog.f90 -o monboprog monboprog.f90 (ou tout autre nom se terminant par .f90) est le fichier, dit « fichier source » cr´e´e avec un ´editeur comme emacs, qui contient toutes les instructions ´ecrites en fortran10 . L’option -o (pour output ) indique au compilateur o` u il doit placer le r´esultat de son travail, ainsi le fichier monboprog contient le programme ex´ecutable, c’est-`a-dire sa traduction en langage machine11 . Evidemment, si l’on utilise un autre compilateur que g95 (par exemple gfortran12, pgf9013 ou xlf9014 ), il faut remplacer g95 par le nom du compilateur. Le r´esultat de la compilation est donc, quand tout s’est bien pass´e, un programme ex´ecutable qu’il reste `a faire travailler, mais en g´en´eral, au premier essai, il reste des erreurs de programmation que le compilateur d´etecte : il faut alors corriger le programme-source en tenant compte des diagnostics fournis par le compilateurs et re-compiler. . . jusqu’` a ce que c¸a marche ! (figure 2.2).
2.2 2.2.1
Notions ´ el´ ementaires. Instructions.
Une instruction tr`es simple de fortran peut ˆetre par exemple : a = b + c
elle signifie : 1. que l’on d´esigne par a, b et c trois emplacements dans la m´emoire vive de l’ordinateur, 2. que l’on prend le contenu des emplacements b et c, 3. que l’on en fait la somme (cela suppose qu’il s’agit de nombres) Linux (Debian et Fedora au moment o` u ces lignes sont ´ ecrites) et, convenablement install´ e, il paraˆıt plutˆ ot plus efficace ` a condition d’utiliser l’option -ffast-math. 10 certains compilateurs fortran90 exigent que le nom du fichier source se termine par .f. Pour d’autres, la terminaison .f signifie « format fixe » et la terminaison .f90, « format libre » 11 On peut fabriquer une commande personnelle de compilation, par exemple en cr´ eant un fichier appel´ e gf95 dans lequel on met la ligne : g95 $1.f90 -o $1. Ce fichier peut alors ˆ etre rendu ex´ ecutable par la commande : chmod +x gf95. Pour compiler un programme, il suffira dor´ enavant de taper : gf95 monboprog. Selon les besoins, gf95 peut ˆ etre modifi´ e ensuite pour inclure d’autres options de compilation comme -O3 (optimisation) ou des biblioth` eques de calcul. 12 version gnu. 13 compilateur commercial de Portland Group. 14 compilateur ibm.
18
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Edition : emacs monboprog.f90 &
Compilation : g95 monboprog.f90 −o monboprog
Exécution : ./monboprog
Fig. 2.2 – Le cycle de mise au point d’un programme : ´edition du fichier-source, compilation, ex´ecution. La compilation permet de d´etecter les erreurs de syntaxe que l’on ` l’ex´ecution, la corrige par un retour ` a l’´etape d’´edition. A prudence impose de tester le programme, en g´en´eral en faisant des calculs dont on connait le r´esultat : les erreurs ainsi d´etect´ees renvoient aussi ` a l’´edition. En principe, le cycle converge assez vite. . . 4. que l’on met le r´esultat dans l’emplacement a.
a = b + c
Ceci n’est pas un
=
Fig. 2.3 – Le signe = dans une instruction n’est pas une ´egalit´e math´ematique ! Il ne faut surtout pas s’imaginer que le signe = ci-dessus soit une ´egalit´e math´ematique ! Il s’agit d’une instruction, d’un ordre que l’on donne ` a l’ordinateur : on lui « dit » de calculer la valeur num´erique de ce qui se trouve `a droite du signe ´egal et de le placer dans l’emplacement de la m´emoire d´esign´e par le symbole qui se trouve ` a sa gauche. On peut consid´erer le signe ´egal comme une affectation ou une fl`eche :
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Tab. 2.3 – Qu’est-ce qu’un syst`eme d’exploitation ? On doit, on l’a vu, mettre dans la m´emoire vive de l’ordinateur le ou les programmes que l’on utilise ainsi que les donn´ees correspondantes. C’est une des tˆ aches du syst`eme d’exploitation : quand, sous unix, on tape le nom d’un programme, un autre programme (ou plusieurs autres programmes) qui fait partie du syst`eme d’exploitation, lit les caract`eres que l’on tape sur le clavier, au passage reproduit ces caract`eres sur l’´ecran, puis va lire le fichier ex´ecutable au bon endroit sur le disque dur, l’installe ´ en m´emoire et lance son ex´ecution. Eventuellement, il fera apparaˆıtre un message du genre file not found ou toute autre chose de ce style. . . Si plusieurs programmes doivent s’´ex´ecuter en mˆeme temps, ou si plusieurs utilisateurs travaillent en mˆeme temps sur le mˆeme ordinateur, c’est le syst`eme d’exploitation qui r´epartira les ressources (m´emoire, processeur, disque dur, imprimantes, etc.) entre les programmes et les utilisateurs. C’est aussi au syst`eme d’exploitation que l’on a ` a faire lorsqu’il faut s’identifier comme utilisateur (login et mot de passe). Le syst`eme d’exploitation unix date du d´ebut des ann´ees 1970 ; il a d’abord ´et´e install´e sur des stations de travail « moyennes » mais il a rapidement envahi le monde des ordinateurs destin´e au calcul scientifique. Le premier syst`eme d’exploitation de Microsoft, dos (1981), est une version extrˆemement simplifi´ee d’unix, en particulier, il est mono-utilisateur, alors qu’Unix est multi-utilisateur, c’est-` a-dire que plusieurs personnes peuvent utiliser simultan´ement le mˆeme ordinateur : c’est particuli`erement important sur les grosses machines et les serveurs. En 1991, Linus Torvalds cr´ea linux, une version, compl`ete cette fois-ci, d’unix utilisable sur des ordinateurs personnels. Les machines utilis´ees pour les travaux pratiques de ce module tournent sous linux. Un grosse partie de la tˆ ache du syst`eme d’exploitation est de g´erer les p´eriph´eriques, en particulier, les disques (d’ailleurs le nom dos signifie disk operating system), car c’est l` a que se trouvent les donn´ees et les programmes. Un disque dur est en g´en´eral structur´e en r´epertoires : une partie du disque est r´eserv´ee au syst`eme d’exploitation, une autre aux utilisateurs (en g´en´eral home). Chaque utilisateur a son propre sousr´epertoire et souvent les utilisateurs sont organis´es en groupes (par exemple phys, math, chim,. . .). Si vous tapez par exemple la commande pwd (print working directory), vous obtiendrez quelque chose qui peut ressembler ` a: /home/phys/enseign/depondt c’est-` a-dire que le r´epertoire de travail courant depondt est en fait un sous-r´epertoire d’enseign, lui-mˆeme un sous-r´epertoire de phys, etc. La commande ls (list) donne la liste des fichiers et sous-r´epertoires pr´esents dans un r´epertoire. On peut cr´eer un r´epertoire (que l’on choisit d’appeler par exemple td1) par la commande mkdir td1 (make directory) par exemple et changer de r´epertoire par cd td1 (change directory) : pwd donnera alors /home/phys/enseign/depondt/td1. Depuis le milieu des ann´ees 1980, les syst`emes d’exploitation comportent ´egalement les icˆ ones et fenˆetres devenues coutumi`eres : quand on clique sur une icˆ one, on « dit » au syst`eme de lancer le programme correspondant au lieu de taper son nom sur le clavier. gnome ou kde sont des syst`emes de fenˆetrage qui viennent se greffer sur linux, mais on peut tr`es bien travailler sur des machines qui en sont d´epourvues : c’est un peu moins convivial. . . mais parfois plus robuste ! a = b
a = b
peut ˆetre compris comme a ← b
(mettre b dans a) et b = a
on met b dans a. Cela a quelques cons´equences pratiques, (mettre a dans b) ne signifient pas la mˆeme chose et les ainsi deux instructions :
19
Physique num´erique, Philippe Depondt
a = b
Tab. 2.4 – Quelques commandes Unix de base Beaucoup de choses peuvent ˆetre faites sous Unix en cliquant sur des icˆ ones : les gestionnaires de fenˆetre tels que kde ou gnome sont devenus tr`es similaires ` a Windows ou MacOS. Il est bon cependant de connaˆıtre les commandes de base d’Unix, d’une part parce que les icˆ ones sont loin d’ˆetre capables de tout faire et de l’autre, il est souvent sensiblement plus rapide de taper une commande dans un terminal que de d´eployer tout l’arsenal, graphique en particulier, qui accompagne les gestionnaires de fenˆetres et d’icˆ ones et qui est g´en´eralement gourmand en ressources. mkdir make directory cr´eer un r´epertoire pwd print working directory nom du r´epertoire courant cd change directory changer de r´epertoire cp copy copier des fichiers, rm remove effacer des fichiers mv move d´eplacer un fichier more more voir le contenu d’un fichier texte. lpr line printer imprimer a2ps ASCII to postscript imprimer un fichier texte emacs ´editeur de texte g95 compilateur fortran man manual manuel en ligne Par exemple : cp machin nouveau machin cr´ee un fichier qui est la copie de machin. On peut d´eplacer ou copier d’un r´epertoire ` a un autre : mv td1/prog.f td2 d´eplacera le fichier prog.f du r´epertoire td1 au r´epertoire td2. La plupart des commande ont des options marqu´ees par un tiret -, par exemple : g95 prog.f90 -O3 -o prog utilise deux options (optimisation, et nom du fichier de sortie), ou : lpr -Ppr1 figure.ps pr´ecise sur quelle imprimante l’impression doit se faire. Pour trouver les possibilit´es d’une commande et les options qu’elle peut utiliser : man nom de commande. Finalement, le r´epertoire courant est marqu´e par un point : . et le r´epertoire situ´e au-dessus du courant par deux points : .., ainsi cd . ne fait rien, mais cd .. remonte d’un cran dans la hierarchie des fichiers. Si l’on veut copier un fichier d’un autre r´epertoire vers le r´epertoire courant, on peut faire, par exemple, un cp /home/machin/truc/fichier origine . , o` u le point “.” est la destination de la copie.
Tab. 2.5 – Le BIOS ou Basic Input/Output System. Le BIOS est un programme qui est directement install´e par le constructeur sur la carte-m`ere (c’est-` a-dire la carte qui comporte le processeur, la m´emoire vive, etc.) de l’ordinateur et qui peut donc d´emarrer d`es la mise sous tension alors qu’aucun p´eriph´erique n’est encore op´erationnel. C’est lui qui, apr`es avoir identifi´e les p´eriph´eriques disponibles, charge le syst`eme d’exploitation qui se trouve, lui, g´en´eralement sur le disque dur, un CD, voire une disquette ou une autre machine accessible par r´eseau.
alors, a, b et c contiennent la valeur 3. . . Il s’agit donc bien de deux instructions ex´ecut´ees l’une apr`es l’autre dans l’ordre donn´e dans le programme. Finalement, l’instruction : i = i + 1
n’a rien d’absurde : il s’agit simplement de l’ordre d’augmenter la valeur de i de 1 (on prend i, on lui ajoute 1 et on met de r´esultat dans i). En revanche : a + b = 3*x + c
! ATTENTION, CECI N’A AUCUN SENS
est totalement d´epourvu de sens pour l’ordinateur car l’expression a + b `a gauche du signe = ne d´esigne pas un emplacement dans la m´emoire. . . pire encore : a = b = c ! CA NE PLAIRA PAS DU TOUT AU COMPILATEUR
`a droite du premier signe =, il y a une expression b = c qui ne peut pas ˆetre ´evalu´ee, puisque ce n’est pas une valeur, c’est une instruction !
2.2.2
D´ eclarations.
Tout ceci suppose cependant que l’on ait d´ej` a « dit » a` l’ordinateur que a, b et c sont des emplacements de la m´emoire destin´es `a contenir des nombres, par exemple des nombres r´eels : c’est ce qu’on appelle une d´eclaration. Ainsi la d´eclaration : real :: a, b, c
d´eclare que l’on va occuper trois emplacements m´emoire dor´enavant appel´es a, b et c et que l’on mettra des nombres r´eels dedans15 . Comme on peut changer la valeur du contenu de ces emplacements, on les appelle variables. Un nom de variable peut ˆetre simplement une lettre comme a ou x, ou alors une combinaison de lettres et de chiffres `a condition de commencer par une lettre, par exemple : agecpt, y2, zmax, mais pas : 2pi ou s*3 (* est un caract`ere sp´ecial d´esignant la multiplication). Le caract`ere “ ” « blanc soulign´e » ou underscore est ´egalement autoa ris´e : pere ubu ou nbr pas. La longueur peut aller jusqu’` 31 caract`eres : age du capitaine. Il ne faut pas utiliser les lettres accentu´ees, c´edilles, tr´emas, et autres signes diacritiques. Enfin, fortran ne fait pas la distinction entre lettres majuscules et minuscules (Zmin est identique `a zmin) alors que le syst`eme d’exploitation unix le fait (les fichiers resultats et Resultats sont distincts). On peut d´eclarer des nombres entiers, par exemple : integer :: i, m, nbrpas
a = b b = c
ou des nombres complexes : complex :: z, s
ne signifient pas que les trois nombres a, b et c soient ´egaux ! Cela signifie : « prendre le contenu de l’emplacement d´esign´e par la lettre b et le mettre dans a, puis modifer le contenu de b en y mettant le contenu de c ». Donc, apr`es coup, a et b peuvent ˆetre diff´erents. De mˆeme, l’ordre des instructions a une importance : mettons que l’on ait affect´e les valeurs, respectivement, 1, 2 et 3 ` a a, b et c. Les deux instructions ci-dessus aboutiront ` a avoir 2 dans a et 3 dans b et c. Mais si l’on intervertit les instructions : b = c
Toutes les d´ eclarations doivent figurer au d´ ebut du programme, avant les instructions dites « ex´ecutables ». Une instruction du type a = 3*b - c avec laquelle on « dit » `a l’ordinateur de faire quelque chose est ex´ecutable, une d´eclaration o` u l’on r´eserve de l’espace pour des variables ne l’est pas. 15 On utilise ici la forme fortran90 destin´ ee a ` prendre assez rapidement le relais de la forme fortran77 : real a, b, c, ´ egalement accept´ ee par g95.
20
Licence de physique L3 : Physique Fondamentale & PHYTEM,
L’affectation de valeurs initiales `a certaines variables peut ˆetre faite directement dans la d´eclaration :
Tab. 2.6 – Liste des types de variables : d´eclaration type des variables integer entier real r´eel double precision r´eel en double pr´ecision complex complexe double complex complexe en double pr´ecision character chaˆıne de caract`eres logical variable logique
program addition implicit none real :: a, b = 1.414, c = 1.732 a = b + c write(*,*) a end
En fortran, il existe ce que l’on appelle des d´eclarations implicites, survivance des anciennes versions de ce langage de programmation, qu’il est formellement d´econseill´e d’utiliser16 . Pour les rendre inop´erantes, on utilise l’instruction : implicit none
2.2.3
Op´ erations nombres.
´ el´ ementaires
sur
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
les
Un programme ´el´ementaire pourrait donc ˆetre : program addition ! DEBUT DU PROGRAMME implicit none ! PAS DE DECLARATIONS IMPLICITES real :: a, b, c ! DECLARATION DE 3 VARIABLES REELLES ! DEBUT DES INSTRUCTIONS EXECUTABLES b = 1.414 ! PLACER LA VALEUR 1.414 DANS b c = 1.732 ! PLACER LA VALEUR 1.732 DANS c a = b + c ! SOMMER & PLACER LE RESULTAT DANS a write(*,*) a ! IMPRIMER LE CONTENU DE a end ! FIN DU PROGRAMME
L’instruction end marque la fin du programme. L’instruction program donne un nom au programme qui peut ˆetre distinct du nom du fichier-source qui le contient. Tab. 2.7 – Liste des op´erations sur les nombres : L’addition La soustraction La multiplication La division La mise `a la puissance
s’´ecrit s’´ecrit s’´ecrit s’´ecrit s’´ecrit
: : : : :
+ * / **
e.g. e.g. e.g. e.g. e.g.
: : : : :
a + b 3. - x a*b p/q x**p
On peut m´elanger les types integer, real, double precision, complex et double complex au sein de la mˆeme expression. Ainsi : complex :: z, t integer :: k = 392 real :: x = 1.03 , y = 0.707 z = (3.7,9.03) t = x**2 + (k-1)/z**y
calcule x2 + k −y 1 . Le r´esultat est un nombre complexe. z Noter qu’un nombre complexe s’´ecrit en donnant parties qui calcule la somme de 1,414 et 1,732 et imprime le r´esultat (instruction write). Il faut noter que le passage r´eelle et imaginaire entre parenth`eses et s´epar´ees par une a la ligne signifie la fin d’une instruction, ` ` a la diff´erence virgule. d’autres langages comme pascal ou C. On peut cependant ´ecrire plusieurs instructions par ligne en les s´eparant 2.3 Premi` eres boucles. par un point-virgule, ainsi : program addition implicit none real :: a, b, c b = 1.414 ; c = 1.732 ; a = b + c write(*,*) a end
La d´ecimale des constantes r´eelles est marqu´ee par un point et non une virgule (1.414 et non 1,414). Une constante r´eelle doit comporter un point : 1. est une constante r´eelle, mais 1 est une constante enti`ere, 2./3. est une constante r´eelle qui vaut 0,666667, alors que 2/3 est une constante enti`ere, r´esultat de la division du nombre entier 2 par le nombre entier 3, elle vaut donc z´ero ! On peut aussi utiliser la notation dite « scientifique » (comme avec une calculette) pour les nombres r´eels, 1, 6 10−19 s’´ecrit : 1.6e-19, c’est plus ´economique qu’aligner de nombreux z´eros. . . La lettre e ne d´esigne pas ici une variable mais indique l’exposant17 . 16 La raison en est que si l’on fait une faute de frappe en tapant le nom d’une variable (par exemple nb pas au lieu de nbr pas), l’ordinateur cr´ eera simplement une nouvelle variable, avec des r´ esultats. . . impr´ evisibles ! Si l’on rend obligatoire la d´ eclarations de toutes les variables, alors le compilateur d´ etectera en principe une variable non-d´ eclar´ ee et produira un message d’erreur appropri´ e. 17 on peut parfaitement ´ ecrire une instruction du type : e = 1.6e-19, il n’y a aucune confusion possible.
2.3.1
Pour quoi faire ?
L’une des grandes qualit´es des ordinateurs est leur capacit´e `a effectuer des calculs r´ep´etitifs avec des valeurs num´eriques diff´erentes. Imaginons par exemple que l’on veuille calculer x3 pour x variant de -10 `a +10 par pas de 0,1. On pourrait bien sˆ ur ´ecrire : implicit none real :: x = -10.0, y y = x**3 x = x + 0.1 ; y = x**3 x = x + 0.1 ; y = x**3 x = x + 0.1 ; y = x**3 x = x + 0.1 ; y = x**3 x = x + 0.1 ; y = x**3 ...
etc. L’instruction x = x + 0.1 prend la valeur de x en m´emoire, lui rajoute 0,1 et ´ecrit le r´esultat dans le mˆeme emplacement : le contenu de x est donc augment´e de 0,1. Donc, x commence par valoir -10, puis −10 + 0, 1 = −9, 9 et l’on calcule y, puis 9,8 avec un nouveau calcul de y, etc. On remarque cependant que la s´equence : x = x + 0.1 ; y = x**3
doit ˆetre r´ep´et´ee autant de fois que l’on veut faire le calcul (ici, 201 fois).
21
Physique num´erique, Philippe Depondt
2.3.2
Pratiquement. . .
2.3.3
Boucles imbriqu´ ees
Une fa¸con plus ´el´egante de proc´eder consiste ` a utiliser Les boucles peuvent ˆetre imbriqu´ees les unes dans les une boucle afin de r´ep´eter un grand nombre de fois le mˆeme autres : calcul en faisant varier un param`etre, ainsi : implicit none integer :: i real :: x, y do i = -100, 100 x = 0.1*i y = x**3 enddo
signifie que l’instruction y = x**3 doit ˆetre r´ep´et´ee pour toutes les valeurs de l’indice i allant de -100 `a 100 : ainsi x prend successivement les valeurs -10., -9.9, . . .0.1, 0., 0.1,. . .9.9, 10.18 et l’on doit calculer y pour chacune de ces valeurs. L’instruction enddo marque la fin du « bloc » : toutes les instructions comprises entre do et enddo font partie du mˆeme ensemble qui doit ˆetre ex´ecut´e pour chaque valeur de i. Il faut remarquer au passage qu’` a chaque tour de la boucle la variable y est modifi´ee et que donc les anciennes valeurs sont oubli´ees : ` a la fin, seule la derni`ere valeur calcul´ee reste. Il faut donc penser ` a faire quelque chose des valeurs interm´ediaires si on en a besoin : les ´ecrire par exemple. Ainsi, implicit none complex :: z, zim=(0.0,1.0) integer :: i real :: omega = 6.283185, t do i = 0, 1000 t = 0.1*i z = exp(zim*omega*t) ; write(*,*) t, z enddo
va calculer z = eiωt pour t variant de 0 ` a 100, par pas de 0, 1 et ´ecrire les r´esultats sur l’´ecran. Noter la d´eclaration du nombre imaginaire i dans la variable zim, dont la partie r´eelle est nulle et la partie imaginaire ´egale ` a 1. Un autre exemple : implicit none integer :: k, s2 = 0 do k = 1, 10 s2 = s2 + k**2 enddo
calcule la somme des 10 premiers carr´es. Le pas de la boucle est implicitement ´egal ` a 1, mais on peut le choisir explicitement : do k = 1, 10, 2 s2 = s2 + k**2 enddo
do k = kmin, kmax ... do ix = ixmin, ixmax ... enddo ... enddo
ainsi, la boucle interne sur x s’ex´ecutera pour chaque valeur de k et les instructions qu’elle comporte se r´ep´eteront donc (kmax-kmin+1)*(ixmax-ixmin+1) fois : cela peut faire beaucoup. Par exemple, si kmax=1000, kmin=1, ixmax=10000, ixmin=1, la boucle interne s’ex´ecutera 107 fois, et si elle prend 10−3 seconde `a l’ex´ecution, le programme, lui, prendra 104 s soit 2h45mn ! Si maintenant, la boucle externe est elle-mˆeme imbriqu´ee dans une autre boucle, on obtient tr`es facilement un programme tr`es lourd. . .
2.3.4
Boucles munies d’un nom
Quand plusieurs boucles sont imbriqu´ees, il est parfois utile de leur donner un nom afin de clarifier le d´ebut et la fin de chacune : boucle1 : do k = kmin, kmax ... ... boucle2 : do i = imin, imax ... ... enddo boucle2 ... ... enddo boucle1
2.4
Conditions.
Il arrive que l’on veuille que certaines instructions ne s’ex´ecutent que dans certaines conditions. Par exemple, si l’on a calcul´e une quantit´e y, on peut en vouloir la racine carr´ee uniquement si y est positif :
calcule la somme 12 + 32 + 52 + 72 + 92 , et : do k = 10, 1, -1 ... enddo
descend de 10 `a 1. Note « esth´etique » : les instructions du bloc compris dans la boucle sont d´ecal´ees d’une ou plusieurs colonnes, c’est l’indentation. Cela ne pr´esente aucun caract`ere obligatoire et ne fait pas partie des r`egles du langage, mais c’est une bonne habitude qui rend la lecture des programmes nettement plus facile. 18 On note au passage que l’expression 0.1*i m´ elange une constante r´ eelle et un entier : le r´ esultat est r´ eel.
if( y > 0.0 ) then z = sqrt(y) endif
La fonction sqrt qui calcule la racine carr´ee (square root) est dite « intrins`eque » parce qu’elle fait partie des fonctions que tout compilateur fortran doit fournir. L’expression y > 0.0 est du type logique, cela signifie qu’elle ne peut prendre que deux valeurs : .TRUE. (vrai) si y > 0 et .FALSE. (faux) si y ≤ 0. Deux ´ecritures sont possibles pour les op´erateurs logiques, premi`ere et deuxi`eme colonnes ci-dessous :
22
Licence de physique L3 : Physique Fondamentale & PHYTEM,
> < >= <= == /=
.gt. .lt. .ge. .le. .eq. .ne. .and. .or. .not.
> (greater than) < (less than) ≥ (greater or equal ) ≤ (less or equal ) = (equal ) 6 = (not equal ) et ou contraire d’une expression logique
Ne pas oublier les points de part et d’autre des op´erateurs logiques de la deuxi`eme colonne. L’op´erateur logique == qui est une comparaison, est distinct du signe « d’´egalit´e » = qui signifie en fait « mettre quelque chose dans une variable ». L’expression : a == b
est une expression logique qui prend une valeur, soit vraie soit fausse, et a = b
est une instruction qui place la valeur de b dans a. . ., ainsi, integer :: a, b logical :: ok ok = a == b
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
if( y < 0.0 ) write(*,*) ’y est negatif !’ z = sqrt(y)
Ici, on se borne `a mettre un message d’avertissement, mais l’instruction suivante s’ex´ecutera de toutes fa¸cons et le programme donnera la valeur NaN (Not a Number ) `a z. On peut aligner autant de else if que l’on souhaite19 . Cependant si l’on a une s´erie de possibilit´es `a envisager, l’instruction select case20 peut ˆetre plus commode. Par exemple : implicit none integer :: a write(*,*) ’entrer un nombre’; select case( a ) case( : 1 ) write(*,*) ’a est plus petit case( 10 : ) write(*,*) ’a est plus grand case (2 : 3 ) write(*,*) ’a est entre 2 et case default write(*,*) ’a est entre 4 et end select end
read(*,*) a
ou egal a 1’ ou egal a 10’ 3’ 9’
Un autre exemple, pour convertir des unit´es anglosaxonnes en unit´es m´etriques :
signifie que la variable logique ok prend la valeur .TRUE. program metre si a et b sont ´egaux et .FALSE. sinon. implicit none On peut aussi utiliser des variables logiques de fa¸con real, parameter plus compliqu´ee : logical :: ok real :: x, y ... ... ok = y > 0.0 .and. x <= y if (.not. ok ) then write(*,*) ’Il y a un probleme quelque part’ stop endif
L’instruction stop arrˆete l’ex´ecution du programme. On peut pr´evoir une alternative : si une condition est v´erifi´ee, on fait une chose, sinon on fait autre chose : if( y >= 0.0 ) then z = sqrt(y) else write(*,*) ’y est negatif’ stop endif
Le deuxi`eme volet de l’alternative peut ˆetre lui-mˆeme soumis a` condition : if( y >= 0.0 ) then z = sqrt(y) else if ( y > -0.0001 ) then write(*,*) ’y est compris entre -0.0001 et 0.0 :’ write(*,*) ’on le considere comme presque nul’ z = 0. else write(*,*) ’y est franchement negatif’ stop endif
Si l’on n’a qu’une instruction ` a ex´ecuter dans le if, on peut la fusionner dans l’instruction if :
:: c = 0.3048, kt = 1.852, & mph = 1.609, & gallon = 3.7854118, lbs = 0.45455 real :: l character(len=10) :: unit ! le premier argument de la ligne de commande est la ! quantite, le deuxieme l’unite. ! s’il n’y a pas deux arguments, poser la question ! explicitement if ( command_argument_count() >= 2 ) then call get_command_argument(1,unit) read(unit,*) l ! convertir la chaine de caracteres ! en reel (cf ’chaines de caracteres’) call get_command_argument(2,unit) else write(*,’("Entrer la longueur et l’’unite ",$)’) read(*,*) l, unit endif select case(trim(unit)) case (’ft’,’feet’,’foot’,’pieds’,’pied’) write(*,*) l*c,’ metres’ case (’in’,’inch’,’inches’,’pouces’,’pouce’) write(*,*) 1000.*l*c/12.,’ mm’
19 Pour bien appr´ ecier le confort (et la s´ ecurit´ e) qu’apporte la structure if(...) then, il faut rappeler le fonctionnement du if arithm´ etique en usage dans les premi` eres version du langage fortran : if(k) 100,101,102 100 .... go to 103 101 .... go to 103 102 ... 103 ... ce qui signifie que si k est n´ egatif, l’on va a ` l’´ etiquette 100, si k est nul, alors on va en 101 et sinon en 102, apr` es quoi, l’instruction situ´ ee en 103 est ex´ ecut´ ee. Bien ´ evidemment, rien n’empˆ eche, par exemple, un go to 101 n’importe o` u ailleurs dans le programme. . . 20 h´ eriti` ere du go to calcul´ e d’antan.
23
Physique num´erique, Philippe Depondt
program racines case(’m’,’metres’) implicit none write(*,*) l/c,’ ft’ real :: xmin, xmax, dx, x, y case(’kt’,’kts’,’knots’,’noeuds’) integer :: i, imin, imax write(*,*) l*kt,’ km/h’ write(*,*) ’** Ce programme calcule **’ case(’nm’) write(*,*) ’** une serie de racines carres **’ write(*,*) l*kt,’ km’ write(*,*) ’Tapez sur le clavier’ case(’mph’) write(*,*) ’les valeurs de xmin et xmax :’ write(*,*) l*mph,’ km/h’ read(*,*) xmin, xmax case(’mile’,’miles’) write(*,*) ’Donnez egalement le pas :’ write(*,*) l*mph,’ km’ read(*,*) dx case( ’gal’, ’gallon’, ’gallons’) imin = xmin/dx ; imax = xmax/dx write(*,*) l*gallon, ’l’ case(’lbs’, ’lb’, ’pound’, ’pounds’,’livre’, ’livres’)do i = imin, imax x = i*dx write(*,*) l*lbs, ’kg’ if( x < 0.0 ) then case default write(*,*) ’x est negatif : x=’, x write(*,*) ’unite inconnue’ else end select y = sqrt(x) end write(*,*) ’la racine carree de ’,x, ’ est ’, y de sorte que l’on obtient, par exemple : endif ~$ metres 175 lbs enddo end 79.54625 kg
2.5
Entr´ ees-sorties.
Il s’agit des instructions d’´ecriture et de lecture.
2.5.1
´ Ecran et clavier.
L’instruction : write(*,*) x
2.5.2
Les fichiers.
2.5.2.1
Fichier texte
Ce que l’on ´ecrit sur l’´ecran disparaˆıt assez rapidement. Si l’on veut conserver des r´esultats de calcul afin de les relire ou les traiter avec un autre programme ou encore les utiliser pour tracer une courbe, il faut les ´ecrire dans un fichier du disque dur de l’ordinateur. Pour cela, il faut commencer par « dire » que l’on veut ´ecrire dans un fichier avec l’instruction open :
´ecrit sur l’´ecran du terminal la valeur de x. Si x vaut open(1,file=’resultats’) 3,14159, on obtiendra 3.14159. En revanche : write(*,*) ’x’
´ecrira la lettre x sur l’´ecran, puisque ’x’ d´esigne une chaˆıne de caract`eres. Par exemple : write(*,*) ’x=’, x
Ainsi, on fait le lien entre le fichier resultats et l’unit´e 1 : maintenant, si l’on ´ecrit dans cette unit´e, cela revient `a ´ecrire dans ce fichier, par exemple : open(1,file=’resultats’) write(1,*) x, y write(1,*) ’Age du capitaine = ’, agdcpt
donnera : x= 3.14159, l’ordinateur commence par ´ecrire la chaˆıne de caract`eres x=, puis la valeur de la variable x. ´ecrit dans le fichier resultats. L’instruction : Lorsqu’on a fini d’´ecrire on « ferme » le fichier `a l’aide de
read(*,*) x
lit sur le clavier du terminal la valeur de x. Ainsi : read(*,*) x write(*,*) ’Vous venez de taper x=’, x
a pour effet que le programme arrivant ` a l’instruction read s’interrompt pour attendre que l’on tape quelque chose sur le clavier, puis repart pour ex´ecuter l’instruction suivante. Le premier * dans (*,*) apr`es read et write repr´esente l’unit´e d’´ecriture ou de lecture, c’est ` a dire l’endroit o` u l’on ´ecrit ou o` u l’on lit : il s’agit du clavier ` a la lecture et de l’´ecran `a l’´ecriture. Le deuxi`eme repr´esente le format, c’est-`a-dire, par exemple pour un nombre r´eel, le nombre de colonnes qu’il doit occuper et le nombre de chiffres apr`es la d´ecimale : on peut le pr´eciser explicitement, mais en g´en´eral le format * (list directed format en anglais ou : format contrˆol´e par la liste [des arguments]), o` u l’ordinateur doit se d´ebrouiller avec ce qu’on lui fournit, convient tr`es bien. Voici donc un programme qui r´esume ce qui pr´ec`ede :
close(1)
Ce que l’on obtient est un fichier texte que l’on peut lire et modifier (sous unix et non dans le programme lui-mˆeme) `a l’aide d’un ´editeur comme emacs ou vi, par exemple : emacs resultats &
ou bien, si l’on souhaite seulement le lire sans en modifier le contenu : more resultats
Si, dans un mˆeme programme, l’on fait plusieurs ´ecritures `a la suite les unes des autres, elles se placeront les unes derri`ere les autres dans le fichier tant que l’on ne ferme pas le fichier avec un close. Mais, si apr`es un close, l’on refait un open sur le mˆeme fichier, on se retrouve au d´ebut de celui-ci et une nouvelle ´ecriture va donc ´ecraser ce qui s’y trouvait d´ej` a : prudence ! La lecture dans un fichier se fait de la mˆeme fa¸con :
24
Licence de physique L3 : Physique Fondamentale & PHYTEM,
open(10, file=’donnees’) read(10,*) a, b, c close(10)
2.5.3
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Les formats.
Pour une ´ecriture en mode texte, fichier ou ´ecran, on peut pr´eciser la fa¸con dont on veut que les choses soient On peut ouvrir plusieurs fichiers simultan´ement `a condi- ´ecrites. Ainsi, tion de leur donner des num´eros d’unit´e diff´erents : write(*,’(i5)’) k
open(10, file=’coefficients’) open(11, file=’bornes’) open(12, file=’polynome’) read(10,*) a, b, c read(11,*) xmin, xmax, dx imin = xmin/dx ; imax = xmax/dx do i = imin, imax x = i*dx y = (a*x + b)*x + c write(12,*) x, y enddo close(10) ; close(11) ; close(12) end
´ecrira le nombre entier (i pour integer ) k avec 5 chiffres. On notera la syntaxe : la deuxi`eme * du write est remplac´ee par : ’(...)’ o` u les trois points d´esignent la description du format. De mˆeme : write(*,’(f10.3)’) r
doit ´ecrire le nombre r´eel (f pour float, c’est-`a-dire `a d´ecimale flottante) r avec 10 caract`eres (y compris le point de la d´ecimale) dont 3 apr`es la « virgule » : 123456.789 ou 1.414 (avec 5 espaces, repr´esent´es ici par le symbole , pour compl´eter). Si l’on doit ´ecrire plusieurs nombres `a la suite de la mˆeme fa¸con, il n’est pas utile de r´ep´eter explicitement le format, il suffit de le faire pr´ec´eder du Caveat ! Imaginons que l’on ait ´ecrit un programme nombre de fois que l’on veut l’utiliser : dans un fichier-source calcul.f90. On compile avec la write(*,’(3f12.4)’) x,y,z commande habituelle et on lance l’ex´ecution. . ., or dans le programme, il y a les instructions : ´ecrira trois nombres r´eels sur 12 caract`eres (soit 36 colonnes en tout, sachant qu’une feuille de papier ou un teropen(10,file=’calcul.f90’) minal font en g´en´eral 80 colonnes) avec chacun 4 chiffres write(10,*) x, y, z apr`es la d´ecimale, par exemple : close(10) 1234567.8912 3.14161048576.4321 Question : qu’arrivera-t-il au programme-source ? attention, dans cet exemple, il y a bien trois nombres, Ce sont des choses que l’on voit r´eguli`erement arriver, mais le dernier occupe les 12 colonnes, et donc, il n’y a au grand d´esarrois des victimes, car il ne reste plus alors pas d’espace qui le s´epare du pr´ec´edent. On peut mettre des chaˆınes de caract`eres dans un forqu’` a tout retaper mˆeme si calcul.f90 comportait des centaines de lignes ! Un homme - ou une femme - pr´evenu(e) mat : en vaut deux. . . write(*,’("L’’age du capitaine est : ")’) write(*,’(i2," ans")’) age_captain
2.5.2.2
Fichier binaire
L’´ecriture d’un fichier texte suppose que les nombres qui sont stock´es en binaire dans la m´emoire vive de l’ordinateur soient traduits du binaire en caract`eres alphanum´eriques : par exemple le nombre entier 19 s’´ecrit 10011 en binaire et doit ˆetre converti en un caract`ere 1 suivi du caract`ere 9 avant d’ˆetre ´ecrit comme du texte. Il arrive que l’on ait `a produire un tr`es grand nombre de nombres et que cette conversion prenne un temps de calcul non n´egligeable, sans compter la taille du fichier r´esultat. Dans ce cas, on peut avoir int´erˆet ` a ´ecrire directement du code binaire dans le fichier. Evidemment, dans ces conditions on ne peut plus lire ce fichier avec un ´editeur ou l’imprimer sur une imprimante, mais cet inconv´enient n’est pas tr`es important dans le cas pr´esent : qui irait lire directement un fichier de plusieurs centaines de kilo-octets de nombres ? Le but ici est de stocker des donn´ees en vue d’une utilisation ult´erieure `a l’aide d’un autre programme21. Lors de l’ouverture, il suffit de sp´ecifier que le fichier doit ˆetre « non-formatt´e » : open(1,file=’nfich binaire’,form=’unformatted’)
Dans ce cas, il vaut mieux, bien sˆ ur, que le capitaine ne soit pas centenaire. . . Noter que l’apostrophe doit ˆetre redoubl´ee (sinon le compilateur interprˆete cela comme la fin de la chaˆıne de caract`eres). Le format exponentiel ( ou « notation scientifique ») est une autre possibilit´e pour les r´eels, par exemple : ev =1.6e-19 write(*,’("eV=",e13.5)’) ev
donne : eV= 0.16000E-18, soit 13 caract`eres, dont 5 apr`es la virgule. Le format g (g´en´eral) combine f et e x = 1. ; ev = 1.6e-9 write(*,’("x=",g13.5," eV = ",g13.5)’) x, ev
donne : x= 1.00000 eV = 0.16000E-08. C’est assez commode lorsqu’on veut ´ecrire des nombres dont on ne connait pas a priori l’ordre de grandeur, tout en contrˆolant la place qu’ils prendront pour une mise en page. La lettre x dans un format signifie un espace, le symbole / un passage `a la ligne. Au contraire, $ inhibe le passage `a la ligne apr`es un write. Par exemple :
Les instruction d’´ecriture et de lecture se passent alors write(*,’("Donnez l’’age du capitaine : ",$)’) read(*,*) agecpt de sp´ecification de format : write(1) x, y, z read(1) a, b, c 21 Il faut aussi signaler qu’un tel fichier est moins transportable qu’un fichier texte : le codage binaire d´ epend du processeur et si l’on veut utiliser des donn´ ees sur une autre machine que celle o` u elles ont ´ et´ e produites (par exemple un gros calculateur vers un PC linux), alors il est parfois indispensable de passer par l’´ etape texte.
Lors de l’ex´ecution du programme, la question et la r´eponse apparaˆıtront sur la mˆeme ligne du terminal. Les chaˆınes de caract`eres peuvent s’´ecrire avec le format a: salut = "Bonjour" write(*,’(a7)’) salut
25
Physique num´erique, Philippe Depondt
2.6
Les fonctions intrins` eques.
2.7
Autres boucles.
fortran fournit un grand nombre de fonctions in- 2.7.1 do while trins`eques comme sqrt d´ej` a vu et qui permet de calculer La boucle do while permet des logiques plus comla racine carr´ee de son argument. pliqu´ ees que celles qu’on a d´ej` a vues, par exemple : En voici quelques unes : sqrt abs exp log log10 sin asin cos acos tan atan int nint real aimag conjg trim len trim
racine carr´ee valeur absolue exponentielle logarithme logarithme d´ecimal sinus arcsinus cosinus arccosinus tangente arctangente troncature d’un r´eel en entier arrondi d’un r´eel (nearest integer ) partie r´eelle d’un nombre complexe partie imaginaire d’un nombre complexe conjugu´e d’un nombre complexe troncature d’une chaˆıne de caract`eres apr`es le dernier non-blanc nombre de caract`eres de la chaˆıne tronqu´ee
Par exemple : implicit none real :: e0, t, omega, tfin, dt integer :: it, itfin ... itfin = tfin/dt do it = 0, itfin t = it*dt ; write(1,*) t, e0*cos(omega*t) enddo
Les arguments des fonctions trigonom´etriques sont en radians, donc si l’on veut travailler en degr´es, il faut faire la conversion : real :: pi, angle pi = acos(-1.0) write(*, ’("Donnez un angle en degres : ",$)’) read(*,*) angle write(*,*) ’le sinus de ’, angle,’ degres’ write(*,*) ’est ’, sin(pi*angle/180.)
La diff´erence entre int et nint est que si x vaut, par exemple 1,6, alors int(x) donne 1 alors que nint(x) donne 2. On peut utiliser une fonction comme argument d’une autre, ainsi, par exemple, le module d’un nombre complexe z s’´ecrit √ : sqrt(z*conjg(z)), la transcription de l’expression zz ∗ . La commande info g77 permet d’acc´eder, apr`es quelques manipulations, ` a la liste des fonctions intrins`eques connues par g77 (il y en a beaucoup) ainsi qu’` a leur mode d’emploi. Ces renseignements sont donn´es en anglais, mais il n’est pas mauvais de se frotter de temps en temps `a ce genre de documentation. Ces informations ne sont ´evidemment valides en toute rigueur que pour g77, toutefois les fonctions les plus usuelles sont communes ; si le compilateur utilis´e ne reconnait pas une fonction suppos´ee intrins`eque22 , il faut alors consulter une documentation sp´ecifique (Fortran95/2003 explained par exemple). 22 Par
exemple, g77 fait la distinction entre real(z), conversion en
open(1,file=’donnees’) read(1,*) x do while ( x > 0. ) write(*,*) ’La racine de’,x,’ est’, sqrt(x) read(1,*) x enddo close(1)
va lire des valeurs de x dans le fichier tant que la derni`ere valeur de x reste positive, et `a la premi`ere valeur n´egative trouv´ee, l’on passera `a l’instruction close. –Exercice : trouver pourquoi l’on a mis le write avant le read. L’avantage de ce type de boucle est que l’on peut faire des choses assez sophistiqu´ees ; c’est s´eduisant, souvent efficace, mais parfois dangereux, ainsi : implicit none real :: x, dx = 0.1 .... x = 1.0 do while ( x > 0.0 ) ... x = x + dx .. enddo
–Exercice : montrer pourquoi cette boucle va tourner ind´efiniment. . .
2.7.2
Boucles infinies : exit et cycle.
On peut aussi faire des boucles « infinies » dont on ne sort que grˆace `a exit : do write(*,’("Entrer un nombre positif : ",$)’) read(*,*) x if ( x >= 0. ) exit write(*,*) "Apprenez a lire !" enddo y = sqrt(x)
Tant que l’on entrera des nombres n´egatifs, on aura droit `a l’aimable invitation d’apprendre `a lire, mais d`es le premier nombre positif, le programme en calculera la racine carr´ee. L’instruction cycle permet de r´ep´eter une boucle partiellement : do write(*,’("Entrer un nombre positif : ",$)’) read(*,*) x if ( x < 0 ) cycle y = sqrt(x) write(*,*) ’La racine carree de’,x,’ est ’, y if( x == 0. ) exit enddo type r´ eel, et realpart(z), partie r´ eelle d’un complexe, alors que la norme fortran95 pr´ evoit que real prenne justement la partie r´ eelle si son argument est complexe si bien que realpart n’existe pas.
26
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
` chaque fois que l’on tape un nombre n´egatif, l’on obtien- 2.7.3 Boucles a dra la requˆete d’un nombre positif sans que le calcul de la Plutˆ ot qu’´ecrire : racine ne soit fait ; en revanche, si l’on entre un nombre positif, on en obtiendra la racine, et enfin si ce nombre est do i = 1, n write(1,*) x(i) nul (strictement : on verra un peu plus loin ce que cela enddo signifie) on sort de la boucle. Autre exemple : v´erifier qu’un fichier existe d´ej` a avant on peut ´ecrire : de tenter de l’ouvrir en lecture,
implicites.
write(1,*) ( x(i), i = 1, n )
! declaration d’une chaine de 40 caracteres ! qui devra contenir le nom du fichier character (len=40) :: n_fic ! nom de fichier logical :: ok ! variable logique
La diff´erence est que dans le deuxi`eme cas tous les ´el´ements du tableau24 sont ´ecrits sur la mˆeme ligne, sauf si on le pr´ecise par format. Plus concis encore, si x est un tableau :
do
´ecrit tout le tableau. On peut faire la mˆeme chose avec read.
write(*,’(‘‘Nom du fichier de donnees : ‘‘,$)’) read(*,*) n_fic ! lire au clavier le nom du fichier ! inquire est une commande FORTRAN permettant de ! verifier l’existence du fichier inquire(file=n_fic,exist=ok) ! existe: ok = .TRUE. if ( ok ) exit ! et on n’insiste pas ! sinon, il faut recommencer write(*,’(‘‘Fichier non trouve’’)’) enddo open(10,file=n_fic) ! ouverture du fichier ...
Les boucles infinies, assorties de exit et cycle, tendent ` remplacer le do while, souvent consid´er´e comme oba sol`ete. Le until du pascal n’existe pas en fortran : de fait, exit et cycle sont beaucoup plus riches, puisqu’ils peuvent ˆetre plac´es n’importe o` u dans la boucle, et non seulement au d´ebut comme while ou ` a la fin comme until23. Si les boucles ont un nom, exit et cycle en tiennent compte : l1 : do ... l2 : do ... if ( age_du_capitaine < 0 ) exit l1 ... if ( ok ) cycle l2 ... enddo l2 ... enddo l1
write(1,*) x
2.8
Tableaux.
Les tableaux de nombres sont l’´equivalent informatique des vecteurs et des matrices : on peut ainsi d´esigner plusieurs nombres par une seule variable ; le vecteur V de dimension n d´esigne l’ensemble de ses n ´el´ements vi , i ∈ [1, n], la matrice A de dimension (n, m) d´esigne tous les n × m ´el´ements aij , le tenseur T de rang 3 d´esigne tous les ´el´ements tijk , et ainsi de suite. Comme dans ces exemples, un ou plusieurs indices entiers servent `a indiquer l’´el´ement voulu du tableau. Avec les tableaux, on acquiert la capacit´e `a traiter, comme s’il s’agissait d’une seule entit´e, un grand nombre de donn´ees, pour ainsi dire « d’un coup » !
2.8.1
D´ eclaration
La d´eclaration d’un tableau est faite en indiquant les valeurs extrˆemes des indices de chacune des dimensions du tableau, par exemple : real, dimension(1:100) :: x
d´eclare un tableau `a un seul indice qui va de 1 `a 100, c’est`a-dire un tableau unidimensionnel de r´eels `a 100 ´el´ements ou un vecteur `a 100 coordonn´ees si l’on pr´ef`ere. Le i-`eme ´el´ement est d´esign´e par x(i) ; i est bien entendu un entier. Par exemple : real, dimension(0:100) :: x real :: pi = acos(-1.0) integer :: i
Le exit l1 fait sortir de la boucle l1, la plus externe, alors do i = 0, 100 que l’instruction se trouve dans la boucle la plus interne : x(i) = cos(i*pi/100.) c¸a permet de sauter par dessus un niveau d’imbrication. enddo 23 L’int´ erˆ et de ces structures est r´ eel, toutefois pour relativiser, notons qu’en fortranIV, on pouvait tr` es bien fabriquer des logiques similaires a ` ce que permettent exit et cycle, l’esprit ´ etait simplement moins orient´ e « programmation par bloc » et il fallait s’astreindre a ` un minimum de discipline, par exemple : do 100 i = 1, 1000000 ... c ici l’equivalent d’un ‘‘cycle’’ if ( x .gt. y ) go to 100 ... c ici l’equivalent d’un ‘‘exit’’ if ( z .le. 0. ) go to 200 ... 100 continue 200 ... Il ´ etait prudent d’´ eviter de placer l’´ etiquette 200 a ` l’autre bout du programme, du moins si l’on avait l’ambition d’´ ecrire un code « maintenable ». . .
remplit un tableau de 101 ´el´ements avec les valeurs prises par cos θ avec θ ∈ [0, π] par pas de π/100. On peut faire des d´eclarations du genre : real, dimension(-100:100) :: x
ce qui donne dans ce cas un tableau `a 201 ´el´ements dont l’indice varie de -100 `a 100, et alors, on peut acc´eder `a des ´el´ements comme par exemple x(-20). La d´eclaration real, dimension(100) :: x est ´equivalente `a real, dimension(1:100) :: x25 . Pour les tableaux `a plusieurs dimensions, il faut sp´ecifier les valeurs extrˆemes de chacun des indices : 24 voir
les tableaux dans la section suivante. la diff´ erence du langage C pour lequel les tableaux commencent avec l’´ el´ ement 0. 25 a `
27
Physique num´erique, Philippe Depondt
integer, dimension(1:25,-2:2) :: a
integer :: i real, dimension(-2:2) :: x=(/ (2*i, i=-2,2) /)
d´eclare un tableau `a deux dimensions d’entiers de 25 × 5. Le premier indice va de 1 ` a 25, le deuxi`eme de -2 `a 2. Un ´el´ement est donc d´esign´e, par exemple, par a(i,j) ou 2.8.2 a(12,-1). 2.8.2.1 L’exemple suivant : integer complex, dimension(200) complex real omega = 2*acos(-1.0) do i = 1, 200 t = (i-1)*0.005 ; s(i) enddo
:: :: :: ::
integer, parameter real, dimension(l,m) real, dimension(m,n) real, dimension(l,n) integer
l = 20, m = 100, n = 30 x y z i, j, k
Manipulation globale de tableaux n d’un coup ! (mieux que le petit tailleur)
i s im = (0.,1.) omega, t
On peut faire des calculs en manipulant les ´el´ements de tableaux un `a un dans des boucles comme dans les exemples ci-dessus ; c’est d’ailleurs ce que l’on faisait jusqu’` a l’apparition de fortran9026 . La manipulation globale de tableaux est sans doute l’apport le plus important de fortran90 par rapport aux langages qui l’ont pr´ec´ed´e ; = exp(im*omega*t) c’est aussi un ingr´edient qui facilite beaucoup les calculs num´eriques d`es qu’ils deviennent un peu lourds. d´eclare un tableau complexe de 200 ´el´ements et le remplit. Admettons que les ´el´ements du tableau c doivent ˆetre Il peut ˆetre commode de remplacer une dimenla somme des ´el´ements correspondants des tableaux a et sion explicitement fix´ee ` a une certaine valeur, du type dimension(100), par dimension(n) o` u n est un nombre b : entier. Il faut alors d´eclarer n comme un param`etre, c’esta-dire un nombre dont on ne peut pas changer la valeur integer, parameter :: n = 1000 ` integer :: i en cours d’ex´ecution du programme. Ainsi : :: :: :: :: ::
open(10,file=’fichier.x’) ! lecture x do j = 1, m do i = 1, l read(10,*) x(i,j) enddo enddo close(10) open(10,file=’fichier.y’) ! lecture y do j = 1, n do i = 1, m read(10,*) y(i,j) enddo enddo close(10) do j = 1, n ! produit matriciel do i = 1, l z(i,j) = 0. do k = 1, m z(i,j) = z(i,j) + x(i,k)*y(k,j) enddo enddo enddo
real, dimension(n) :: a, b, c !.... ! il faudrait lire les elements de a et b ! dans un fichier par exemple. do i = 1, n c(i) = a(i) + b(i) enddo
En fortran90, la boucle peut se r´esumer en une seule instruction : c = a + b
! ici on fait n additions.
le compilateur se chargeant de v´erifier que tous les tableaux concern´es ont bien la mˆeme dimension. . . On peut donner explicitement les bornes : c(1:n) = a(1:n) + b(1:n)
ce qui a le mˆeme r´esultat que ci-dessus : c¸a n’a aucun int´erˆet dans cet exemple, mais imaginons que l’on veuille additionner la premi`ere moiti´e du tableau a avec la deuxi`eme moiti´e du tableau b et inversement, la deuxi`eme moiti´e de a avec la premi`ere de b : c(1:n/2) = a(1:n/2) + b(n/2+1:n) c(n/2+1:n) = a(n/2+1:n) + b(1:n/2)
ou bien que l’on ne s’int´eresse qu’aux ´el´ements impairs : d´eclare 3 tableaux de 20 × 100, 100 × 30 et 20 × 30, lit les valeurs des ´el´ements de x et y dans des fichiers et fait le c = 0. ! initialisation de c produit des deux matrices dans z (attention ` a la diff´erence c(1:n:2) = a(1:n:2) + b(1:n:2) entre le chiffre 1 et la lettre l). Malgr´e son apparente complexit´e, l’avantage de cette le dernier indice ´etant le pas, comme pour une boucle do27 . fa¸con de d´eclarer les tableaux est que si l’on veut, dans une 26 Plus pr´ ecis´ ement, certains constructeurs d’ordinateurs a ` capanouvelle version du programme, changer une dimension cit´ e vectorielle avaient commenc´ ea ` produire dans les ann´ ees 1980 des d’un tableau, il suffit de changer la valeur du param`etre compilateurs fortran8X sp´ ecifiques a ` leurs machines : fortran90 correspondant et toutes les boucles s’adaptent automati- est l’h´eritier de ces innovations. 27 Il faut toutefois faire un peu attention car la norme ne garanquement. Finalement, il est possible d’initialiser un tableau dans tit pas que les op´erations effectu´ees dans un traitement global de tableau se fassent dans l’ordre des indices de sorte que si un calcul la d´eclaration, comme un scalaire : real, dimension(-2:2) :: x=(/-4,-2,0,2,4/)
ici, x(-2) = -4, x(-1) = -2, etc. Une boucle implicite peut aussi ˆetre utilis´ee pour le mˆeme r´esultat :
d´ epend d’un r´ esultat obtenu pr´ ec´ edemment sur un ´ el´ ement d’indice inf´ erieur, il faut ´ ecrire explicitement une boucle. En revanche, certains ordinateurs sont optimis´ es pour ce genre de calcul et un traitement global, quand il est possible, peut se traduire par un gain de temps sensible.
28
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
c’est, encore une fois, l’´equivalent d’une boucle car x et y ne sont pas des scalaires mais des tableaux de nombres et, Finalement, les conditions s’expriment ` a l’aide de where avec une syntaxe tr`es proche du if, sauf qu’´evidemment en une ligne, est concentr´e un calcul de 5000 sinus. . . fortran90 offre en outre une panoplie de fonctions il s’agit maintenant de tableaux pris globalement : intrins`eques sp´ecialement destin´ees aux op´erations sur integer, parameter :: n = 5000 les tableaux, par exemple, pour obtenir la somme des real, dimension(n) :: x, y ´el´ements d’un tableau : 2.8.2.2
where
! .... where ( x >= 0.) y = sqrt(x) else where y = 0. end where
integer, parameter :: n = 2048 real, dimension(n) :: x real :: y ! .... y = sum(x)
on calcule donc les racines carr´ees de tous les ´el´ements ou de fa¸con plus sophistiqu´ee, la somme des ´el´ements popositifs du tableau x, et l’on annule y pour les ´el´ements sitifs d’un tableau : n´egatifs de x : c’est l’´equivalent de la boucle : integer, parameter :: n = 6723 real, dimension(n) :: x real :: y ! .... y = sum(x, mask = x >= 0.)
integer, parameter :: n = 5000 real, dimension(n) :: x, y integer :: i ! .... do i = 1, n if ( x(i) >= 0.) then y(i) = sqrt(x(i)) else y(i) = 0. endif enddo
2.8.2.3
ce qui suit mask devant ˆetre un tableau logique de la bonne dimension. La moyenne des racines carr´ees donnerait : y = sum(sqrt(x), mask = x >= 0.)/count(x >= 0.)
forall
Imaginons toutefois que l’on veuille, la matrice identit´e d’ordre n : 1 0 0 ... 0 0 1 0 ... 0 0 0 1 ... 0 I= . . . . . . ... .. .. .. 0 0 0 ... 1 0 0 0 ... 0
par exemple, cr´eer 0 0 0 .. .
0 1
il faut pouvoir acc´eder aux termes diagonaux de la matrice : une boucle do peut faire l’affaire, mais celleci impose que les op´erations demand´ees soient effectu´ees s´equentiellement dans l’ordre indiqu´e par l’indice ; sur certains ordinateurs cela peut sensiblement ralentir l’ex´ecution. L’instruction forall est tr`es similaire `a do mais l`eve cette contrainte, ainsi : real, dimension(n,n) :: id ! matrice identite ... id = 0. ! mise a zero des n*n termes forall ( i = 1:n ) id(i,i) = 1.0 ! n termes diagonaux
La fonction intrins`eque count compte le nombre de fois o` u la condition est vraie. Si le tableau est multidimensionnel, on sp´ecifie la dimension sur laquelle la somme doit ˆetre faite : integer, parameter :: n = 237, m = 53 real, dimension(n,m) :: x real, dimension(m) :: y ! .... y = sum(x, dim = 1, mask = x >= 0.)
donne : yj =
n X
xi,j , ∀j ∈ [1, m], le r´esultat est donc
i=1 xi,j ≥ 0
´evidemment un tableau. On peut ´ecrire de fa¸con plus succinte : y = sum(x, 1, x >= 0.)
La fonction product, d’usage similaire, fait le produit des ´el´ements d’un tableau. n X xi yi s’obtient avec Le produit scalaire z =
dot product :
i=1
integer, parameter :: n = 8000
Noter que la syntaxe est un peu diff´erente que celle de do. real, dimension(n) :: x, y real :: z On a aussi : forall ( i = 1:n ) ... end forall
! .... z = dot_product(x,y)
et le produit de deux matrices ci,j =
2.8.3
Fonctions intrins` eques et tableaux
matmul :
Les fonctions intrins`eques du fortran s’accommodent integer, parameter tr`es bien de tableaux, par exemple : integer, parameter :: n = 5000 real, dimension(n) :: x, y ! .... y = sin(x)
m X
ai,k bk,j avec
k=1
:: n = 100, m = 50, p = 32 real, dimension(n,m) :: a ! attention au real, dimension(m,p) :: b ! dimensionnement real, dimension(n,p) :: c ! des tableaux ! .... c = matmul(a,b)
29
Physique num´erique, Philippe Depondt
Nom count(l,mask,dim) dot product(a,b) matmul(a,b) maxloc(a,dim,mask) maxval(a,dim,mask) minloc(a,dim,mask) minval(a,dim,mask) product(a,dim,mask) sum(a,dim,mask)
cshift(a,shift,dim)
eoshift(a,shift, boundary,dim)
pack(a,mask, vector) unpack(a,mask, missing)
Type
Description Fonctions math´ematiques entier nombre de fois o` u le tableau logique l est vrai, selon la dimension dim quand mask est vrai num´erique, mˆeme type que a et b produit scalaire des tableaux unidimensionnels a et b num´erique, mˆeme type que a et b produit des deux matrices a et b entier position du plus grand ´el´ement du tableau a selon la dimension dim quand mask est vrai. entier ou r´eel valeur du plus grand ´el´ement du tableau a selon la dimension dim quand mask est vrai. entier position du plus petit ´el´ement du tableau a selon la dimension dim quand mask est vrai. entier ou r´eel valeur du plus petit ´el´ement du tableau a selon la dimension dim quand mask est vrai. num´erique, du mˆeme type que a produit des ´el´ements du tableau a selon la dimension dim quand mask est vrai num´erique, du mˆeme type que a somme des ´el´ements du tableau a selon la dimension dim quand mask est vrai Transformations de tableaux indiff´erent permutation circulaire des ´el´ements du tableau a selon la dimension dim. Si shift est positif, d´eplacement de shift positions ` a gauche, sinon ` a droite indiff´erent d´ecalage des ´el´ements du tableau a selon la dimension dim. Si shift est positif, d´eplacement de shift positions ` a gauche, sinon ` a droite. Les ´el´ements manquants ` a l’extr´emit´e sont remplac´es par ceux de boundary, ou z´ero si boundary absent. indiff´erent transforme le tableau multidimensionnel a en un tableau unidimensionnel quand mask est vrai, les ´el´ements filtr´es par mask ´etant remplac´es par ceux du vecteur vector indiff´erent transforme le tableau unidimensionnel a en un tableau multidimensionnel quand mask est vrai, les ´el´ements filtr´es par mask ´etant remplac´es par ceux de missing. La forme du tableau r´esultant est celle de mask
Tab. 2.8 – Quelques fonctions de manipulation globale de tableaux. quelles on aimerait pouvoir modifier la taille d’un tableau en cours d’ex´ecution : par exemple, si l’on a ´ecrit un programme qui calcule la moyenne des ´el´ements d’un tableau de nombres de longueur quelconque, il serait agr´eable de pouvoir entrer la taille du tableau, puis le dimensionner, puis faire le calcul sans avoir `a recompiler le programme `a chaque fois que le nombre de nombres dont on veut la 2.8.4 Allocation dynamique de m´ emoire moyenne a chang´e ! L’allocation dynamique de m´emoire permet de d´eclarer Une d´eclaration est, comme on l’a d´ej` a vu, une un tableau sans en donner la taille, puis de lui donner r´eservation d’espace dans la m´emoire vive de l’ordinateur. une taille en cours d’ex´ecution, de le supprimer puis de lui Ainsi, real :: x d´eclare une variable r´eelle x et, de ce donner une autre taille, etc. Par exemple : fait, r´eserve 4 octets (ou 32 bits) en m´emoire, parce que c’est la place qu’occupe un r´eel en simple pr´ecision29 : ces ! declaration d’un tableau unidimensionnel 4 octets sont donc affect´es ` a cette variable et ne peuvent ! sans taille fixe pas ˆetre utilis´es `a autre chose. De mˆeme, lorsqu’on d´eclare real, dimension(:), allocatable :: x un tableau, par exemple real, dimension(n) :: x, on integer :: n r´eserve n fois 4 octets. On comprend donc que cette !... r´eservation doive ˆetre faite avant l’ex´ecution du pro- write(*,’(‘‘Entrer le nombre d’elements ‘‘,$)’) gramme : si l’on veut changer la taille d’un tableau, cela read(*,*) n ! affectation d’une taille donnee au tableau revient `a modifier la taille de l’espace qu’il occupe en allocate(x(n)) m´emoire ; il faut arrˆeter l’ex´ecution du programme, mo- !... ici on fait des calculs 30 difier le code source, recompiler et relancer l’ex´ecution . deallocate(x) ! desaffectation Il existe cependant des quantit´es de situations dans les- ! on recommence avec un tableau plus petit Noter que le r´esultat fourni par cette fonction est lui-mˆeme une matrice. Un r´esum´e (non exhaustif) de quelques fonctions que l’on est amen´e `a utiliser assez souvent est donn´e dans la table 2.828 .
28 NE
PAS apprendre ce tableau par cœur ! 29 pour la plupart des ordinateurs courants. L’usage de mots de 64 bits commence toutefois a ` se r´ epandre assez rapidement. 30 ou alors, en fortran77, en l’absence d’allocation dynamique de m´ emoire, on pr´ evoyait large : on r´ eservait par exemple 1 000 000 d’emplacements pour n’en utiliser finalement que quelques uns.
! qui commence en zero au lieu de un allocate(x(0:n/2-1)) !... deallocate(x)
On g`ere ainsi la m´emoire occup´ee pour ainsi dire
30
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
« au vol », ou plutˆ ot, dynamiquement dans le jargon real s = 0. consacr´e. . .
2.9
Fonctions mes.
et
sous-program-
Rien n’oblige `a ´ecrire tous les calculs que l’on veut faire dans un mˆeme programme : c’est mˆeme assez d´econseill´e ! Pour des raisons, ne serait-ce que de lisibilit´e, on a tr`es souvent int´erˆet `a d´ecouper un gros probl`eme en plusieurs petits pour lesquels les possibilit´es de se tromper sont plus faibles31 . De plus, si le mˆeme type de calcul doit ˆetre r´ep´et´e `a plusieurs endroits du programme (par exemple un calcul d’int´egrale), ce n’est pas la peine de le reprogrammer plusieurs fois. Si, enfin, on a d´ej` a ´ecrit (et test´e) un programme qui sait faire un certain type de calcul (par exemple, calculer une int´egrale num´erique ou r´esoudre un syst`eme lin´eaire d’´equations), il est utile de pouvoir le r´ecup´erer et l’ins´erer dans le programme que l’on est en train de faire sans avoir ` a le re´ecrire. Il existe en outre, et l’on verra dans ce cours un certain nombre d’exemples de leur utilisation, des biblioth`eques de sous-programmes et de fonctions extrˆemement riches, telles linpack, lapack, nag, imsl. . ., dans lesquelles on peut puiser sans vergogne et ainsi ´eviter de r´einventer la roue. Fonctions et sous-programmes sont donc des ingr´edients essentiels !
2.9.1
Les function.
2.9.1.1
D´ efinir une function.
On peut ´ecrire ses propres fonctions en plus des fonctions intrins`eques. On les utilise de la mˆeme fa¸con que les fonctions intrins`eques mais ´evidemment, il faut aussi les d´efinir, alors que les fonctions intrins`eques sont bien sˆ ur pr´ed´efinies. Pour cela, on place les instructions correspondantes, par exemple dans le mˆeme fichier-source que le programme lui-mˆeme, mais en dehors de celui-ci (avant program ou apr`es end. Par exemple, supposons que l’on veuille calculer le barycentre, ` a une dimension, d’un ensemble de nombres lus dans un fichier : program calcul ! debut du programme principal implicit none integer, parameter :: n = 100 real, dimension (1:n) :: x real :: bsom open (1, file=’machin’) read(1,*) x close(1) write(*,*) ’Le barycentre des elements de X est : ’ write(*,*) bsom(x,n) ! appel de bsom end ! fin du programme principal real function bsom(z,m) ! debut de la function bsom implicit none integer :: i, m real, dimension(1:m) :: z 31 c’est
ce que l’on appelle avec quelque p´ edanterie « l’analyse descendante », c’est-` a-dire que l’on divise un probl` eme P a priori compliqu´ e en plusieurs sous-probl` emes P1 , P2 , . . ., puis chaque sousprobl` eme est redivis´ e en P1,1 , P1,2 , . . . , P2,1 , . . ., etc. On arrˆ ete quand tous les sous-sous-sous-. . .-probl` emes sont tellement ´ el´ ementaires qu’il n’y a plus de probl` eme !
:: s
do i = 1, m s = s + i*z(i) enddo bsom = s/sum(z) end
! fin de la function bsom
La premi`ere partie est ce qu’on appelle le « programme principal », la seconde, la fonction32 . L’appel de la fonction dans le programme principal est fait normalement, ici dans une instruction write(*,*) bsom(x,n)
mais cela pourrait ˆetre dans une expression comme r = sqrt(2.0)*bsom(x,n) - k
l’usage d’une fonction est donc tr`es similaire `a celle des fonctions intrins`eques du fortran, comme sin, exp, etc. Dans la d´efinition de la fonction, on doit ´ecrire explicitement l’expression donnant la valeur de la fonction : si l’on oublie l’instruction bsom = s/sum(z), il n’y aura pas d’erreur d´etect´ee, le calcul sera fait normalement, mais le r´esultat ne sera pas transmis au programme appelant. La fonction doit se terminer par l’instruction end qui en marque la fin, comme le programme principal. 2.9.1.2
Les arguments et les variables d’une function.
Dans cet exemple, la fonction r´eelle bsom calcule le barycentre des ´el´ements de z. Le tableau z est un argument de la fonction ( function bsom(z,m) ). Dans l’appel de bsom, le premier argument est le tableau x qui doit avoir le mˆeme type et le mˆeme nombre d’´el´ements que z dans la d´efinition de la fonction : la correspondance entre les variables du programme principal et celles de la fonction est donn´ee par l’ordre dans lequel elles apparaissent dans l’appel et la d´efinition de la fonction. En effet x est la premi`ere variable qui apparaˆıt dans l’appel de bsom(x,n) dans le programme principal et z est la premi`ere dans la d´efinition real function bsom(z,m). Ainsi, x dans le programme principal et z dans la fonction d´esignent la mˆeme variable ; de mˆeme pour n et m. write(*,*) bsom(
1er, 2e argument x, n) appel, dans p. princ.
ll
← correspondance real function bsom( z, m) d´efinition Attention ! Ce n’est pas parce qu’une variable a le mˆeme nom dans une fonction qu’une autre dans le programme principal qu’il s’agit de la mˆeme chose ; au contraire, ces deux variables mˆeme si elles ont le mˆeme nom n’ont aucun rapport ! En revanche, une variable du programme principal repr´esente strictement la mˆeme chose qu’une autre, mˆeme de nom diff´erent, dans la fonction a ` condition d’avoir ´et´e transmise comme argument dans l’appel et la d´efinition de la fonction comme dans l’exemple cidessus33 . Ainsi, la variable x du programme principal est identique `a la variable z de la fonction, mais la variable s de 32 ou
plus pr´ ecis` ement la d´ efinition de la function. seule chose qui soit transmise est l’adresse du premier ´ el´ ement du tableau x. C’est en fait un pointeur masqu´ e! 33 La
31
Physique num´erique, Philippe Depondt
la fonction bsom est compl`etement ind´ependante de ce qui peut ˆetre d´eclar´e dans le programme principal : il pourrait tr`es bien y avoir une autre variable s dans le programme principal sans qu’il y ait la moindre interaction entre les deux. Lorsqu’on apprend ` a programmer, c’est une source d’erreur classique et cela paraˆıt inutilement compliqu´e, mais `a l’usage c’est un grand avantage car ainsi la fonction bsom, une fois ´ecrite et test´ee, est ind´ependante du cadre dans lequel elle est utilis´ee, on peut donc s’en servir dans un grand nombre de circonstances sans se pr´eoccuper du d´etail de la fa¸con dont elle est ´ecrite. Par exemple, on peut tr`es bien avoir oubli´e qu’il y a des variables s et z dans bsom, et faire dans le programme principal un appel du type : z = bsom(s,m)
sans cons´equence dramatique, ` a condition que, dans le programme principal, s soit un tableau de m ´el´ements et z un scalaire r´eel. Il faut donc se rappeler qu’en fortran, il n’y a pas de variables globales, toutes les variables doivent ˆetre explicitement transmises de programme appelant ` a fonction ou sous-programme.
2.9.2
Et les subroutine.
end
Le sous-programme baryc utilise les donn´ees rx, ry, rz, et masse, ainsi que le nombre de masses impliqu´ees, pour rendre les coordonn´ees du centre de masse et la masse totale. Noter la diff´erence avec une fonction : on peut ins´erer l’appel d’une fonction dans une expression, ´ecrire : write(*,*) bsom(x,n)/pi ou bien : xtot = 3.*bsom(x,n) + w, mais un sous-programme doit ˆetre appel´e par un call. Par ailleurs, une fonction doit ˆetre d´eclar´ees car elle a un type : entier, r´eel, double pr´ecision, logique. . . en revanche, un sous-programme ne doit pas ˆetre d´eclar´e mais bien sˆ ur, ses arguments, eux, doivent l’ˆetre, car un sous-programme ne prend pas de valeur, mais se borne `a modifier certains de ses arguments. Les autres remarques concernant l’ind´ependance des variables d’une fonction vis-` a-vis de celles du programme principal et le dimensionnement des tableaux transmis comme argument sont aussi valables dans le cas d’un sousprogramme.
2.9.3
L’intention
On voit, dans l’exemple ci-dessus par exemple, que certains arguments sont des donn´ees que la subroutine doit utiliser pour faire ses calculs (m, x, y, z, n), d’autres (mt, gx, gy, gz) des r´esultats qu’elle doit calculer : les premiers sont donc « en entr´ee », les autres « en sortie », sans que rien dans la syntaxe n’indique cette diff´erence. C’est ici qu’intervient l’id´ee « d’intention » ou intent en anglais. On sp´ecifie, dans les d´eclaration du sous-programme, si un argument est en entr´ee ou en sortie, ainsi :
Une fonction souffre de la limitation qu’elle ne peut produire qu’une seule valeur comme r´esultat : ainsi, si l’on veut calculer plusieurs choses, il faut faire un sous-programme (subroutine). Par exemple, si l’on veut calculer, dans l’espace `a trois dimensions, le barycentre d’un ensemble de masses (donc trois nombres) ainsi que la masse totale (un quatri`eme nombre), on peut proc´eder comme suit : subroutine baryc( gx, gy, gz, mt, x, y, z, m, n ) program cmasse implicit none integer, parameter real, dimension(1:n) real integer
:: :: :: ::
n = 100 masse, rx, ry, rz ogx, ogy, ogz, mtot i
open(1, file=’masses’) do i = 1, n read(1,*) rx(i), ry(i), rz(i), masse(i) enddo close(1) call baryc (ogx,ogy,ogz,mtot,rx,ry,rz,masse,n) write(*,*) ’Masse totale : ’, mtot write(*,*) ’Coordonnees du centre de masse : ’ write(*,*) ogx, ogy, ogz end
implicit none integer, intent(in) :: n real,intent(out) :: gx, gy, gz, mt real, dimension(1:n), intent(in) :: m, x, y, z mt gx gy gz
= = = =
sum(m) dot_product(x,m)/mt dot_product(y,m)/mt dot_product(z,m)/mt
end
Cela a deux cons´equences : 1o c’est plus clair pour le programmeur, 2o le compilateur d´etectera une erreur si, par exemple, on essaie de modifier un argument d´eclar´e in. L’intent(inout) existe aussi, pour les arguments dont on doit utiliser la valeur en entr´ee, mais que l’on doit ´egalement modifier.
2.9.4 subroutine baryc( gx, gy, gz, mt, x, y, z, m, n ) implicit none integer :: n real :: gx, gy, gz, mt real, dimension(1:n) :: m, x, y, z mt gx gy gz
= = = =
sum(m) dot_product(x,m)/mt dot_product(y,m)/mt dot_product(z,m)/mt
La mise en commun de variables.
On a vu que fonctions et sous-programmes ´etaient `a peu pr`es ´etanches vis-` a-vis du monde ext´erieur, `a l’exception, ´evidemment, des variables transmises comme arguments : c’est un avantage, mais, c’est parfois un peu rigide. On peut alors mettre en commun des variables entre programme et sous-programme ou entre sous-programmes ou fonctions diff´erents, `a l’aide de modules. Imaginons, par exemple, un code comprenant un programme principal et des sous-programmes qui utilisent tous la grandeur π et les conversions entre degr´es et radians. Plutˆ ot que red´efinir ces grandeurs dans chaque programme et sous-programme,
32
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
on peut commencer par faire un module, plac´e au d´ebut (si c’est un programme compliqu´e surtout si on ne l’a pas du fichier source : ´ecrit soi-mˆeme, c’est toujours un peu dangereux), il suffit de faire un module pour mettre ces variables en commun module trig_consts entre le programme principal et B : on saute, pour ainsi ! definition de constantes trigonometriques dire, par-dessus A ! implicit none real, parameter :: pi = acos(-1.0) real, parameter :: deg_rad = pi/180. real, parameter :: rad_deg = 180./pi end
il s’agit simplement de d´eclarations (ici de param`etres, mais ce n’est pas obligatoire) et, le cas ´ech´eant, d’affectations de valeurs. Dans un programme ou sous-programme dans lequel on veut utiliser ces variables, il faut sp´ecifier au d´ebut des d´eclarations
2.9.5
Mettre un nom de sous-programme comme argument.
Admettons que l’on ait ´ecrit une fonction somdef qui sache calculer une int´egrale d´efinie : il faut lui transmettre comme argument, outre les bornes xmin et xmax de l’int´egrale et la pr´ecision eps souhait´ee, le nom de la fonction `a int´egrer. Par exemple : xmin = 0. ; xmax = acos(-1.0) write(*,*) somdef( xmin, xmax, eps, sin )
use trig_consts
et les variables pi, deg rad et rad deg sont utilisables sans si l’on veut calculer l’int´egrale de 0 `a π de sin x. Cepenautre forme de proc`es ; ainsi, si theta est un angle donn´e dant, si l’on proc`ede sans pr´ecaution, le compilateur diagen degr´es : nostiquera que la variable sin n’est pas d´eclar´ee, et dira quelque chose qui peut ressembler `a : Error : Symbol sin_theta = sin(deg_rad*theta) ’sin’ at (1) has no IMPLICIT type, ce qui est abest correct mˆeme si deg rad n’a pas ´et´e d´eclar´e dans le surde puisqu’il s’agit d’une fonction intrins`eque. . . C’est a, il ne reconnait pas sin comme programme. Quand on fait cela, il faut faire un peu atten- que dans ce contexte l` tion, puisque si l’on a une autre variable pi dans un des une fonction : il faut donc le pr´eciser dans les d´eclarations programmes qui utilisent ce module, il y aura un conflit avec intrinsic. d´etect´e par le compilateur. Cependant, comme il faut faire real :: xmin, xmax, eps, somdef appel explicitement par use aux modules dont on a besoin intrinsic :: sin dans chaque sous-programme qui l’utilise, les d´egats po... 34 tentiels restent limit´es : on peut tr`es bien imaginer des xmin = 0. ; xmax = acos(-1.0) structures comme : write(*,*) somdef( xmin, xmax, eps, sin )
module blabla ! acceleration de la pesanteur terrestre real, parameter :: g=9.81 end program truc use blabla implicit none real :: p, m = 75 p = m*g write(*,*)’Poids =’,p call machin(p) end
! rappel du module blabla
subroutine machin(poids) implicit none ! ici pas de module blabla real, intent(in) :: poids real :: g= 2. write(*,*) ’Poids a’,g ,’ g =’, poids*g end
La variable g de machin n’a rien ` a voir avec celle du module et du programme principal, puisque machin n’utilise pas le module blabla (il n’y a pas use blabla). Outre la d´efinition de constantes, un des usages les plus courants des modules est quand un programme principal appelle un sous-programme A qui lui-mˆeme en appelle un autre B. A priori, les seules variables connues du sousprogramme B sont celles que lui a transmises A, or il se peut tr`es bien qu’il ait besoin d’autres grandeurs utilis´ees par le programme principal. Si l’on ne veut pas modifier A 34 De ce point de vue, on reste assez loin des variables globales du C dont les auteurs du langage disent eux-mˆ emes que ce n’est pas ce qu’ils ont fait de mieux ! (B. W. Kernighan, D. M. Ritchie, Le langage C, Masson (1997), p. 33.)
De mˆeme, s’il s’agit d’une fonction mafct que l’on a ´ecrite soi-mˆeme, il faut la d´eclarer par external real :: xmin, xmax, eps, somdef external :: mafct ... xmin = .. ; xmax = .. write(*,*) somdef( xmin, xmax, eps, mafct )
Les mˆemes r`egles s’appliquent pour les sousprogrammes35. Ce sont l` a les seuls cas d’utilisation de intrinsic et external : quand on ne transmet pas comme argument le nom d’un sous-programme ou d’une fonction `a un autre sous-programme ou fonction, il est compl`etement inutile d’utiliser ces d´eclarations36.
2.9.6
Les biblioth` eques.
2.9.6.1
Pour quoi faire ?
Imaginons que l’on ait ´ecrit une s´erie de sousprogrammes, par exemple des calculs d’int´egrale, dont le code-source, c’est-`a-dire ´ecrit en Fortran, est plac´e pour chaque sous-programme dans un fichier dont le nom se termine par .f90. Pour r´eutiliser ces sous-programmes dans d’autres programmes, on peut bien sˆ ur simplement inclure les fichiers correspondants `a l’aide de directives include 35 Certains compilateurs plus anciens n’acceptent que l’ancienne syntaxe external mafct (sans les ::). 36 Cette affirmation est en fait un peu p´ eremptoire. . ., on peut imaginer des situations o` u cela peut ˆ etre n´ ecessaire, par exemple si l’on a ´ ecrit soi-mˆ eme un sous-programme dot product qui risque d’entrer en conflit avec la fonction intrins` eque de mˆ eme nom ; la d´ eclaration external r´ esout alors le probl` eme.
33
Physique num´erique, Philippe Depondt
’nom de fichier.f90’, c’est d’ailleurs ce que l’on fait souvent. Toutefois, il arrive que ces sous-programmes aient euxmˆeme besoin d’autres sous-programmes pour fonctionner. Par exemple, les programmes de calcul de tranform´ee de Fourier vont tous utiliser le mˆeme algorithme, mais vont diff´erer selon que l’on veut une transform´ee directe ou inverse : ainsi le programme que l’on appelle ne fait qu’appeler un autre programme en modifiant ´eventuellement un signe ; il faudrait alors inclure explicitement les deux sous-programmes, ce qui suppose que l’on connaisse sp´ecifiquement comment tout cela est organis´e : autant dire que c’est rarement le cas quelques ann´ees apr`es l’´ecriture initiale. Une bonne solution est alors de constituer une biblioth`eque (library en anglais37 ). Une biblioth`eque est un fichier dans lequel sont regroup´es un ensemble se sous-programmes d´ej` a compil´es et dans lequel le compilateur peut aller pˆecher ce dont il a besoin, par exemple un sous-programme de calcul de transform´ee de Fourier et tous les sous-programmes auxquels celui-ci fait appel : dans le programme principal, il suffira de faire un call du sous-programme voulu. 2.9.6.2
Cr´ eer une biblioth` eque personnelle.
On a donc ´ecrit un certain nombre de sous-programmes et de fonction (dˆ ument test´es, bien sˆ ur. . .) plac´es dans des fichiers machin 01.f90, machin 02.f90, truc real.f90, truc dbl prec.f90, etc. Si on compile tout cela par g95 *.f90, le compilateur refusera de la faire parce qu’il n’y a pas de programme principal : il faut donc inhiber l’´editeur de lien38 avec l’option -c et pendant qu’on y est, on peut demander une optimisation du code avec l’option -O3. Cela donne : g95 -c -O3 *.f90 on obtiendra alors une s´erie de fichiers machin 01.o, machin 02.o, truc real.o, truc dbl prec.o, etc. Ces fichiers doivent alors ˆetre inclus dans un fichier d’archive : ar rv libmabib.a *.o Le fichier libmabib.a contient la biblioth`eque mabib. On peut alors supprimer tous les fichiers interm´ediaires : rm -f *.o Pour utiliser cela, il suffit de compiler normalement son programme principal, dans lequel il y a des call machin 01(arg1, arg2), avec la commande : g95 big prog.f90 -Lrepertoire de mabib -lmabib -o big prog u se trouve o` u repertoire de mabib est le r´epertoire o` le fichier libmabib.a. Si l’on peut placer le fichier libmabib.a dans le r´epertoire /usr/local/lib39, l’option -L n’est plus n´ecessaire. 2.9.6.3
Utiliser une biblioth` eque existante.
d’invoquer `a la compilation par : g95 mon big prog.f90 -llapack -o mon big prog Cela suppose ´evidemment que l’on ait la documentation qui va avec, mais c’est g´en´eralement facile `a obtenir via Internet. C’est tr`es souvent ainsi que l’on travaille dans « le monde r´eel de la simulation » : pour r´esoudre un probl`eme, on identifie une m´ethode de r´esolution dont le noyau r´eside dans un algorithme connu (inversion de matrice, transform´ee de Fourier, valeurs propres, . . .) et l’on trouve le programme de biblioth`eque convenable, on l’appelle et on compile l’ensemble avec l’invocaton de la biblioth`eque idoine : un appr´eciable gain de temps !
2.10
Les commentaires.
On peut, et c’est mˆeme conseill´e, commenter ses programmes, d’ailleurs les exemples donn´es ci-dessus comportent des commentaires. Pour cela, il suffit d’utiliser le symbole ! qui marque le d´ebut d’un commentaire qui ne sera donc pas interpr´et´e comme une instruction `a ex´ecuter : ! ceci est un commentaire, mais la ligne ! qui suit est une instruction read(*,*) x
C’est tr`es utile quand on veut pouvoir s’y retrouver dans un programme ´ecrit quelques temps avant, par exemple : !----------------------------------------------! Ceci est un programme ecrit le 06-11-98 ! par Tycho Brahe ! Il comporte trois boucles imbriquees ! ! Mise a jour (adaptation free form) le 18-12-01 ! par Johannes Kepler !----------------------------------------------.... ! debut de la grande boucle do i = 1, n ...... ...... ! debut de la moyenne boucle do j = 1, m ........ ........ ! debut de la petite boucle do k = 1, l ...... ...... ...... enddo ! fin de la petite boucle ...... ...... enddo ! fin de la moyenne boucle ..... ..... enddo ! fin de la grande boucle
Il est toutefois assez rare que l’on ait ` a cr´eer une biblioth`eque de toutes pi`eces : l’essentiel des algorithmes courants a d´ej` a ´et´e programm´e, compil´e, test´e, etc., il est inutile -voire nocif- de les refaire ! Pour l’alg`ebre lin´eaire, il y a par exemple lapack qu’en g´en´eral, il suffit Si chaque s´erie de points (.....) repr´esente plusieurs centaines d’instructions, les commentaires qui en marquent le 37 attention aux faux amis : en anglais, library signifie biblioth` eque d´ebut et la fin ne sont pas de trop. . . (l’endroit o` u l’on emprunte des livres) alors que librairie (l’endroit Le point d’exclamation plac´e ailleurs qu’en colonne 1, o` u l’on ach` ete des livres) se dit bookstore. . . 38 c’est ce qui fait le lien entre programmes et sous-programmes. transforme la fin de la ligne en commentaire, sans en af39 il faut pour cela les droits de super-utilisateur. fecter le d´ebut :
34
Licence de physique L3 : Physique Fondamentale & PHYTEM,
x = a + b z = (x/p)**1.5 k = mod(j,6)
! a partir d’ici c’est un ! commentaire, mais le debut de ! ces lignes s’execute normalement
2.12.2
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Op´ erations sur les chaˆınes
On peut faire quelques op´erations sur les chaˆınes de caract`eres, par exemple :
Les d´eclarations de variables sont souvent un bon eni = len_trim(salut) droit pour mettre des commentaires : program capitaine implicit none ! ce programme calcule l’age du capitaine integer, parameter :: n = 100 ! nbr de points de ! discretisation real :: age_captain ! age du capitaine real, dimension(n) :: work ! zone de travail
2.11
Une instruction sur plusieurs lignes.
Il arrive qu’une instruction soit trop longue pour tenir sur une ligne : il faut donc la prolonger sur la ligne suivante. Pour cela, il suffit de placer le caract`ere & `a la fin de la ligne pour indiquer que la ligne suivante en est la suite : write(*,*) ’L’’age du capitaine est ’, ag_cpt, & ’ mais on manque un peu de place ’, & ’: d’’ailleurs, on est oblige’, & ’ de s’’etaler sur plusieurs lignes’
donne le nombre de caract`eres remplis de la chaˆıne (4 dans le cas Ciao mˆeme si la chaˆıne est d´eclar´ee avec 7 charact`eres). character (len=7) :: salut = ’Bonjour’ character (len=3) :: c c=salut(1:3)
donnera Bon dans c puisque l’on prend les caract`eres de 1 `a 3. Il est aussi possible d’ajouter des caract`eres `a une chaˆıne en utilisant l’op´eration // : integer l character (len=40) :: nfichier1 character (len=20) :: nfichier2 write(*,’("Entrer un nom de fichier : ",$)’) read(*,*) nfichier1 l = len_trim(nfichier1) ! l = longueur reelle ! du nom de fichier nfichier2=nfichier1(1:l)//’.res’ ! on prend la partie de la chaine nfichier1 ! qui est remplie et on ajoute ’.res’ apres
Ici, l’instruction prend quatre lignes. Si l’on interrompt une chaˆıne de caract`ere, il faut mettre & ` a la fin de la ligne et au d´ebut de la ligne suivante : write(*,*) "Fichier resultat : ", nfichier2 write(*,*) ’L’’age du capitaine est ’, ag_cpt, & ’ mais on manque un peu de place & &: d’’ailleurs, on est oblige & &de s’’etaler sur plusieurs lignes’
open(1,file=nfichier1) ; open(2,file=nfichier2)
Ainsi, si l’on r´epond `a la question « Entrer un nom de fichier » par : machin, on obtiendra : Fichier resultat : machin.res
comparer avec l’exemple pr´ec´edent. . .
2.12
Les chaˆınes de caract` eres.
2.12.3
Conversion chaˆıne ⇔ nombres
On peut donc fabriquer automatiquement des noms de fichiers ; toutefois, il est utile de pouvoir 2.12.1 D´ eclaration ins´erer des nombres dans ces noms, par exemple Une variable de type chaˆıne de charact`eres doit ˆetre res calc dt0.001.dat pour signifier que ce calcul a ´et´e d´eclar´ee avec le nombre de caract`eres qu’elle peut conte- fait avec dt=0.001. Il faut donc convertir ce nombre en chaˆıne de caract`eres. Il existe une fonction intrins`eque nir, par exemple : char qui permet de partir du code ASCII d’un caract`ere character (len=7):: salut pour ´ecrire ce caract`ere : c’est assez lourd, car il faut indique que salut peut faire 7 caract`eres. Par exemple : d´ecomposer le nombre en dizaines, centaines, connaˆıtre les codes ASCII. . . Il est beaucoup plus simple d’utiliser salut=’Bonjour’ les instructions d’entr´ee-sortie qui font aussi ce genre de conversion par le biais de ce qu’on appelle un « fichier Mais rien n’empˆeche : interne », qui consiste `a remplacer l’unit´e d’´ecriture par salut=’Ciao’ une chaˆıne de caract`eres : o` u seuls les quatre premiers caract`eres sont remplis. En integer :: i revanche, character (len=21) :: nom_fich salut=’Guten Tag’
risque d’ˆetre un peu d´ecevant, il serait judicieux de d´eclarer salut avec 9 caract`eres au moins. . . On peut, dans un sous-programme ou une fonction, d´eclarer une chaˆıne de caract`eres sans longueur d´efinie, a condition qu’elle soit transmise comme argument : ` subroutine char_process(str,a,b,c,d) character (len=*) :: str
! initialisation de la cha^ ıne de caracteres nom_fich = ’res_calc_dt_0.000.dat’ do i = 1, 8 ! completer les caracteres numeriques write(nom_fich(12:16),’(f5.3)’) 0.001*i ... enddo
Evidemment, cela suppose un certain soin et il est prudent de v´erifier que le nom de fichier obtenu est bien ce le sous-programme se d´ebrouillera avec la chaˆıne str que l’on attendait ! Ensuite, il est ais´e de produire autoquelle qu’en soit la longueur. matiquement des noms de fichiers explicites.
35
Physique num´erique, Philippe Depondt
D´ etection de fin de fichier. Les fichiers internes fonctionnent aussi pour l’´ecriture, 2.13 par exemple, le programme metres ci-dessous lit les arIl arrive que l’on lise un fichier dont la longueur est guments de la commande qui l’invoque, ainsi quand on inconnue : ainsi, on ne sait pas la longueur de la boucle de tape : lecture : $ metres 6500 pieds
on obtient 1981.200
metres
Le programme est aussi une illustration de select case : program metres implicit none real, parameter :: c = 0.3048 ! conversion real :: l character (len=10) :: unite ! si le nombre d’arguments est >= 2, lire les deux ! premiers, sinon, lire classiquement au clavier if ( command_argument_count() >= 2 ) then call get_command_argument(1,unite) ! 1er argument ! Le 1er argument est la longueur que l’on veut ! convertir, c’est donc un nombre, or on a une chaine ! de caracteres qu’il faut convertir en reel par ! unite interne read(unite,*) l ! on lit la chaine pour obtenir l call get_command_argument(2,unite) ! 2eme argument ! le 2eme argument est le nom de l’unite qui reste ! une chaine de caracteres : donc pas de conversion. else write(*,’("Entrer la longueur et l’’unite ",$)’) read(*,*) l, unite endif
open(1,file=nfichier) do i = 1, n ! mais quelle valeur donner a n ? read(1,*) x ... enddo
Une bonne solution est de faire une boucle infinie dont on sort quand une condition de fin de fichier est rencontr´ee : open(1,file=nfichier) do read(1,*,iostat=i) x if( i < 0 ) exit ... enddo
la sp´ecification iostat=i o` u i est une variable enti`ere place dans i un diagnostic du r´esultat de l’op´eration d’entr´ee-sortie. Tant que i reste positif ou nul, la lecture se poursuit. La fin du fichier ou une erreur de lecture produira une valeur n´egative, et la lecture s’arrˆete.
2.14
FORTRAN77-90-95 : filiation et diff´ erences.
Le langage fortran ne cesse d’´evoluer : la premi`ere norme officielle et ind´ependante d’un constructeur, fortran66 ou fortranIV, date de 1966. fortran77, en ! trim est une fonction intrinseque qui reduit une ! chaine de caracteres a sa partie utile (sans espaces) 1977, introduisait des structures comme if-then-else, les chaˆınes de caract`eres et des instructions d’entr´ee-sortie select case(trim(unite)) ´elabor´ees comme open. En 1991, la norme fortran90 fut case (’ft’,’feet’,’foot’,’pieds’,’pied’) write(*,*) l*c,’ metres’ d´efinie et les premiers compilateurs cray et ibm sont apcase (’in’,’inch’,’inches’,’pouces’,’pouce’) parus en 1994. Enfin, la norme fortran95 est devenue write(*,*) 1000.*l*c/12.,’ mm’ ! 1 ft = 12 in op´erationnelle en 1999 sur des gros calculateurs de type case(’m’,’metres’) cray et ibm. . . en attendant fortran2003 ! write(*,*) l/c,’ ft’ Si fortran95 apporte surtout des modifications de case default d´etail par rapport `a fortran90, celui-ci constitue write(*,*) ’unite inconnue’ une ´evolution significative. Certaines structures (comme end select do-if(...) exit-enddo) ´etaient d´ej` a int´egr´ees dans g77 end mais pas toutes : la manipulation globale de tableaux, les –Exercice : adapter ce programme pour pouvoir faire modules, l’intention, l’allocation dynamique de m´emoire des conversions du type metres 5 ft 10 in pour obte- n’en faisaient pas partie. nir 1.778 m. Cette capacit´e `a manipuler des tableaux est probableUne autre application est la cr´eation de formats au- ment l’apport principal de fortran90 au calcul scientitomatiques : imaginons que l’on ait d´eclar´e un tableau fique ; la logique des programmes peut en ˆetre modifi´ee : « allocatable » : combien d’´el´ements doit-on mettre un exemple pourrait ˆetre un calcul d’´energie potentielle dans le format d’´ecriture ? A priori, on ne peut pas le savoir d’interaction entre n atomes, `a partir de l’´energie de paire avant l’ex´ecution : c’est le but de l’allocation dynamique de m´emoire. . . On peut s’en sortir en se rappelant qu’un de chaque couple d’atomes, donn´ee par une expression du format est une chaˆıne de caract`eres que l’on peut modifier, type 12 6 ! σ σ ainsi : V (rij ) = ε −2 rij rij integer :: n real, dimension(:), allocatable :: s character (len=9) :: form=’(00f11.5)’ write(*,’("Donnez la dimension du tableau : ",$)’) read(*,*) n allocate(s(n)) ... write(form(2:3),’(i2.2)’) n ! modification du format write(*,form) s ! ecriture
et Ep =
n−1 X
n X
i=1 j=i+1
en fortran77 : do i = 1, n-1 do j = i+1, n
V (rij )
36
Licence de physique L3 : Physique Fondamentale & PHYTEM,
rij2 =
(x(i)-x(j))**2 + (y(i)-y(j))**2 + & (z(i)-z(j))**2 sigr6 = (sigma2/rij2)**3 epot = epot + sigr6*( sigr6 - 2.0 ) enddo enddo epot = epsilon*epot
en fortran90 :
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
On peut faire la mˆeme chose avec des entiers : integer :: l code l sur 4 octets et permet d’utiliser des nombres entiers jusqu’` a 109 , alors que integer (kind=8) :: l travaille sur 8 octets et permet d’aller jusqu’` a 1010 . Toutefois, tout ceci d´epend du processeur utilis´e : ce qui est cit´e ci-dessus n’est vrai que pour les processeurs les plus commun´ement utilis´es sur PC ; le programme suivant permet de tester tout cela en cas de doute :
do i = 1, n-1 rij2(i+1:n) = (x(i)-x(i+1:n))**2 + & program inquire_kind (y(i)-y(i+1:n))**2 + & implicit none (z(i)-z(i+1:n))**2 integer :: p sigr6(i+1:n) = (sigma2/rij2(i+1:n))**3 ! l’exposant est celui de la puissance de 10 accessible epot = epot + sum(sigr6(i+1:n)*(sigr6(i+1:n) - 2.0)) write(*,’("Nombres entiers :")’) enddo write(*,’("exposant, kind")’) epot = epsilon*epot do p = 1,10 write(*,’(2i6)’) p, selected_int_kind(p) o` u maintenant rij2 et sigr6 sont des tableaux : la boucle enddo interne est implicitement d´ecompos´ee en trois boucles plus ! la precision est le nombres de chiffres significatifs simples. Le r´esultat est que l’on occupe plus de m´emoire write(*,’("Nombres reels :")’) vive (plus de tableaux) mais que la logique du calcul s’en write(*,’("precision, kind")’) trouve d´ecompos´ee en ´el´ements plus simples. do p = 1, 20 write(*,’(2i7)’), p, selected_real_kind(p) Il y a cependant d’autres innovations, plus « informatiques » qui seront d´ecrites ici car elles ont un attrait cer- enddo tain, mais elles sont d’un int´erˆet moins imm´ediat pour le end
calcul scientifique pur et dur.
2.14.1
kind
Le type double precision est consid´er´e comme obsol`ete et disparaˆıtra probablement dans une version ult´erieure de Fortran. Son int´erˆet est de faire des calculs avec un plus grand nombre de chiffres significatifs, ce qui est parfois utile, sinon indispensable. Il est remplac´e par le concept plus g´en´eral de kind40 qui s’applique aux entiers, aux r´eels et aux caract`eres. Dans la plupart des cas (¸ca d´epend du processeur) un kind=4 codera un nombre sur 4 octets (c’est en g´en´eral ce qui se passe quand on ne pr´ecise rien et cela donne 6 chiffres significatifs) et un kind=8 sur 8 octets, soit la double precision ( 15 chiffres significatifs). Ainsi : real :: x et real (kind=4) :: x sont (sur la plupart des ordinateurs) ´equivalents. De mˆeme : double precision :: x et real (kind=8) :: x De la mˆeme fa¸con, on peut faire des double complex par complex (kind=8) :: z Quel int´erˆet tout cela peut-il avoir ? La d´eclaration real est un peu ambig¨ ue parce que, sur un processeur ` a 32 bits, le r´eel est bien cod´e sur 4 octets, alors que sur un processeur `a 64 bits (qui deviennent de plus en plus fr´equents) il est cod´e sur 8 octets, ce qui en fait l’´equivalent d’un double precision. . . La notion de kind a pour but de clarifier les choses. 40 Sorte
On peut aussi utiliser kind avec des caract`eres pour ´ecrire avec des caract`eres non-latins.
ou esp` ece. Par exemple : the American bald eagle is a kind of eagle found in Northern America. En am´ ericain « conversationnel », It’s kind of neat (prononcer : It’s kinda neat) : c’est super chouette ; he’s kind of weird : il est assez bizarre.
2.14.2
Interfaces.
Supposons qu’une ´equipe de programmeurs travaille collectivement sur un mˆeme (gros) programme en se r´epartissant les tˆ aches. Chaque programmeur n’est pas forc´ement toujours au courant du d´etail des arguments utilis´es par ses coll`egues dans tel ou tel sous-programme enfoui dans des dizaines de milliers de lignes de code ; il n’a pas forc´ement le temps ou le courage de relire tout le code existant pour retrouver la liste d’arguments et leurs types de la subroutine lfpz atis13102twr11800 ´ecrite deux ans auparavant par quelqu’un qui a entre-temps chang´e d’affectation ! Il peut ˆetre alors utile de r´esumer au d´ebut du programme principal, dans une interface, tout ce qu’il faut savoir sur tous les sous-programmes : program yepee interface subroutine lfpz_atis13102twr11800(x,y,n) integer, intent(in) :: n ! nombre real, dimension(n), intent(in) :: x ! annees real, dimension(n), intent(inout) :: y ! mvts end subroutine lfpz_atis13102twr11800(x,y,n) subroutine cp301_phln(a,h) real, intent(in) :: a ! annee real, intent(out) :: h ! heures end subroutine cp301_phln end interface ! declarations du programme principal implicit none ...
37
Physique num´erique, Philippe Depondt
Toutes les d´eclarations de tous les arguments de tous les sous-programmes sont ainsi r´ep´et´ees au d´ebut du programme principal (ou du programme appelant), avec ´eventuellement des commentaires : le compilateur peut ainsi v´erifer au passage la coh´erence des appels de sousprogrammes et signaler d’´eventuelles erreurs. L’interface ne sert cependant pas uniquement ` a se rappeler la syntaxe d’appel d’un sous-programme, elle permet de r´esoudre un certain nombre de probl`emes de d´eclaration de variables. Admettons que l’on cherche ` a faire une fonction qui fasse un produit vectoriel ~a ∧ ~b. Le r´esultat est un vecteur `a trois ´el´ements : comment d´eclarer une telle fonction ? La r´eponse est de faire une interface, ainsi :
op´erations sur les rationnels qui tiennent compte, en particulier, de la r´eduction au mˆeme d´enominateur :
program prod_test implicit none
program ratio use rat implicit none
! -- interface pour declarer une fonction-vecteur -interface function cross_product(a,b) result(c) ! result permet de definir une variable qui contient ! le resultat de la fonction. Ici cette variable est ! un vecteur a trois elements real, dimension(3), intent(in) :: a, b real, dimension(3) :: c end end interface ! --real, dimension(3) :: x, y, z write(*,’("Entrer X ",$)’) ; read(*,*) x write(*,’("Entrer Y ",$)’) ; read(*,*) y ! appel de la fonction (ce sont des tableaux!) z = cross_product(x,y) write(*,*) "X x Y = ", z ! test pour verifier que le resultat est bien ! perpendiculaire aux deux vecteurs initiaux write(*,*) "Produit scalaire X.Z", dot_product(x,z) write(*,*) "Produit scalaire Y.Z", dot_product(y,z) end !----- definition de la fonction ----function cross_product(a,b) result(c) implicit none real, dimension(3),intent(in) :: a, b real, dimension(3) :: c c = cshift(a,1)*cshift(b,-1)-cshift(b,1)*cshift(a,-1)
! programme principal
interface operator (*) ! definition de l’operateur * (multiplication) ! il s’agit ici simplemement de faire le lien ! entre le symbole ’*’ et la fonction ’ratmul’ function ratmul(q1,q2) result(q3) use rat type(rationnel), intent(in) :: q1, q2 type(rationnel) :: q3 end function ratmul end interface operator (*) interface operator (+) ! meme chose pour l’addition function ratadd(q1,q2) result(q3) use rat type(rationnel), intent(in) :: q1, q2 type(rationnel) :: q3 end function ratadd end interface operator (+) ! declaration de deux nombres rationnels p et q ! le numerateur de q s’ecrit q%n et ! son denominateur q%d ! meme chose pour p type (rationnel) :: q, p write(*,’("Num, denom 1: ",$)’) read(*,*) q%n, q%d write(*,’("Num, denom 2: ",$)’) read(*,*) p%n, p%d ! utilisation des deux nouveaux operateurs write(*,*) "produit ", q*p write(*,*) "somme ", q+p end
end
-Exercice : ´etudier le fonctionnement des cshift dans la fonction cross product en comparant avec la d´efinition du produit vectoriel. . .
2.14.3
module rat ! definition du type rationnel dans un module pour ! eviter d’avoir a le refaire dans tous les ! sous-programmes type rationnel integer :: n, d end type rationnel ! le type rationnel est compose de deux nombres ! entiers : n = numerateur et d = denominateur end module rat
Objets de type d´ eriv´ e.
function ratmul(q1,q2) result(q3) ! ratmul est une fonction de type rationnel ! mais ce type n’est pas encore defini pour ! cette fonction, d’ou la syntaxe result use rat implicit none type(rationnel), intent(in) :: q1, q2 type(rationnel) :: q3 q3%n = q1%n*q2%n q3%d = q1%d*q2%d call simplify(q3) end function ratmul
En fortran, il y a les types integer, real, etc. On peut aussi fabriquer dans un programme des types nouveaux en combinant des types existants, par exemple, character et real, et d´efinir des op´erations (addition, multiplication) s’effectuant sur ces nouveaux types. Par exemple, un rationnel est compos´e de deux nombres entiers, num´erateur et d´enominateur, et l’on peut d´efinir des function ratadd(q1,q2) result(q3)
38
Licence de physique L3 : Physique Fondamentale & PHYTEM,
use rat implicit none type(rationnel), intent(in) :: q1, q2 type(rationnel) :: q3 q3%n = q1%n*q2%d + q2%n*q1%d q3%d = q1%d*q2%d call simplify(q3) end function ratadd subroutine simplify(q) use rat implicit none type(rationnel) :: q integer :: i, m ! si a la fois numerateur et denominateur sont ! divisibles par le meme nombre, le faire : ! c’est pedestre, mais ca marche... m = min(abs(q%n),abs(q%d)) l1 : do i = 2, m l2 : do ! il faut parfois recommencer if (mod(q%n,i) == 0 .and. mod(q%d,i) == 0 ) then q%n = q%n/i q%d = q%d/i else exit l2 endif enddo l2 enddo l1 end subroutine simplify
C ¸ a donne par exemple : $ ratio Num, denom 1: 5 2 Num, denom 2: 4 5 produit 2 1 somme 33 10
5 4 20 2 5 4 ce qui est correct : × = = et + = 2 5 10 1 2 5 33 5×5+2×4 = . 2×5 10 On peut, sans difficult´e majeure, ajouter ` a cela les deux autres op´erations et l’on aura cr´e´e un type nouveau et les op´erations associ´ees. Les types d´eriv´es et les op´erations associ´ees constituent un pas important du fortran en direction de la programmation orient´ee « objet » au d´etriment, sans doute, de la simplicit´e originelle du langage : la norme fortran2003 la d´eveloppe d’ailleurs encore davantage. -Exercice : d´efinir un type temps compos´e d’heures, minutes, secondes et une addition et une soustraction permettant de calculer en sexag´ecimal (par exemple : 1h32mn24s + 2h42mn39s = 4h15mn3s). -Exercice : d´efinir un type triangle d´efini par les coordonn´ees de ses trois sommets et une op´eration * d’homoth´etie permettant de le dilater d’un facteur r´eel sans d´eplacer son centre de gravit´e.
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
doute les scientifiques eux-mˆemes qui sont frapp´es d’obsolescence ! En attendant, l’un des reproches essentiels que l’on fai(sai)t au fortran est l’absence de pointeurs. Un pointeur est une variable qui contient l’adresse d’une variable : si l’on modifie un pointeur, on ne modifie pas la valeur de la variable, mais on « pointe » vers une autre adresse et donc une autre variable. A priori, un pointeur est donc juste une variable enti`ere qui contient une adresse et l’on peut faire les op´erations que l’on veut sur cette adresse, aux risques et p´erils de l’utilisateur. C’est ainsi en assembleur et en langage C qui est tr`es proche de la machine. En assembleur en particulier, il n’y a pas de tableaux, mais on peut acc´eder `a des grandeurs stock´ees `a la suite les unes des autres en m´emoire simplement en incr´ementant un pointeur, ce qui revient au mˆeme, si ce n’est que c’est d’un maniement sensiblement plus d´elicat. . . Les pointeurs sont importants en informatique parce que c’est le point de d´epart de l’allocation dynamique de m´emoire, puisqu’on acc`ede ainsi librement `a toute la m´emoire sans en r´eserver des morceaux `a telle ou telle variable. fortran90 g`ere l’allocation dynamique de m´emoire autrement, comme on l’a vu, et -opinion qui n’engage que son auteur- de fa¸con nettement plus prudente. Autant dire que pour l’essentiel du calcul scientifique, la capacit´e `a utiliser des tableaux efficacement est beaucoup plus importante. Toutefois, fortran90 introduit les pointeurs avec un certain nombre de garde-fous. Un pointeur doit ˆetre d´eclar´e avec le type de la variable vers lequel il pointe : un pointeur donn´e ne peut pas avoir pour cible un entier `a un moment et un r´eel un peu plus tard : ! declaration d’un pointeur integer, pointer ! declaration d’un pointeur real, dimension(:), pointer
vers un entier :: a vers un tableau reel :: b
Il faut aussi d´eclarer explicitement des variables comme cible (target en anglais) : integer, target :: n, m real, dimension(150), target :: x, y
Si l’on veut que a pointe vers m et b vers x, cela donne : a => m b => x
Quel int´erˆet ? On peut, par exemple, faire pointer un pointeur vers un morceau de tableau b => x(100:150)
ce qui permet d’optimiser des transferts de donn´ees d’un morceau de tableau `a un autre : dans certains cas on ´economise ainsi de l’espace m´emoire.
2.14.5
R´ ecursivit´ e.
fortran90 l’autorise. . . c’est parfois commode, rarement efficace, du moins pour le calcul scientifique pur et « Le fortran est un langage d´epass´e, vieillot, ob- dur. L’exemple que l’on donne toujours est le calcul de sol`ete. . . » : ce sont des propos que l’on entend depuis factorielles : la d´efinition de n! est, plus de vingt ans41 , or le fortran continue ` a ˆetre larn! = n(n − 1)! gement employ´e en calcul scientifique ; ce sont donc sans
2.14.4
Pointeurs.
41 Dans les ann´ ees 1980, il advint un jour que le laboratoire o` u je travaillais dut acqu´ erir une station de travail ; les repr´ esentants d’un des fournisseurs pressentis vinrent vanter les m´ erites de leurs
productions et demand` erent quel langage on utilisait afin d’inclure le compilateur dans leur devis. Quand la r´ eponse fut : « fortran », nous eˆ umes droit a ` des regards pour le moins. . . incr´ edules !
Physique num´erique, Philippe Depondt
Cela se programme sans difficult´e ` a condition de sp´ecifier que la function est r´ecursive : program factorielle implicit none integer :: n, fact write(*,’("Entrer un entier : ",$)’) ; read(*,*) n write(*,*)"Factorielle", n," vaut ",fact(n) end recursive function fact(n) result(f) implicit none integer, intent(in) :: n integer :: f if ( n > 1 ) then f = n*fact(n-1) ! ici la fonction s’appelle ! elle-meme, c’est recursif else f = 1 endif end function fact
Cinq minutes de r´eflexion permettent cependant de re´ecrire la fonction : integer function fact(n) implicit none integer, intent(in) :: n integer :: f = 1 if ( n > 1 ) then do i = 2, n f = f*i ! ici, ca n’a rien de recursif enddo endif fact = f end function fact
La deuxi`eme version est plus efficace parce que la premi`ere devra stocker tous les r´esultats interm´ediaires en m´emoire de fa¸con parfaitement inutile, ce que la deuxi`eme ne fait ´evidemment pas. La r´ecursivit´e est une question importante pour les informaticiens dans la mesure o` u elle leur facilite consid´erablement la tˆ ache dans, par exemple, des probl`emes de logique tournant autour de la d´ecidabilit´e (Entscheidungsproblem quand on veut montrer que l’on a de l’´education. . .). Pour un physicien qui se borne en g´en´eral `a utiliser des algorithmes standards, cela reste assez marginal. — Apr`es cette premi`ere partie, on constate donc que le langage fortran90 est tr`es riche et que l’on peut faire avec ce langage des choses plutˆ ot ´elabor´ees. Il n’est bien sˆ ur pas utile d’apprendre tous les d´etails du langage en quelques semaines, mais il est indispensable d’en avoir une pratique suffisante pour ne pas ˆetre gˆen´e par des d´etails de programmation pendant les s´eances de travaux pratiques, au cours desquelles, tr`es rapidement, on se pr´eoccupera plus de physique que de langage ! Il est recommand´e d’ˆetre capable, assez rapidement, d’´ecrire sans trop h´esiter des programmes comportant conditions, boucles, tableaux, sous-programmes et entr´ees-sorties : le reste viendra avec la pratique, mais,
39
les bases doivent ˆ etre imp´ erativement apprises et maˆıtris´ ees, car sans cela, on s’expose ` a patauger sans grand profit dans un bourbier de d´ etails informatiques sans int´ erˆ et !
Ces remarques ach`event la partie langage de ce cours. Dans la suite, les exemples seront donn´es en fortran, mais les algorithmes ´etudi´es ne d´ependent ´evidemment pas du langage de programmation choisi.
40
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Chapitre 3
Un prototype de TP 3.1
Introduction.
3.2.1
La physique num´erique requiert sans doute quelques connaissances dont le pr´esent cours a pour but de fournir l’essentiel. Il s’agit toutefois d’une activit´e essentiellement pratique : il faut ´ecrire des programmes qui, non seulement « marchent », mais aussi r´epondent aux questions pos´ees de sorte que la physique du probl`eme soit trait´ee de fa¸con satisfaisante ; il faut pour cela un minimum d’exp´erience pour, bien sˆ ur, maˆıtriser le langage, mais en outre avoir une familiarit´e suffisante avec l’environnement et les m´ethodes afin que ceux-ci deviennent l’aide puissante qu’ils doivent ˆetre et non plus la gˆene. . . qu’ils constituent sans conteste au d´ebut ! C’est la raison pour laquelle cet enseignement comporte une part importante de travaux pratiques. Chacune de ces s´eances de TP est consacr´ee `a un probl`eme de physique qui illustre l’usage que l’on peut faire de telle ou telle m´ethode. Elle est pr´ec´ed´ee d’une s´eance de travaux dirig´es au cours de laquelle on pr´esente le probl`eme, ´eventuellement on montre les limites du calcul analytique et on d´ecrit les m´ethodes num´eriques qui seront utilis´ees pour le traiter. Si le probl`eme pr´esente des difficult´es particuli`eres de programmation, celles-ci seront ´egalement abord´ees. Il est attendu des ´etudiants qu’ils arrivent en s´eance de TP en ayant 1o pris connaissance du probl`eme et 2o avec une bonne id´ee de comment le r´esoudre et qu’ils en partent en rendant un compte-rendu qui compte pour la note de contrˆole continu. La question est ´evidemment : « que doit-il y avoir dans un compte-rendu de TP ? » Comme il s’agit d’un exercice un peu particulier, on traite ci-dessous, ` a titre d’exemple, la question de l’´equation logistique « ` a la mani`ere » d’un TP. . .
3.2
L’´ equation logistique.
De la multiplication des insectes.
Imaginons une population, par exemple, d’insectes, comportant `a la g´en´eration p, zp individus. Si chaque individu donne lieu, en moyenne, `a α insectes (par exemple en pondant α œufs, pour mourir ensuite) `a la g´en´eration suivante, celle-ci comportera zp+1 = α zp in´ dividus. Evidemment, si α > 1, la population d’insectes diverge exponentiellement, une perspective sans doute quelque peu effrayante mais qui ne tient pas compte des ressources disponibles, la nourriture en particulier : plus les insectes sont nombreux, plus les ressources deviennent rares pour chaque insecte qui aura donc plus de difficult´es `a s’assurer une descendance. Le coefficient α doit alors d´ecroˆıtre lorsque le nombre d’insecte augmente ; on peut alors prendre l’expression lin´eairement d´ecroissante (c’est le plus simple) suivante : α = r(1 −
zp ) ζ
o` u ζ est le nombre d’insectes qui ´epuise toutes les ressources au point de ne pas pouvoir donner lieu `a une g´en´eration suivante. . . Cela donne : zp+1 = r zp (1 −
zp ) ζ
On peut re´ecrire cette ´equation en prenant comme variable zp xp = ζ de sorte que 0 < xp < 1, et : xp+1 = r xp (1 − xp ) ce qui constitue l’´equation logistique. Il s’agit donc de d´eterminer comment se comportera la population d’insectes en fonction du param`etre r.
3.2.2
´ Etude pr´ ealable.
Il s’agit d’un grand classique de la physique du chaos1 , 3.2.2.1 Les points fixes. c’est un probl`eme qui ne n´ecessite pas de connaissances Existe-t-il des solutions stationnaires telles que xp+1 = particuli`eres en m´ethodes num´eriques et qui pr´esente un x ? Si oui, elles doivent obeir `a : p certain aspect ludique2 ce qui en fait un bon exemple d’une fa¸con de proc´eder. x = r x(1 − x) 1 Voir
par exemple : Edward Ott, Chaos in dynamical systems, Cambridge University Press (1993), p. 31. 2 On pourra certes objecter que le caract` ere « ludique » de cette activit´ e d´ epend un peu des goˆ uts. . . mais on postulera ici que le public de physiciens auquel ce cours s’adresse sera sensible a ` ses charmes.
soit :
1 r On admettra que la solution nulle n’a gu`ere d’int´erˆet puisque dans ce cas il n’y a pas d’insectes. La solution
41
x=0
ou
x=1−
42
Licence de physique L3 : Physique Fondamentale & PHYTEM,
non-nulle, elle, n’existe que si r > 1 car on ne consid`ere que les valeurs de x positives, s’agissant d’un nombre d’insectes. Par ailleurs, comme xp+1 doit, comme xp , par d´efinition, ˆetre inf´erieur `a un, le maximum de la fonction f (xp ) = r xp (1 − xp ) doit ˆetre ´egalement inf´erieur ` a un. Il est situ´e 1 r en xp = et vaut , autrement dit, r ≤ 4. Ainsi, on se 2 4 restreindra `a l’intervalle 1 < r ≤ 4 et les points fixes vont 3 de 0 pour r = 1 `a pour r = 4 (figure 3.1). 4 0.8 0.7 0.6
Point fixe
r = 4 n’a pas de comportement ais´ement caract´erisable `a premi`ere vue. Imaginons que l’on se trouve en xp `a une distance δ, 1 petite, d’un point fixe 1 − tel que : r xp = 1 −
0.4
alors, en appliquant `a xp l’´equation logistique : 1 1 xp+1 = r (1 − ) + δ 1 − (1 − ) − δ r r 1 = (1 − ) + δ (2 − r(1 + δ)) r
1 xp+1 − (1 − ) = r ≃
0.3 0.2 0.1 1
1.5
2
2.5 r
3
3.5
4
Fig. 3.1 – Point fixe de l’´equation logistique.
3.2.2.2
Y a-t-il convergence ?
L’existence de points fixes ne signifie pas automatiquement que le syst`eme doive converger vers l’un d’eux. Un fa¸con de s’en convaincre est de faire quelques essais comme sur la figure 3.2 sur laquelle on a trac´e les fonctions f (x) = r x(1 − x) pour plusieurs valeurs de r et g(x) = x : les points fixes sont donn´es par l’intersection des deux fonctions. 1
r=1 r=2 r=3 r=4 x
0.8
x(p+1)
0.6
0.4
0.2
0
1 +δ r
Le point xp+1 est-il plus proche du point fixe que xp ? L’´ecart s’´ecrit :
0.5
0
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
0.2
0.4
0.6
0.8
1
x(p)
´ Fig. 3.2 – Etude graphique de l’´equation logistique. Voir le texte. Prenons, par exemple, le cas r = 2 et partons de x0 = 0, 2. Alors, x1 = 2 × 0, 2(1 − 0, 2) = 0, 32 est donn´e sur la figure par l’intersection de la ligne verticale bleue avec la parabole correspondant ` a r = 2. Ce x1 doit ˆetre report´e en abscisse pour servir de nouveau point de d´epart : il suffit de tirer une ligne horizontale jusqu’` a l’intersection avec la droite g(x) = x, puis de nouveau une verticale pour obtenir x2 , etc. La figure paraˆıt montrer une convergence vers x = 0, 5, ce qui est bien ce que l’on attendait pour r = 2. Pour r = 3, il semble que le syst`eme ne converge pas, mais suive un cycle autour du point fixe, et finalement
δ(2 − r)
puisqu’a priori δ est petit devant 1. Alors : – si r = 2, on obtient un ´ecart nul, le syst`eme a converg´e, – si r = 3, on obtient −δ, l’´ecart n’a pas diminu´e mais change de signe – si r = 4, on obtient −2δ, l’´ecart a augment´e en valeur absolue et l’on peut donc s’attendre `a des ennuis ! Plus g´en´eralement, si 1 < r < 3, l’´ecart diminue en valeur absolue pr`es du point fixe, et donc on s’attend `a une convergence sans probl`eme, mais si r > 3, l’´ecart tend `a augmenter. Voici donc un premier tour d’horizon sur ce probl`eme : cela peut constituer la mati`ere du TD qui pr´ec`ede le TP. S’il doit y avoir des subtilit´es de programmation `a connaˆıtre ou des algorithmes particuliers `a appliquer (ce qui n’est pas vraiment le cas ici), ils seront ´egalement trait´es en TD. Rien de ce qui pr´ec`ede ne doit obligatoirement figurer dans votre compte-rendu, sinon pour vos propres archives : l’id´ee est qu’une s´eance de TP de 4 heures est bien courte pour perdre du temps `a recopier des notes prises en travaux dirig´es, mieux vaut faire cela chez soi !
3.2.3 0
δ (2 − r(1 + δ))
´ Etude num´ erique.
En revanche, le programme utilis´e pour r´esoudre le probl`eme doit imp´erativement ˆetre fourni, de pr´ef´erence avec des commentaires, ´eventuellement manuscrits, qui permettent de savoir ce que ce programme est cens´e faire et comment il le fait. program logistic implicit none ! equation logistique ! evolution de la population en fonction des ! generations real :: r, x, x0 = 0.01 ! condition initiale integer :: p, n=1000 ! nombre de generations ! write(*,’(" R : ",$)’) ; read(*,*) r ! lecture de r open(1, file=’logistic.res’) ! fichier de resultats do p = 1, n ! calcul et ecriture de x(p) x = r*x0*(1.-x0)
43
Physique num´erique, Philippe Depondt
write(1,*) p, x x0 = x enddo close(1) end
r=2 0.5
x(p)
0.4
0.2
0.1
0
0
5
10
15
20
25 p
30
35
40
45
50
995
1000
995
1000
0.676 r=3 0.674 0.672 0.67 0.668 x(p)
Si le r´esultat du calcul est juste un nombre, ce nombre doit ˆetre fourni dans le compte-rendu et ce r´esultat discut´e. Si le programme sert ` a une mise au point ou `a un essai, la comparaison avec ce qu’on attend doit ˆetre donn´ee. Quand le r´esultat est une figure, les axes de celle-ci doivent ˆetre identifi´es (on trace quoi en fonction de quoi ?) et les conditions du calcul pr´ecis´ees (ici la valeur de r et de la condition initiale). Des commentaires sur le r´esultat obtenu (quelle est sa signification physique ?) sont non seulement bienvenus mais attendus car le but n’est pas simplement d’´ecrire un programme mais de faire de la physique ` a l’aide de ce programme. . .
0.3
0.666 0.664
Lorqu’on modifie un programme, il faut expliquer ce que l’on est en train de faire, et ´evidemment fournir le programme modifi´e agr´ement´e des commentaires ad´equats. On aimerait ´etudier le comportement de la population d’insectes de fa¸con plus syst´ematique : pour cela, il suffit d’ajouter au programme une boucle sur r et de tracer xp non plus en fonction de p mais en fonction de r. On prend soin de ne garder que la fin du calcul pour chaque valeur de r afin d’´eliminer un ´eventuel transitoire. program logistic implicit none ! equation logistique ! diagramme de bifurcations real :: r, x, x0 integer :: i, p, n=2000, nsav open(1,file=’logistic2.out’) ! do i = 200, 400 ! boucle sur r r = 0.01*i x0 = 0.01 ! reinitialisation de x0 ! pour chaque nouvel r if ( r < 3 ) then ! quand le systeme nsav = 10 ! converge, on ne garde que else ! quelques pas mais quand ca nsav = 1000 ! devient irregulier, on doit endif ! en garder davantage !
0.662 0.66 0.658 950
955
960
965
970
975 p
980
985
990
0.9 r=3.5 0.85 0.8 0.75
x(p)
0.7 0.65 0.6 0.55 0.5 0.45 0.4 0.35 950
955
960
965
970
975 p
980
985
990
1 r=4 0.9 0.8 0.7 0.6 x(p)
La figure 3.3 montre l’´evolution de la population d’insectes pour quatre valeurs de r. – pour r = 2 le syst`eme converge rapidement vers le point fixe x = 0, 5 comme pr´evu (on a supprim´e la fin du graphe pour p > 50 car il ne s’y passe rien). – pour r = 3 le syst`eme oscille p´eriodiquement (on n’a gard´e que la fin du graphe (p > 950) correspondant a ce qui s’apparente ` ` a un r´egime stationnaire) autour 1 du point fixe 1 − ≃ 0, 667 : cela paraˆıt compatible 3 avec l’intuition que l’on en avait. – pour r = 3, 5, le syst`eme est encore p´eriodique, mais deux « p´eriodes » successives sont diff´erentes, autrement dit, la p´eriode est deux fois plus longue. – pour r = 4 le syst`eme semble se comporter de fa¸con irr´eguli`ere : on est dans une situation de chaos d´eterministe.
0.5 0.4 0.3 0.2 0.1 0 950
955
960
965
970
975 p
980
985
990
995
1000
´ Fig. 3.3 – Evolution de la population d’insectes pour r = 2, 3, 3, 5 et 4. Condition initiale x0 = 0, 01.
do p = 1, n x = r*x0*(1.-x0) ! le calcul est identique au precedent, mais on ! ecrit maintenant x en fonction de r if ( p > n-nsav ) write(1,*) r, x x0 = x enddo ! enddo ! close(1) end
44
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
1 Eq. logistique Pt fixe
0.9 0.8 0.7
x(p)
0.6 0.5 0.4 0.3 0.2 0.1 0
2
2.5
3 r
3.5
4
Fig. 3.4 – Diagramme de bifurcations pour l’´equation logistique. En bleu est repr´esent´ee la courbe des points fixes th´eoriques. On obtient ce qu’on appelle un diagramme de bifurcations (figure 3.4). En premier lieu, on constate que pour r < 3 le r´esultat coincide parfaitement avec la courbe des points fixes th´eoriques, ce qui est rassurant quant au bon fonctionnement du programme (mais ne d´emontre en aucun cas qu’il est d´epourvu d’erreur !).
On constatera les poids respectifs de l’informatique et de la physique (il est vrai qu’en l’occurence, il s’agit plutˆ ot d’´eco-zoologie, mais peu importe) dans ce qui pr´ec`ede : la balance penche fortement du cˆ ot´e de cette derni`ere et c’est ainsi qu’il doit en ˆetre. Parfois au cours d’un TP, on pourra rencontrer des aspects techniques plus d´elicats que dans cet exemple et il faudra s’assurer avec autant de soin que possible que la m´ethode utilis´ee est digne de confiance, mais le principe de base reste : « n’oublions jamais que nous sommes des physiciens ! »
On observe ensuite qu’` a partir de r = 3 la courbe se divise en deux : cela signifie que pour chaque valeur de r, xp Toutefois, apr`es cette belle d´eclaration de principes, il oscille entre deux valeurs comme sur la deuxi`eme courbe faut quand mˆeme s’occuper des m´ethodes elle-mˆemes. . . de la figure 3.3. Puis, un peu avant r = 3, 5, on a un nouveau d´edoublement et xp prend quatre valeurs distinctes. On observe encore un autre d´edoublement pour huit valeurs avant de tomber dans un continuum qui signifie que xp prend toutes les valeurs entre 0 et 1. Au-del` a, on observe quelques « fenˆetres d’ordre » dans les zones moins sombres qui correspondent au fait que xp n’explore pas toutes les valeurs du domaine. Une ´etude plus pouss´ee permettrait peut-ˆetre de v´erifier si la s´equence des d´edoublements suit une suite de Feigenbaum ou d’´etudier l’invariance par changement d’´echelle en calculant les dimensions fractales des domaines explor´es par xp en fonction de r. On peut aussi pr´ef´erer, ` a une ´etude du chaos d’un point de vue math´ematique, se poser la question de la validit´e du mod`ele en introduisant des ingr´edients suppl´ementaires, par exemple, le fait que les ressources ne se trouvent pas forc´ement `a proximit´e des insectes et que donc leurs fa¸cons de rechercher ces ressources (leurs « strat´egies ») n’est pas sans effet. D’´eventuels pr´edateurs peuvent ´egalement jouer un rˆ ole.
Chapitre 4
M´ ethodes num´ eriques. Ce chapitre d´eveloppe les principales m´ethodes On obtient apr`es quelques lignes de calcul : num´eriques utilis´ees par les physiciens : afin d’´eviter qq ′ xq cos θ + (yq − ℓ) sin θ d’en faire un manuel de math´ematiques appliqu´ees, que sin θ + 3 4πε mg 0 d’autres seraient sans doute mieux ` a mˆeme de r´ealiser, [(ℓ sin θ − xq )2 + (ℓ(1 − cos θ) − yq )2 ] 2 chaque m´ethode est illustr´ee par un exemple de phy=0 (4.1) sique puis´e dans la mesure du possible dans le bagage d’un ´etudiant de licence de physique, quitte ` a anticiper ce qui n’est pas ´evident `a r´esoudre analytiquement1 . l´eg`erement sur certains cours (en physique quantique ou Il s’agit d’un cas particulier du probl`eme de la recherche en thermodynamique statistique en particulier). du ou des z´ero(s) d’une fonction, c’est-`a-dire trouver le ou les x tel(s) que f (x) = 0
4.1
Recherche fonction.
des
z´ eros
d’une
Il existe deux m´ethodes principales pour r´esoudre num´eriquement ce genre de probl`eme.
Partons d’un exemple compl´etement acad´emique mais ethode de la dichotomie. tr`es simple : un pendule simple de masse m porte `a son 4.1.1 M´ extr´emit´e une charge q. On place ` a proximit´e une autre Comme son nom l’indique, il s’agit d’une recherche dans charge q ′ (figure 4.1). Trouver l’angle d’´equilibre θ du penun intervalle que l’on d´ecoupe en sous-intervalles (fig. 4.2). dule en fonction de la valeur de q ′ .
θ f(a) ε
q’ q f(b)
Fig. 4.1 – Le pendule charg´e
a
x
b
L’´energie potentielle de gravitation du pendule peut Fig. 4.2 – Recherche de z´ero par dichotomie. Les zones s’´ecrire : gris´ees sont ´elimin´ees par la recherche. Le rectangle allong´e Vg = mgz = −mgℓ cos θ horizontalement d´elimite la pr´ecision ε requise. o` u ℓ est la longueur du pendule et θ l’angle qu’il fait avec Admettons que sur l’intervalle [a, b] la fonction f ait un la verticale ; de mˆeme, l’´energie potentielle ´electrostatique z´ e ro et un seul : elle change de signe sur l’intervalle et donc des charges s’´ecrit : le produit f (a)f (b) est n´egatif. Coupons alors l’intervalle a+b qq ′ 1 . Si [a, b] en deux, ce qui nous donne le point x = p Ve = 2 4πε0 (ℓ sin θ − xq )2 + (ℓ(1 − cos θ) − yq )2 le produit f (a)f (x) est n´egatif, c’est que le z´ero recherch´e
se trouve dans l’intervalle [a, x], sinon il se trouve dans o` u xq et yq sont les coordonn´ees de la charge q ′ . L’´equilibre l’intervalle [x, b]. Il reste `a rediviser en deux l’intervalle est, comme d’habitude, donn´e par : d(Vg + Ve ) =0 dθ
1 On pourrait tenter de poser par exemple x = sin θ et y = cos θ, avec x2 + y 2 = 1. On tomberait alors sur un polynˆ ome de degr´ e 8 en x et y. . .
45
46
Licence de physique L3 : Physique Fondamentale & PHYTEM,
o` u se trouve le z´ero et ` a refaire la mˆeme recherche. On r´ep`ete encore la mˆeme op´eration plusieurs fois jusqu’` a ce que la pr´ecision requise soit atteinte. Comme on r´ep`ete la mˆeme proc´edure plusieurs fois de suite, on appelle cela un processus it´eratif. Deux crit`eres diff´erents sont possibles pour choisir d’arrˆeter ou non la recherche : – soit l’on d´esire une certaine pr´ecision sur la valeur de x et, donc, on arrˆete la recherche quand la longueur de l’intervalle devient inf´erieure ` a une valeur ε choisie a l’avance, ` – soit l’on veut que f (x) soit proche de z´ero avec une certaine pr´ecision comme sur la figure 4.2, c’est-`a-dire |f (x)| < ε. Une fonction informatique qui fasse cela pourrait s’´ecrire : real function dicho(f, a, b, epsilon) ! recherche de zero par dichotomie ! f = fonction reelle dont on cherche le zero ! a et b = bornes de l’intervalle de recherche ! epsilon = precision recherchee sur la valeur de f ! ! les variables y, y1, et y2 servent a conserver ! les valeurs prises par f afin d’eviter les ! calculs inutiles si f est longue a calculer
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
xq = .1 ; yq = 0. a = -1.57 ; b = 1.57 ; eps = 0.00001 open(1,file=’zero.out’)
! fichier ou l’on mettra ! les resultats
c = 0. do ! boucle pour faire varier c x = dicho(pendule, a, b, eps) write(1,*) c, x c = c + 0.01 if ( c > 2.0 ) exit enddo close(1) end ! !--------------------------real function pendule(theta) use pendu implicit none real :: theta ! l = 1 ! c = q*qprime/(4*pi*eps0*m*g)
implicit none real :: a, b, f, epsilon, y, y1, y2, x, x1, x2
pendule = sin(theta) & ! la formule occupe 3 lignes + c*( xq*cos(theta)-(1.-yq)*sin(theta))/ & ((sin(theta)-xq)**2+((1.-cos(theta))-yq)**2)**1.5 end
x1 = a ; x2 = b ! initialisation de l’algorithme y1 = f(a) ; y2 = f(b)
La fin est bien sˆ ur constitu´ee de la fonction dicho. Le r´esultat du calcul est donn´e figure 4.3. 0
do ! *** debut de la boucle *** x = 0.5*(x1+x2) ; y = f(x) ! dichotomie if ( abs(y) < epsilon ) exit ! critere d’arret ! de quel cote le zero se trouve-t-il ? if ( y1*y < 0 ) then x2 = x ; y2 = y ! a gauche [x1,x] else x1 = x ; y1 = y ! a droite [x,x2] endif enddo ! *** fin de la boucle ***
−0.2 −0.4 freq_eq
! verification de l’intervalle if( y1*y2 > 0. ) then write(*,*) ’Intervalle mal choisi’ stop endif
−0.6 −0.8 −1 −1.2 −1.4
0
0.2
0.4
0.6
0.8
1 C
1.2
1.4
1.6
1.8
2
Fig. 4.3 – Solution du probl`eme du pendule en fonction ′ de c = 4πεqq0 mg pour ℓ = 1.
On constate, sans v´eritable surprise, que plus c (ou la charge) augmente, plus le pendule s’´ecarte de la verticale. . . L’´equation (4.1) devient ais´ee a ` r´esoudre num´eriLa m´ethode de la dichotomie est assez p´edestre, elle quement `a l’aide d’un programme qui aurait l’allure sui- est sˆ ure, sans surprise. Elle n´ecessite une connaissance vante : pr´ealable de la fonction puisqu’elle suppose qu’il y ait un et un seul z´ero dans l’intervalle de recherche : il faut donc module pendu pouvoir choisir celui-ci judicieusement. dicho = x end
! ! !
mise en commun de variables pour << sauter >> par-dessus dicho valeur et position de la charge real :: c, xq, yq end
4.1.2
program zero use pendu implicit none real :: a, b, eps, dicho, x external pendule
La m´ethode de Newton est `a la fois plus efficace et plus dangereuse. Il s’agit, `a partir d’un point de d´epart x0 judicieusement choisi, d’approcher la fonction par sa tangente et de chercher l’intersection de celle-ci avec l’axe des x. Comme la fonction n’est pas a priori lin´eaire le r´esultat est faux, mais il constitue le point de d´epart d’une nouvelle recherche (figure 4.4).
M´ ethode de Newton.
47
Physique num´erique, Philippe Depondt
et un peu de trigonom´etrie ´el´ementaire donne i1 = arctan
i2 = arctan
a−x y
ainsi nous avons a rechercher la racine de la fonction a−x a+x − n2 sin arctan f = n1 sin arctan y y
y1 y2
a+x , y
x0
o` u x est l’inconnue. Si nous voulons utiliser la m´ethode de Newton, nous avons besoin de la d´eriv´ee de f par rapport `a x :
x1 x2 y0
df n1 = cos dx y Fig. 4.4 – La m´ethode de Newton.
1+
1
a+x y
2 +
n2 cos y
1+
1
Le programme suivant fait exactement cela :
a−x y
2
Si l’on part d’un point d’abscisse x0 , on doit pouvoir module params ! definition des parametres du probleme calculer f (x0 ) et la pente de la tangente f ′ (x0 ). L’inter- implicit none real, parameter :: n1 =1.0, n2 = 1.5, a = 1., y = 1. section de la tangente avec l’axe des x est donn´ee par end module params
f (x0 ) x1 = x0 − ′ f (x0 ) Il suffit de r´ep´eter l’op´eration pour x1 , x2 ,. . . xn+1 = xn −
f (xn ) f ′ (xn )
jusqu’` a ce que le crit`ere de convergence que l’on aura choisi soit v´erifi´e. Imaginons, par exemple, que l’on veuille chercher la point d’intersection d’un rayon lumineux avec un dioptre en utilisant la loi de Descartes (figure 4.5) : le rayon part −a d’un point de coordonn´ees dans un milieu d’iny a dice n1 pour arriver en un point de coordonn´ees −y dans un milieu d’indice , en passant par le dioptre au n2 x point de coordonn´ees . L’inconnue du probl`eme est 0 x.
n1
y
a i2 x
n2
subroutine trajet(x, f, df ) ! calcul de la fonction use params ! et de sa derivee implicit none real, intent(in) :: x real, intent(out) :: f, df real :: r1, r2 r1 = (a + x)/y ; r2 = (a - x)/y f = n1*sin(atan(r1)) - n2*sin(atan(r2)) df = n1*cos(1./(1.+r1**2))/y + & n2*cos(1./(1.+r2**2))/y end real function newton(x,f,eps) ! methode de Newton implicit none integer :: i, imax = 100 ! nombre max d’iterations real :: x, eps, xp, y, d
i1
a
program decartes use params implicit none real, parameter :: eps = 1.e-5 ! precision requise real :: newton external :: trajet real :: x = 0. ! condition initiale ! ce programme ne comporte qu’une instruction write(*,*) newton(x,trajet,eps), & n1*sin(atan((a+x)/y)) - n2*sin(atan((a-x)/y)) end
y
do i = 1, imax call f(x, y, d) xp = x - y/d if (abs(xp-x) < eps ) exit x = xp enddo newton = xp end
Fig. 4.5 – Loi de Descartes : notations pour utiliser la Cela donne : 0.36264408 -0.000014537249. On laissera le soin au lecteur de v´erifier que c’est correct. . . m´ethode de Newton La m´ethode de Newton a plusieurs avantages par rapport `a la m´ethode de la dichotomie. Elle est en g´en´eral La loi de Descartes s’´ecrit ´evidemment beaucoup plus rapide, ce qui dans certains cas peut n1 sin i1 = n2 sin i2 s’av´erer d´ecisif. Elle a par ailleurs le tr`es gros avantage
48
Licence de physique L3 : Physique Fondamentale & PHYTEM,
de pouvoir se g´en´eraliser ais´ement ` a plusieurs dimensions comme on le verra dans la suite. Elle a l’inconv´enient qu’il faut pouvoir calculer, ou au moins estimer la d´eriv´ee de la fonction, ce qui est parfois un peu laborieux (voir l’´equation (4.1) par exemple). Elle rec`ele toutefois quelques pi`eges parfois redoutables. Si par exemple, l’un des points xn est tel que f ′ (xn ) ∼ 0, le point xn+1 risque de se trouver projet´e fort loin du point de d´epart2 , un r´esultat contrariant alors qu’il s’agit d’une recherche en principe locale puisque bas´ee sur une approximation lin´eaire. Un deuxi`eme pi`ege est que si la fonction ´etudi´ee poss`ede plusieurs z´eros, rien ne permet de choisir `a coup sˆ ur celui que l’on veut puisqu’il n’y a pas d’intervalle de recherche pr´e-d´efini : on peut certes forcer le r´esultat `a rester dans un intervalle donn´e. Parfois, enfin, l’algorithme ne converge pas, mˆeme si une solution existe, en cas de changement de courbure malencontreux par exemple : un choix plus judicieux du point de d´epart peut r´egler le probl`eme.
4.1.3
Comment s’y prendre ?
Les paragraphes pr´ec´ecents d´ecrivent deux m´ethodes diff´erentes pour r´esoudre le mˆeme type de probl`eme, chacune avec ses qualit´es et ses d´efauts. En consultant des ouvrages sp´ecialis´es, on s’apercevra rapidement qu’il en existe d’autres. Comment proc´eder, alors ? La premi`ere ´etape est de tenter de d´egrossir qualitativement le probl`eme par des r´esolutions graphiques par exemple, soit `a l’aide de programmes de trac´e de courbes comme gnuplot, soit avec une calculette graphique, soit. . . a la main, ce qui est parfois le plus efficace car programmes ` et calculettes travaillent toujours dans un intervalle d´efini a priori et ne disent rien sur ce qui se passe ` a l’ext´erieur de cet intervalle, en particulier les asymptotes. La deuxi`eme ´etape est souvent de tenter de reformuler le probl`eme de fa¸con qu’il n’y ait qu’un seul z´ero dans le domaine « utile ». Par exemple, rechercher le z´ero de
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
0.8
tanh(x)−0.3*x tanh(x)/x−0.3
0.6 0.4 0.2 0 −0.2 −0.4 −0.6
−4
−2
0
2
4
tanh(x) Fig. 4.6 – Les courbes de tanh(x) − 0.3x et de − x 0.3 montrant que la deuxi`eme permet d’´eliminer la racine triviale pour x = 0 alors que les deux autres racines ne sont pas affect´ees. 1. l’algorithme lui-mˆeme peut-ˆetre plus ou moins pr´ecis 2. les nombres avec lesquels travaille l’ordinateur sont eux-mˆemes d´efinis avec une certaine pr´ecision. Par exemple, la m´ethode de la dichotomie, d´etermine un z´ero en l’encadrant par un intervalle d’´etendue b − a, puis b−a b−a . Comme le nombre d’it´erations est fini, , . . ., 2 2n cela donne la pr´ecision du calcul intrins`eque `a la m´ethode. Toutefois, mˆeme un algorithme parfait, s’il existait, ne pourrait pas donner des r´esultats infiniment pr´ecis `a cause du caract`ere fini de l’ordinateur lui-mˆeme qui ne peut pas repr´esenter un nombre de fa¸con parfaite.
4.2.1
Les nombres entiers.
Il a ´et´e mentionn´e que les nombres avaient une repr´esentation binaire, c’est-`a-dire constitu´ee de 0 et de 1. Ainsi pour les nombres entiers, on obtient la correspontanh x − ax = 0 dance habituelle entre repr´esentation d´ecimale (1`ere ligne) pour a < 1 donne trois solutions dont une solution triviale et binaire (2`eme ligne) : 0 1 2 3 4 5 6 7 8 ... pour x = 0 (figure 4.6) ; or l’ordinateur ne « sait » pas 0 1 10 11 100 101 110 111 1000 ... qu’elle est sans int´erˆet. Il peut ˆetre habile alors de chercher Une case contenant un 0 ou un 1 s’appelle un bit. plutˆ ot les solutions de Dans l’immense majorit´e des ordinateurs, les bits sont retanh(x) group´es par groupes de huit, les octets, ou bytes en an−a=0 x glais. Un octet constitue g´en´eralement un emplacement correspondant `a une adresse dans la m´emoire vive de l’orqui ´elimine la solution triviale si a 6= 1, puisque dinateur. Le tableau ci-dessus devrait donc se re´ecrire : 0 1 2 3 4 tanh(x) =1 lim 00000000 00000001 00000010 00000011 00000100 x→0 x C’est alors qu’on peut choisir une m´ethode, Newton si le probl`eme s’av`ere assez « civilis´e » dichotomie sinon.
5 00000101
6 00000110
7 00000111
8 00001000
... ...
Avec un octet on peut donc repr´esenter les nombres entiers allant de 0 `a 28 − 1 = 255 : c’est un peu limit´e, car aimerait pouvoir utiliser, d’une part, des nombres plus 4.2 Repr´ esentation des nombres on grands et, de l’autre, des nombres n´egatifs. dans un ordinateur. Pour pouvoir repr´esenter les nombres n´egatifs, on doit changer la convention et l’on prend le compl´ement `a Dans ce qui pr´ec`ede, on a introduit, sans trop insister, deux, soit, toujours sur un octet : 00000001 = 1 et la notion de pr´ecision du r´esultat. Cette pr´ecision n’est 11111110 = −1 au lieu de 254. Ainsi de 00000000 = 0 jamais absolue pour plusieurs raisons. `a 01111111 = 127 on code des nombres positifs et pour 2 Shot off to outer space comme disent joliment nos coll` egatifs, 11111110 = −1, 11111101 = −2, egues les nombres n´ am´ ericains. . . ., jusqu’` a 11111111 = −128. On peut v´erifier qu’avec
49
Physique num´erique, Philippe Depondt
cette convention l’addition suivante est correcte : −4 11111011 +2 00000010 = −2 11111101 Afin d’avoir une plage de nombres accessibles plus grande, les octets sont g´en´eralement regroup´es par ensembles de quatre (appel´es mots), soit 32 bits3 . Ainsi les nombres entiers peuvent aller de −231 = −2 147 483 648 `a 231 − 1 = 2 147 483 647, ce qui est largement suffisant pour la plupart des applications, mais, ´evidemment, pas infini.
4.2.2
Les nombres r´ eels.
Parler de nombres r´eels est un abus de langage puisque l’on √ ne peut traiter que les nombres rationnels. Ainsi, 2 sera approxim´e par, par exemple, 1,414213562. De plus, on est oblig´e de se restreindre encore davantage aux nombres rationnels ` a un nombre fini de chiffres : 1/3 devient par exemple 0,3333333333. Un tel nombre rationnel, si l’on supprime la virgule, est un nombre entier : il suffit de pr´eciser l’emplacement de la virgule, par une puissance de 10, par exemple. Ainsi, 1,414213562 peut s’´ecrire 1414213562 10−9 . Une autre fa¸con de s’y prendre serait : 0, 1414213562 101 . L’avantage de la deuxi`eme est que l’expression des chiffres composant le nombre est comprise entre 0 et 1, chaque chiffre correspondant non plus `a une puissance positive de 10 mais ` a une puissance n´egative. Il faut donc trois choses : le signe, la position de la virgule (ou l’exposant), et les chiffres (la mantisse). Le raisonnement men´e jusqu’` a pr´esent avec une notation d´ecimale peut-ˆetre tout aussi bien fait en binaire. Ainsi un nombre r´eel s’´ecrit, en g´en´eral sur quatre octets, soit 32 bits : 1 bit pour le signe, 8 bits pour l’exposant qui donne une puissance de 2 puisqu’il s’agit de nombres binaires, 23 bits pour la mantisse ; or le premier bit de la mantisse est toujours 1 (sinon, il faudrait diminuer l’exposant de 1), donc on l’omet ce qui permet de gagner un bit significatif. Dans ces conditions, les nombres r´eels peuvent s’´etendre de ±1, 175494 10−38 ` a ±3, 402823 1038 avec sept chiffres significatifs. Si cela ne suffit pas, on peut utiliser la double precision sur 8 octets qui donne 15 chiffres significatifs de 2, 225074 10−308 ` a 1, 797693 10308 . Certaines machines acceptent aussi les real*16 sur 16 octets. . .
pr´ecision machine, vaut 1000 : peu importe que l’on r´ep`ete l’op´eration un milliard de fois ! Finalement 1000 − 1000 = 0. . . En d´eclarant s en double precision on obtient : 0.9999894254 Il faut donc ˆetre assez m´efiant lorsqu’on traite des nombres qui prennent des valeurs tr`es diff´erentes. Il est aussi prudent de se rappeler que lorsqu’on fait des calculs it´eratifs, ce qui est tr`es souvent le cas, les erreurs peuvent s’ajouter les unes aux autres pour ne plus ˆetre n´egligeables du tout ! Un deuxi`eme cas de figure classique est le suivant : if( a == 0. ) then o` u a est un r´eel. Le r´esultat d’une telle instruction est al´eatoire `a cause des erreurs d’arrondi ! En effet, si a est le r´esultat de calculs longs et compliqu´es, va-t-il tomber pile sur z´ero ou sur 0.1234567E-35 ? Il vaut bien mieux d´efinir a priori la pr´ecision souhait´ee et donner l’instruction : if( abs(a) < epsilon ) then si la valeur absolue de a est plus petite que ε, alors. . . Ainsi, une r`egle d’or `a ne jamais oublier lorsqu’on fait des calculs num´eriques est de v´erifier sur des cas dont on connait la solution que les programmes que l’on a ´ecrits donnent bien la solution attendue. . . tout en sachant qu’il ne s’agit en aucun cas d’une garantie !
4.3 4.3.1
Suites et s´ eries. G´ en´ eralit´ es et premi` eres difficult´ es.
Une suite est d´efinie par une relation de r´ecurrence du type : un = f (un−1 , un−2 , . . . , un−p ) o` u un est une fonction de l’´el´ement de la suite pr´ec´edent ou de plusieurs ´el´ements pr´ec´edents. Par exemple, la factorielle : n! = n(n − 1)! avec 1! = 1 Une s´erie s’´ecrit comme : sn =
n X
ui ou bien sn = sn−1 + un
i=1
4.2.3
Cons´ equence.
Il n’est pas utile de faire un tableau contenant tous les termes de la suite ou de la s´erie, car on n’a en g´en´eral La cons´equence de tout ceci est que les calculs se font besoin que du dernier terme : c’est le reproche que l’on avec une certaine pr´ecision intrins`eque (qui est a priori bonne : sept chiffres significatifs. . .). Imaginons toutefois faisait `a la r´ecursivit´e. Dans le cas de la factorielle, il suffit d’´ecrire quelque chose qui ressemble `a le programme, certes stupide, suivant : implicit none integer :: i real :: s s = 1000. do i = 1, 1000000000 s = s + 1e-9 enddo write(*,*) s-1000. end
Le r´esultat obtenu est 0. et non 1. ! La raison en est que l’on ajoute 1000 + 1 10−9 ce qui, compte tenu de la 3 Certaines machines, comme les Cray ou certaines stations de travail, utilisent des mots de huit octets, soit 64 bits.
f = 1 do i = 2, n ; f = f*i ; enddo
en faisant croˆıtre i dans une boucle. Pour une s´erie, cela deviendrait : s = ... ! expression du premier terme do i = 2, n s = s + .... ! expression du terme general enddo 4 Le r´ esultat pr´ ecis d´ epend du type de la machine utilis´ ee, du compilateur : ici, il s’agit d’une machine Linux avec g77. Parfois il peut ˆ etre judicieux d’essayer le mˆ eme programme sur deux machines diff´ erentes avec deux compilateurs diff´ erents.
50
Licence de physique L3 : Physique Fondamentale & PHYTEM,
4.3.1.1
Pr´ ecision.
Il faut ˆetre prudent lors du calcul d’une suite car la remarque du paragraphe 4.2.3 s’applique tout `a fait et l’on a parfois des surprises. Par exemple, la s´erie : sn (x) = sn−1 (x) + (−1)n−1
2n−1
x , avec s1 (x) = x (2n − 1)!
est simplement le d´eveloppement de la fonction sinus limit´e `a l’ordre 2n − 1. Le programme suivant est l’application directe de cette formule : implicit none real :: x, s integer :: n, i, p, f, l n = 17 ! indice du dernier terme x = acos(-1.0)/2 ! calcul de pi/2 f = 1 ; s = x ; l = 1 ! initialisations do i = 2, n p = 2*i-1 ! exposant f = f*(p-1)*p ! factorielle l = -l ! changement de signe s = s + l*x**p/f enddo write(*,*) sin(x), s, s-sin(x) ! comparaison end
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
d´esastreuses6. Ce serait d’autant plus impardonnable qu’il existe une solution tr`es simple au probl`eme : Pn (x) = (. . . ((an x + an−1 )x + an−2 )x + . . .)x + a0 et cela se programme sans difficult´e `a l’aide d’une boucle d´ecroissante : real function polyn(x,a,n) ! schema de Horner integer :: i, n real, dimension(0:n) :: a real :: x, pn pn = a(n) do i = n-1, 0, -1 pn = pn*x + a(i) enddo polyn = pn end
On aurait tort de se priver !
4.3.2
Calcul des int´ egrales.
Toutes les int´egrales ne sont pas calculables analytiquement malgr´e les tables et les programmes de calcul formel, et c’est parfois bien utile de pouvoir les ´evaluer num´eriquement. Par exemple, admettons que l’on ait un fil charg´e. Le fil est d´ecrit par trois coordon´ees en fonction d’une abscisse ` l’ordre n = 17, ce qui correspond en fait `a un curviligne s : (x(s), y(s), z(s)) et sa charge par une densit´e A d´eveloppement limit´e ` a l’ordre 33 en x, on obtient pour lin´eique σ(s). Le potentiel ´electrostatique en un point de x = π2 , le r´esultat s=0.9964 au lieu de un, un r´esultat coordonn´ees (x0 , y0 , z0 ) s’´ecrit : un peu d´ecevant pour un ordre aussi ´elev´e. Pire, si l’on tente d’aller plus loin, n = 18, on obtient -INF. . . C’est V (x0 , y0 , z0 ) = Z s1 simplement que l’on est en train d’additionner des termes σ(s) ds 1 de signes oppos´es et que la diff´erence des valeurs absolues p 2 4πε0 s0 (x(s) − x0 ) + (y(s) − y0 )2 + (z(s) − z0 )2 est petite, donc ils se compensent en grande partie deux `a deux ; le r´esultat est entach´e d’une erreur relative importante. Si l’on essaye d’aller trop loin pour r´eduire l’erreur, les factorielles se mettent ` a produire des nombres gigantesques ! Il se trouve que pour ce genre de calcul, ce n’est pas la bonne m´ethode : il vaut mieux utiliser les polynˆomes dits « de Tchebytchev »5 . On peut en tirer deux conclusions. La premi`ere est que sommer des termes sans prendre de pr´ecautions est parfois dangereux. La deuxi`eme est que, lorsqu’on peut le faire, il est bon de classer les termes que l’on doit sommer par ordre croissant de telle fa¸con ` a ´eviter autant que possible les additions de termes d’ordre de grandeurs tr`es Fig. 4.7 – Un fil charg´e. diff´erents. 4.3.1.2
Polynˆ omes : le sch´ ema de Horner.
Si l’allure du fil ressemble `a celui de la figure 4.7, une int´egration num´erique sur ordinateur peut ˆetre une solution de bon goˆ ut !
Le calcul d’un polynˆ ome est un bon exemple de ce qui a ´et´e dit ci-dessus. Soit : 4.3.2.1 Pn (x) =
n X
aℓ xℓ
ℓ=0
Ne pas tenter de faire la somme ci-dessus directement ! En effet les puissances successives de x produiront sans aucun doute des termes dont les ordres grandeurs seront extrˆemement variables, avec des cons´equences 5 Voir par exemple dans les Numerical Recipes, r´ ef´ erence [3] dans la bibliographie.
M´ ethode des rectangles.
C’est la plus simple : il s’agit de remplacer une int´egrale par une somme finie (voir la figure 4.8) : Z
a
b
f (x) dx ∼
6 Numerical
n−1 X i=0
f (a + iδx )δx avec δx =
b−a n
Recipes (voir bibliographie, r´ ef´ erence [3]), qui n’y va pas avec le dos de la cuill` ere, va jusqu’` a menacer : « Come the (computer) revolution, all persons found guilty of such criminal behaviour will be summarily executed » ! L’humour est sans doute douteux, mais le message est clair.
51
Physique num´erique, Philippe Depondt
on remplace le calcul de la surface par une approximation soit en regroupant les termes identiques : constitu´ee d’une somme de surfaces de rectangles. ! Z b n−1 X 1 1 f (a + iδx ) + f (b) f (a) + f (x) dx ∼ δx 2 2 a i=1 on retrouve une formule tr`es similaire `a celle de la m´ethode des rectangles, mais elle est sym´etris´ee et les termes extrˆemes sont divis´es par deux : en fait, il s’agit d’une m´ethode des rectangles centr´ee dans laquelle les points extrˆemes « p`esent » moiti´e moins (figure 4.10).
Methode des rectangles a gauche
Methode des rectangles a droite
Fig. 4.8 – Les deux variantes de la m´ethode des rectangles. Une autre approximation tout aussi l´egitime serait : Z
a
b
f (x) dx ∼
n X
f (a + iδx )δx
i=1
La seule diff´erence est dans les bornes de la somme qui maintenant d´emarre en i = 1 au lieu de z´ero. Cela revient a ´evaluer la valeur de la fonction ` ` a droite de l’intervalle au Fig. 4.10 – Sch´ema ´equivalent `a la m´ethode des trap`ezes. lieu de l’´evaluer `a gauche. C’est pour cela que ces m´ethodes sont appel´ees m´ethodes des rectangles ` a gauche pour l’une, Le r´esultat en est un gain d’un ordre de grandeur sur a droite pour l’autre. En principe, plus n est grand, plus les l’incertitude du r´esultat. ` deux r´esultats doivent ˆetre proches : gare aux probl`emes d’arrondis num´eriques toutefois si n est trop grand ! 4.3.2.3 Recherche du pas d’int´ egration. La grosse diff´erence entre une int´egration num´erique et l’expression math´ematique est que le pas d’int´egration δx Une m´ethode moins primitive et ` a peine plus compliqu´ee ne tend pas vers z´ero, dans un calcul num´erique, il prend est la m´ethode des trap`ezes (figure 4.9). une valeur finie non nulle : c’est une approximation, il reste `a choisir cette valeur de la fa¸con la moins arbitraire possible. Une premi`ere m´ethode serait de choisir δx arbitrairement, faire le calcul d’int´egrale, puis choisir une autre valeur et refaire le calcul. Si les deux r´esultats diff`erent d’une quantit´e moindre que la pr´ecision souhait´ee, c’est que le calcul est « ind´ependant » de δx . Il n’est pas interdit d’essayer de syst´ematiser un peu ce genre de recherche. Commen¸cons par choisir δx = b − a, alors une premi`ere estimation de l’int´egrale par la m´ethode des trap`ezes serait : 4.3.2.2
M´ ethode des trap` ezes.
S0 = (b − a) Fig. 4.9 – La m´ethode des trap`ezes. La surface du i-i`eme trap`eze s’´ecrit : si =
1 (f (a + (i − 1)δx ) + f (a + iδx )) δx 2
et donc : Z b n X 1 (f (a + (i − 1)δx ) + f (a + iδx )) δx f (x) dx ∼ 2 a i=1
f (a) + f (b) 2
Pour une deuxi`eme estimation, on peut alors diviser δx par deux, on obtient alors : f (b) (b − a) f (a) a+b + S1 = +f 2 2 2 2 S0 + R1 = 2 avec, en posant h = b − a :
h a+b R1 = f 2 2
52
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
ce qui ´evite d’avoir ` a recalculer les deux points extrˆemes. sp = s/2 + r*hm On redivise le pas par deux, puis de nouveau encore, ! ---> le test force au moins quatre iterations if( abs(s-sp) < eps .and. n > 3 ) exit etc. Un calcul simple donne alors le terme g´en´eral de la s = sp r´ecurrence : Sn
=
Rn
=
Sn−1 + Rn 2 2n−1 h h X f a + (2i − 1) n 2n i=1 2
enddo trapeze = sp end
4.3.2.4
Un exemple : le principe de Fermat
Imaginons un rayon lumineux qui circule dans une fibre On arrˆete le calcul lorsque l’´ecart entre deux r´esultats suc- optique cylindrique, parall`ele `a x, dont l’indice d´epend de cessifs est inf´erieur ` a la pr´ecision requise : la distance `a l’axe : r2 |Sn − Sn−1 | < ε n = n0 1 − 2 2ρ C’est cependant une m´ethode qui n’est totalement d´enu´ee o` u n0 et ρ sont des constantes. Il s’agit d’une fibre `a grade danger : soit par exemple la fonction suivante (figure dient d’indice qui permet de pi´eger, pour ainsi dire, le 4.11), rayon lumineux au centre de la fibre. Si l’on se place dans le plan xOy, r2 se ram`ene `a y 2 et chercher le trajet du 1 rayon lumineux revient `a chercher la fonction y(x). Une incursion dans le cours d’optique fournit l’´equation de pro0.8 pagation d’un rayon lumineux : d~r 0.6 d n ds ~ n = grad (4.2) ds 0.4 o` u s est l’abscisse curviligne sur le rayon du point ~r. Ceci se r´esoud analytiquement assez ais´ement `a condition de se placer dans l’approximation o` u le rayon ne s’´eloigne pas 0 trop de l’axe de la fibre, de fa¸con que sa pente par rapport −2 −1.5 −1 −0.5 0 0.5 1 1.5 2 `a l’axe reste faible, de sorte que l’on puisse identifier ds `a Fig. 4.11 – Si l’on ne prend pas de pr´ecautions, l’int´egrale dx. On obtient : de cette fonction sera nulle ! d~r ∂n d n = 0 dx ∂x = ∂n si x < 0, 5 ou si x > 1, 5 f (x) = 0 n0 y dx = − 2 sinon f (x) = 1 ∂y ρ 0.2
que l’on souhaite int´egrer de a = −2 ` a b = 2. La premi`ere soit, apr`es quelques manipulations simples, ´etape donne z´ero, et . . . la deuxi`eme aussi. L’´ecart est nul n0 y d2 y n 2 =− 2 et donc inf´erieur `a ε : le programme s’arrˆetera. La mˆeme dx ρ m´esaventure arrive si l’on cherche Z π Il reste `a approximer n par n0 , puisqu’on ne s’´eloigne pas de l’axe de la fibre, et `a chercher des solutions du type : sin(x)dx −π
2π y(x) = a sin x on trouve le r´esultat correct (soit 0), mais compl`etement λ par hasard ! Il vaut mieux restreindre le calcul de 0 `a π. pour obtenir : Comme souvent dans ce genre d’activit´es, un minimum de λ = 2πρ circonspection s’impose. Un sous-programme pourrait donner quelque chose qui On obtient alors une trajectoire sinuso¨ıdale de p´eriode ressemble `a : 2πρ ind´ependante de l’amplitude des oscillations : c’est int´eressant pratiquement, car ainsi le rayon, mˆeme si, inidouble precision function trapeze(f, a, b, eps) tialement, il n’est pas parfaitement dans l’axe, se bornera implicit none `a osciller autour de celui-ci au cours de sa propagation. double precision :: f, a, b, eps, s, h, r, sp, hm Tout ceci reste cependant un peu formel et entach´e d’apinteger :: n, m, i proximations. Un cours d’optique normalement constitu´e affirme h = b-a ; m = 1 g´ e n´ eralement -voire mˆeme d´emontre- que l’´equation 4.2 s = h*(f(a)+f(b))*0.5d0 do n = 1, 20 ! 20 iterations max est une cons´equence du principe de Fermat qui veut que m = 2*m ! 2**n le chemin optique ne d´epende pas d’un petit changement hm = h/m ; r =0. de trajectoire, soit : do i = 1, m/2 ! de 1 a 2**(n-1) Z l r = r + f(a+(2*i-1)*hm) L = n ds est un extremum enddo 0
53
Physique num´erique, Philippe Depondt
L/lambda − n0
L egrales ind´ efinies. dans le cas de la trajectoire 4.3.2.5 Int´ Pour le v´erifier, calculons λ sinuso¨ıdale ci-dessus : Dans toutes les discussions ci-dessus, seules les Z λ 2 int´ egrales d´efinies ont ´et´e abord´ees. On ne peut pas calcuL n0 y = 1 − 2 ds ler par ces m´ethodes des int´egrales du type : λ λ 0 2ρ Z ∞ or s 2 f (x)dx dy −∞ ds2 = dx2 + dy 2 ⇒ ds = dx 1 + dx On a essentiellement deux solutions : soit l’int´egrale suivante ` a calculer : 1. la fonction f (x) doit tendre vers z´ero lorsque x → L ±∞, sinon le r´esultat est infini, alors on peut faire = λ l’approximation : !s 2 Z λ 2 2πx 2 a sin λ Z b Z ∞ 2π n0 2πx 1 + a2 1− cos2 dx f (x)dx f (x)dx ∼ λ 0 2ρ2 λ λ a −∞ (4.3) Choisissons de nous int´eresser au cas o` u a est petit par avec a et b suffisamment grands en valeur absolue rapport `a λ : on peut alors d´evelopper la racine carr´ee : pour que l’erreur soit n´egligeable. Par exemple, L Z 5σ Z ∞ ∼ x2 x2 λ e− σ2 dx e− σ2 dx ∼ ! ! 2 −5σ −∞ Z a2 sin2 2πx a2 2π n0 λ 2 2πx λ dx 1+ cos 1− n’est pas une mauvaise approximation. λ 0 2ρ2 2 λ λ 2. une m´ethode plus ´el´egante est de d´ecouper l’int´egrale peut ensuiteR ´eliminer le terme en a4 et sachant que ROn 2π 2π 2 2 Z ∞ Z b Z a Z ∞ sin x dx = 0 cos x dx = π, on finit par avoir : 0 f (x)dx f (x)dx + f (x)dx + f (x)dx = L a2 π 2 a2 b a −∞ −∞ ∼ n0 1 − 2 + 2 λ 4ρ λ et de faire des approximations pour les extr´emit´es, La condition pour que L ne d´epende pas de a est que : sur la base d’un d´eveloppement limit´e par exemple. Une illustration physique simple pourrait ˆetre une disλ = 2πρ tribution lin´eique de charges sur une pelote de ficelle ce qu’on avait d´ej` a trouv´e auparavent : l’int´erˆet du sede forme compliqu´ee mais dont les extr´emit´es vont `a cond calcul ´etant de montrer que le chemin optique ne l’infini. Le potentiel cr´e´e `a l’origine pourrait s’´ecrire : d´ependant pas de a, une source de lumi`ere coh´erente Z ∞ plac´ee `a l’entr´ee de la fibre sur son axe, et produisant σ(s) 1 p ds V = un faisceau non totalement parall`ele, donnera, en sortie 4πε0 −∞ x2 (s) + y 2 (s) + z 2 (s) de la fibre, un faisceau qui n’aura pas perdu sa coh´erence, malgr´e la divergence. o` u, σ, x, y et z sont des fonctions connues de l’abscisse curviligne s. Admettons qu’une approximation 0 serait que lorsque s > b alors σ ∼ sς et que −0.01 p 2 x (s) + y 2 (s) + z 2 (s) ∼ s. On obtient alors, −0.02 −0.03 Z ∞ Z ∞ ς σ(s) ς −0.04 p ds ∼ ds = 2 2 2 2 s b x (s) + y (s) + z (s) b b −0.05 −0.06 −0.07 −0.08 −0.09 −0.1
0
0.2
0.4
0.6
0.8
1
a
ee Fig. 4.12 – L’int´egrale L λ − n0 en fonction de a calcul´ num´eriquement par la m´ethode des trap`ezes.
La mˆeme approximation pour s < a donnerait en fin de compte : # " Z b ς σ(s) ς 1 p − + ds + V = 4πε0 a b x2 (s) + y 2 (s) + z 2 (s) a o` u la partie centrale serait calcul´ee par la m´ethode des trap`ezes.
On peut ´egalement utiliser des m´ethodes similaires autour On est toutefois en droit de se demander quelle est de points singuliers `a condition de les avoir identifi´es au la validit´e des approximations que l’on a faites : pour pr´ealable. cela, il suffit d’int´egrer num´eriquement l’´equation (4.3) (Exercice : le faire ! 7 ) en faisant varier a pour λ = 2πρ : ´ Echantillonnages, interpolacela donne la figure 4.12 ; on constate que tant que a < 4.4 0.5ρ, l’erreur reste inf´erieure ` a 0.01, (pour L ∼ 1.5) ce tion. qu’on n’aurait probablement pas devin´e sinon. 7 prendre par exemple ρ = 1 et n = 1.5. On calculera en double On a vu, pour le probl`eme de l’int´egration, l’impor0 precision. tance du pas d’int´egration : c’est d´ej` a une premi`ere forme
54
Licence de physique L3 : Physique Fondamentale & PHYTEM,
d’´echantillonnage puisqu’une fonction d´efinie sur un morceau de l’axe r´eel se trouve r´eduite ` a un ensemble discret de points.
4.4.1
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Interpolation lin´ eaire.
C’est la plus simple : si x est compris entre xℓ et xℓ+1 , on ´ecrit la fonction approch´ee pℓ (x),
De mˆeme, lorsqu’on demande ` a un logiciel comme gnuplot (ou `a une calculette graphique, d’ailleurs) de traf (xℓ+1 ) − f (xℓ ) (x − xℓ ) (4.4) pℓ (x) = f (xℓ ) + cer le graphe d’une fonction, sin x par exemple, il calxℓ+1 − xℓ cule les valeurs de la fonction en un certain nombre de points, reli´es ensuite par des lignes droites ; en g´en´eral, ce qui revient `a consid´erer la fonction comme localement les « options par d´efaut » permettent d’´eviter de pr´eciser lin´eaire. L’erreur est ´evidemment d’autant plus grande que comment on veut que ce choix de points soit fait, ce la courbure de la fonction est grande. qui donne une fausse impression d’´evidence au choix de l’´echantillonnage. 4.4.2 Approximation parabolique. 1 0.8 0.6 0.4 0.2 0 −0.2 −0.4 −0.6 −0.8 −1 −10
−5
0
5
10
Fig. 4.13 – Le graphe de la fonction sin(100x) trac´e sans pr´ecaution particuli`ere. Fig. 4.14 – Approximation lin´eaire et approximation paIl arrive toutefois, comme on peut le constater sur la rabolique autour du point situ´e en x=0.5. figure 4.13, que le r´esultat ne soit pas ` a la hauteur des Pour tenir compte de la courbure, on peut remplacer esp´erances ! Dans cet exemple, en effet, on a tent´e de tra2π cer une fonction p´eriodique de p´eriode 100 a l’aide d’un l’approximation lin´eaire par une parabole qui, cette fois ` ´echantillonnage de 100 points sur un intervalle de longueur doit passer par trois points. Ainsi : 20, soit un pas d’´echantillonnage de 0, 2 plus grand que la pℓ (x) = aℓ x2 + bℓ x + cℓ p´eriode de la fonction. . . ´echec assur´e, encore fallait-il le pr´evoir8. de fa¸con que : Ainsi, une fonction9 y = f (x) pour un ordinateur est toujours repr´esent´ee en fin de compte par un nombre pℓ (xℓ−1 ) = f (xℓ−1 ) fini de points, c’est-` a-dire par un nombre fini de couples pℓ (xℓ ) = f (xℓ ) (xi , yi ). Dans le cas du sinus, bien sˆ ur, on peut toujours pℓ (xℓ+1 ) = f (xℓ+1 ) calculer des points suppl´ementaires si l’aspect de la courbe n’est pas convenable. Cependant, ce n’est pas toujours possible, soit parce que le temps de calcul ` a investir se- On obtient ais´ement : rait trop long, soit parce qu’il s’agit de donn´ees obtenues (x − xℓ )(x − xℓ+1 ) pℓ (x) = f (xℓ−1 ) autrement, exp´erimentalement par exemple, et qu’il n’est (xℓ−1 − xℓ )(xℓ−1 − xℓ+1 ) pas question de refaire l’exp´erience avec, mettons, cent fois (x − xℓ+1 )(x − xℓ−1 ) plus de points. . . or il peut arriver que l’on ait besoin de + f (xℓ ) (xℓ − xℓ+1 )(xℓ − xℓ−1 ) connaˆıtre la valeur de la fonction entre deux points. (x − xℓ−1 )(x − xℓ ) On peut, bien souvent, s’en sortir quand mˆeme `a l’aide + f (xℓ+1 ) (x ℓ+1 − xℓ−1 )(xℓ+1 − xℓ ) d’approximations moyennant quelques hypoth`eses. 8 le
logiciel gnuplot permet de d´ efinir le nombre de points que l’on veut sur un intervalle : par exemple set samples 1000 indique que dor´ enavent l’intervalle sera d´ ecrit pas 1000 points (au lieu de 100, la valeur par d´ efaut). Cependant, tenter de r´ esoudre le probl` eme de cette fa¸con serait dans ce cas d´ ecevant parce qu’on obtiendra selon toute vraisemblance un ´ ecran tout noir. . . Il est vrai que vouloir tracer une courbe de p´ eriode 2π/100 ≃ 0,0628 sur un intervalle [−10, 10], c’est chercher la difficult´ e. 9 Au sens math´ ematique, bien sˆ ur, il ne s’agit pas de la function fortran.
ceci est valable dans l’intervalle [xℓ − h2 , xℓ + h2 ] o` u, bien sˆ ur, h est l’intervalle entre deux points successifs. A priori cette approximation est meilleure que la pr´ec´edente, permettant une bonne description de la fonction avec un nombre de points plus faible ; il y cependant une hypoth`ese importante derri`ere cela, c’est que la fonction ne se livre pas `a des excentricit´es entre deux points successifs, par exemple, qu’il n’y ait pas de point singulier ou de variations ´enormes entre deux points connus.
55
Physique num´erique, Philippe Depondt
4.4.3
Polynˆ omes de Lagrange.
Il est ais´e quoique rapidement fastidieux de g´en´eraliser la m´ethode ci-dessus ` a un polynˆ ome de degr´e n quelconque. On obtient un polynˆ ome passant par les n + 1 points (x0 , f (x0 )), . . ., (xℓ , f (xℓ )) . . ., (xn , f (xn )) : pn (x) = n X
f (xℓ )
ℓ=0
(x − x0 ) . . . (x − xℓ−1 )(x − xℓ+1 ) . . . (x − xn ) (xℓ − x0 ) . . . (xℓ − xℓ−1 )(xℓ − xℓ+1 ) . . . (xℓ − xn )
dans les produits du num´erateur et du d´enominateur de la fraction ci-dessus, manquent ´evidemment les termes x−xℓ et . . . xℓ − xℓ ! Le choix du degr´e le plus appropri´e pour le polynˆome n’est pas facile. Une bonne r`egle est de ne pas essayer de trop bien faire ! En effet le choix d’un degr´e trop ´elev´e, bien loin d’am´eliorer l’interpolation, risque de produire des oscillations compl´etement erratiques de l’interpolation entre les points connus. Il est bien rare qu’un degr´e sup´erieur a 3 se justifie vraiment, c’est en g´en´eral le signe que l’on ` commence `a manquer de donn´ees de r´ef´erences : peut-ˆetre est-il temps alors d’envisager de faire quelques points de mesure exp´erimentaux suppl´ementaires. . . L’informatique, contrairement `a la magie, ne peut pas tout faire, en particulier inventer des donn´ees num´eriques manquantes !
4.4.4
D´ eriv´ ees.
Fig. 4.15 – Deriv´ee d’un sinus affect´e d’un l´eger bruit. La d´eriv´ee, elle, est affect´ee d’un fort bruit, mˆeme si l’allure g´en´erale est convenable.
4.5 4.5.1
Alg` ebre lin´ eaire. Un exemple : la diffusion de la chaleur ` a une dimension.
La loi de Fourier de diffusion de la chaleur dit simplement que le flux de chaleur en un point est proportionnel au gradient de temp´erature : ~ r ) = −κ(~r) grad ~ T (~r) φ(~
Les mˆemes m´ethodes permettent en principe une ´evaluation des d´eriv´ees successives d’une fonction puisqu’` a partir de l’expression d’un polynˆ ome de Lagrange de degr´e n on peut facilement obtenir des expressions pour les d´eriv´ees jusqu’` a la d´eriv´ee n-i`eme. Par exemple, une expression de la d´eriv´ee premi`ere peut ˆetre obtenue `a partir de l’approximation lin´eaire, ´eq. (4.4) : p′ℓ =
f (xℓ+1 ) − f (xℓ ) xℓ+1 − xℓ
o` u κ(~r) est la conductivit´e thermique qui d´epend de la nature du milieu. Si celui-ci est homog`ene, κ est une constante, sinon κ d´epend de la position ~r. Si l’on produit de la chaleur en un point ~r donn´e (par effet Joule ou par un apport quelconque, ou encore au contraire par une perte dans l’atmosph`ere), cette chaleur doit diffuser et cette chaleur diffus´ee par unit´e de temps ˙ r ) de chaleur produite par doit ˆetre ´egale `a la quantit´e Q(~ unit´e de temps, ce qui donne :
~ r ) = Q(~ ˙ r) div φ(~ En fait, il s’agirait plutˆ ot d’un calcul de la d´eriv´ee en xℓ+1 +xℓ , au milieu de l’intervalle, et non en xℓ . Si l’on En combinant ces deux ´equations, on obtient facilement : 2 pr´ef`ere une expression plus sym´etrique qui donne une ~ κ(~r) · grad ~ T (~r) + κ(~r) ∆T (~r) = −Q(~ ˙ r) grad (4.5) autre estimation plus pr´ecis´ement en xℓ : p′ℓ =
f (xℓ+1 ) − f (xℓ−1 ) xℓ+1 − xℓ−1
Cette ´equation, alli´ee `a d’´eventuelles conditions aux limites, permet, en principe, de calculer la distribution de temp´erature en r´egime stationnaire dans un objet, ˙ r ) et κ(~r). Autant dire que ce n’est pas connaissant Q(~ toujours facile : que faudrait-il faire pour une r´esolution num´erique ? Pour simplifier, on se restreindra ici `a une dimension, mais le probl`eme n’est pas tr`es diff´erent `a trois dimensions, du moins dans des g´eom´etries simples. L’´equation (4.5) se r´eduit alors `a :
On montre d’ailleurs ais´ement que cette derni`ere expression vient de la d´erivation de l’approximation parabolique. Il faut cependant ˆetre assez prudent. Outre la remarque ci-dessus concernant la limite pratique sur le degr´e du polynˆome utilis´e, il faut ˆetre conscient qu’un calcul de d´eriv´ee va tendre `a amplifier le bruit (figure 4.15). En effet, des fluctuations locales, de point ` a point, de la fonction peuvent donner des valeurs num´eriques importantes pour, dκ dT d2 T mettons, la d´eriv´ee premi`ere, et ces valeurs risquent de ˙ + κ 2 = −Q(x) dx dx dx changer brutalement d’un point ` a un autre. En pratique, Le premi`ere ´etape est de discr´etiser le probl`eme : on on se limite donc `a des d´eriv´ees d’ordre faible, un voire deux, sur des donn´ees de tr`es bonne qualit´e intrins`eque. pose, On verra dans le chapitre 4.8 d’autres m´ethodes plus sˆ ures x = i δx en pr´esence de bruit.
56
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
o` u i est un entier et δx un pas d’int´egration, similaire `a ce d’invoquer la biblioth`eque lors de la compilation : c’est en qui a d´ej` a ´et´e vu dans le chapitre 4.3.2. On note alors : g´en´eral une option de compilation11 : le compilateur ira puiser dans la biblioth`eque ce dont il a besoin. . . T (x) = T (i δx ) = Ti Il n’y a donc aucune raison de r´einventer la roue ! C’est en fait une d´emarche tr`es courante en calcul scientifique : dT on se pose un probl`eme de physique, puis on se demande La d´eriv´ee peut ˆetre approch´ee par : dx comment le traduire de fa¸con `a le traiter avec un programme de biblioth`eque d´ej` a existant. dT Ti+1 − Ti ∼ Dans le cas pr´ e sent, un syst` eme d’´equations lin´eaires se dx δx pr´esente de la fa¸con suivante : ou bien a11 x1 + a12 x2 + a13 x3 + · · · + a1n xn = b1 dT Ti − Ti−1 ∼ a = b2 21 x1 + a22 x2 + a23 x3 + · · · + a2n xn dx δx a31 x1 + a32 x2 + a33 x3 + · · · + a3n xn = b3 ou encore : a41 x1 + a42 x2 + a43 x3 + · · · + a4n xn = b4 dT Ti+1 − Ti−1 ∼ ··· dx 2δx an1 x1 + an2 x2 + an3 x3 + · · · + ann xn = bn On pr´ef`erera la troisi`eme forme plus sym´etrique. La o` u l’on cherche les xi . Le probl`eme peut se reformuler en d´eriv´ee seconde, la d´eriv´ee de la d´eriv´ee, s’´ecrit : termes matriciels : Ti+1 − Ti Ti − Ti−1 A·x=b − Ti+1 − 2Ti + Ti−1 d2 T δx δx avec ∼ = dx2 δx δx2 a11 a12 a13 · · · a1n a21 a22 a23 · · · a2n Cela donne donc, avec des notations ´evidentes : a31 a32 a33 · · · a3n A= a41 a42 a43 · · · a4n Ti+1 − 2Ti + Ti−1 dκ Ti+1 − Ti−1 + κi = −Q˙ i (4.6) ··· 2 dx i 2δx δx an1 an2 an3 · · · ann Si L est la longueur du barreau, alors n = δLx est le nombre et x1 b1 de segments sur le barreau : c’est a priori un nombre qui x2 b2 peut ˆetre grand, quelques centaines, milliers, voire plus ; x3 b3 or, l’´equation (4.6) se re´ecrit ais´ement : x= b= x4 b4 ··· ··· κi κi 1 dκ Ti+1 − 2 2 Ti + + xn bn 2δx dx i δx2 δx Pour ce qui est de la matrice A, il faut savoir que fortran stocke les matrices multicolonnes colonne par κi 1 dκ Ti−1 = −Q˙ i + − colonne : une colonne, puis une autre, puis une autre. 2δx dx i δx2 En m´emoire, se succ`edent ainsi : a11 , a21 , a31 , · · · an1 ou bien (premi`ere colonne), a12 , a22 ,. . .(deuxi`eme colonne),. . . etc., c’est-`a-dire que le premier indice « va le plus vite » (en ai,i+1 Ti+1 + ai,i Ti + ai,i−1 Ti−1 = bi ∀i C, c’est l’inverse). Si l’on veut ´ecrire des programmes efficaces, il faut tenter de privil´egier les appels `a des ´el´ements o` u les ai,j sont connus et o` u l’on cherche ` a calculer les successifs en m´emoire12 , et donc dans les boucles imTi . On vient de reformuler le probl`eme comme un syst`eme briqu´ees, mettre autant que possible, le premier indice lin´eaire de n ´equations ` a n inconnues (les Ti ) : si on peut dans la boucle la plus interne. Par exemple : trouver des m´ethodes pour r´esoudre de tr`es gros syst`emes do j = 1, n ! boucles dans le bon ordre d’´equations lin´eaires, alors le probl`eme ci-dessus peut ˆetre a(1:n,j) = ... consid´er´e comme r´esolu. enddo
4.5.2
Syst` emes d’´ equations lin´ eaires.
Au del` a de n = 2 ou 3, il ne faut surtout pas tenter de r´esoudre le syst`eme lin´eaire en proc´edant par ´elimination comme on le fait d’habitude pour une r´esolution ` a la main : les probl`emes de stabilit´e num´erique deviennent tr`es vite cruciaux. Il vaut bien mieux utiliser des sous-programmes de biblioth`eque : ce sont des programmes d´ej` a ´ecrits, souvent depuis longtemps, ´eprouv´es, dont les qualit´es et les d´efauts sont connus, compil´es et rassembl´es dans des biblioth`eques. Il suffit d’appeller le sous-programme choisi par un call dans le programme que l’on a ´ecrit comme n’importe quel autre sous-programme, en suivant toutefois les indications fournies dans la documentation10 puis 10 Souvent
en ligne.
et non l’inverse : do i = 1, n ! boucles dans le mauvais ordre a(i,1:n) = ... enddo
Pour r´esoudre le syst`eme d’´equations, on pourrait imaginer qu’il suffise de calculer l’inverse de la matrice A et faire le produit : x = A−1 · b mais il se trouve que les algorithmes de r´esolution directe du syst`eme d’´equations sont plus efficaces. 11 g´ en´ eralement,
l’option -l (pour library=biblioth` eque), par exemple avec la biblioth` eque linpack : g95 machin.f90 -llinpack -o machin. 12 Parce que le compilateur g` ere mieux les transferts entre m´emoire et processeur de paquets de nombres connexes que des nombres pris dans n’importe quel ordre.
57
Physique num´erique, Philippe Depondt
n(n + 1) ´el´ements a 2 2 C’est le v´eritable cheval de bataille de tous ces priori non nuls, ainsi que U, soit n + n inconnues, et donc probl`emes (voir r´ef. [3] pour une discussion plus appro- n de trop. On fixe alors : fondies des qualit´es et d´efauts des diff´erentes m´ethodes, par exemple Gauss-Jordan). lii = 1, ∀i Imaginons que l’on ait d´ecompos´e la matrice A en un Pour i ≤ j, on obtient ais´ement : produit de deux matrices : 4.5.2.1
La m´ ethode LU
A= L·U o` u L est une matrice triangulaire inf´erieure (L = lower ) qui n’a des ´el´ements que sur et sous la diagonale : l11 0 0 0 l21 l22 0 0 L= l31 l32 l33 0 l41 l42 l43 l44
dans le cas o` u n = 4, et U est une matrice triangulaire sup´erieure (U = upper ) qui n’a des ´el´ements que sur et au dessus de la diagonale : u11 u12 u13 u14 0 u22 u23 u24 U= 0 0 u33 u34 0 0 0 u44 Le syst`eme initial se re´ecrit :
L · (U · x) = b il reste `a chercher y tel que : L·y =b puis x tel que : U·x =y
Il y a n2 ´equations, or L comporte
uij = aij −
i−1 X
lik ukj
(4.8)
k=1
Enfin, pour i > j : 1 lij = ujj
aij −
j−1 X
k=1
lik ukj
!
(4.9)
Tous les termes dans les sommes des ´equations (4.8) et (4.9) sont d´ej` a calcul´es `a condition d’appliquer les deux ´equations par i croissants pour un j donn´e, puis changer de j. Il ne s’agit finalement que d’un r´eordonancement tr`es simple du probl`eme. En g´en´eral, les programmes qui appliquent cet algorithmes d´etruisent le contenu de la matrice A en rangeant les ´el´ements de L dans la partie inf´erieure de A, et les ´el´ements de U dans la partie sup´erieure, sachant que les lii ne sont pas conserv´es, puisqu’ils valent 1. En outre, afin de limiter les d´egˆats lors des divisions par ujj dans l’´equation (4.9), un certain r´earrangement des lignes et colonnes du syst`eme d’´equations doit ˆetre fait pour commencer par les ´el´ements pour lesquels ujj est grand (une division par un nombre tr`es petit donne parfois des r´esultats impr´evisibles). Les programmes de biblioth`eque font cela et souvent fournissent en prime des diagnostics lorsque A est singuli`ere, ou trop proche d’une matrice singuli`ere.
L’avantage de proc´eder ainsi est que maintenant le syst`eme elioration it´ erative de la pr´ ecision. est trivial `a cause de la forme triangulaire des deux ma- 4.5.2.2 Am´ trices : Il faut n´eanmoins faire un peu attention `a la pr´ecision du 1 1 b1 et dans les r´esultat obtenu, car les termes du type y1 = lii uii l11 ´equations (4.7) et (4.9) peuvent donner lieu `a des surprises 1 si les diviseurs sont petits. Il y a plusieurs fa¸cons de s’en [b2 − l21 y1 ] y2 = l22 sortir. La premi`ere consiste `a utiliser un sous-programme 1 de biblioth`eque capable de d´etecter ce genre de probl`eme : y3 = [b3 − (l31 y1 + l32 y2 )] l33 pratiquement toutes les biblioth`eques en proposent. Un ··· (4.7) autre test possible est de comparer les r´esultats obtenus en simple et en double pr´ecision. puis, en proc´edant de mˆeme ` a l’envers : Une cure possible est de partir d’une solution approch´ee ′ x , et donc fausse, obtenue par, mettons, la m´ethode LU yn xn = et de chercher `a l’am´eliorer. unn Soit : ··· A · x′ = b + δb Reste `a faire la d´ecomposition proprement dite. u δb est l’erreur qu’il faut r´eduire ; or : Il s’agit d’un algorithme typique de ceux dont sont o` friands les amateurs. Nous le d´etaillons ici pour le plaix′ = x + δx, et A · x = b sir de ce genre de tourisme13 ! Cela s’appelle l’algorithme de Crout. donc : Le probl`eme est de trouver lij et uij tels que : A · δx = δb = A · x′ − b min(i,j)
X
lik ukj = aij
k=1 13 Et
surtout pas pour l’apprendre par cœur. . .
qui est un syst`eme que l’on peut r´esoudre pour obtenir δx. On peut alors corriger x′ et recommencer jusqu’` a obtenir la pr´ecision voulue, `a condition ´evidemment que l’algorithme converge. . .
58
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
ot Il faut savoir cependant que les biblioth`eques pro- nuls. On ´ecrit plutˆ posent g´en´eralement un tr`es grand nombre de sous d1 f1 0 0 0 ··· 0 programmes pr´evus pour des cas tr`es divers : il est 0 ··· 0 e2 d2 f2 0 donc conseill´e de choisir le programme adapt´e. Toutefois, 0 e3 d3 f3 0 ··· 0 pour la plupart des probl`emes « standards » du physi ··· ··· ··· ··· ··· · · · · ·· A= cien, la m´ethode LU est tr`es satisfaisante, mais pour les ··· 0 ei di fi 0 ··· probl`emes exigeant d’´enormes matrices creuses tels que les ··· ··· ··· ··· ··· ··· ··· m´ethodes d’´el´ements finis (pour la r´esolution de probl`emes 0 0 · · · 0 en−1 dn−1 fn−1 de m´ecanique des fluides par exemple), des m´ethodes 0 0 ··· 0 0 en dn sp´ecialement pr´evues ` a cet effet doivent ˆetre utilis´ees. qui ne n´ecessite que trois tableaux de n ´el´ements, d pour la diagonale, e pour la sous-diagonale et f pour la surdiagonale. Noter que e1 et fn ne sont pas d´efinis. 4.5.2.3 Matrice inverse. Les ´equations (4.8) et (4.9) se r´eduisent `a : Une fois la d´ecomposition achev´ee, il est facile de remi = j − 1 uj−1j = ej placer b par : i=j ujj = dj − ljj−1 uj−1j 1 fj 0 i = j + 1 lj+1j = 0 ujj .. . Les ´equations ci-dessus ne constituent pas en elles-mˆeme 0
l’int´erˆet principal de ce paragraphe : le but est ici d’attirer l’attention sur le fait que pour un type de matrice, ce qui donne la premi`ere colonne de A−1 dans x, puis on la m´ethode de r´esolution que l’on choisira n’est pas touproc`ede colonne par colonne en posant : jours la mˆeme que pour un autre type de matrice. Les biblioth`eques sont parfois fort riches et il est de bon 0 ton de chercher un peu dans la documentation quel peut .. ˆ etre le sous-programme le plus adapt´e au cas particu . lier envisag´e. Il existe des solutions pour des matrices b= 1 « bande-diagonales » ou des solutions it´eratives par ap . .. proximations successives pour des probl`emes difficiles, des d´ecompositions en valeurs singuli`eres quand le probl`eme 0 se pose. . ., les ressources sont abondantes, parfois un peu en pla¸cant le nombre 1 sur la i-`eme ligne de b pour obtenir trop, mˆeme ! la i-`eme colonne de A−1 .
4.5.3 4.5.2.4
D´ eterminant d’une matrice.
Une g´ en´ eralisation de la m´ ethode de Newton ` a plusieurs dimensions.
Au chapitre 4.1.2, on a mentionn´e le fait que la m´ethode de Newton de recherche de z´ero pouvait se g´en´eraliser `a plusieurs dimensions. Cela peut ˆetre utile, si par exemple, n Y au lieu d’un seul pendule comme dans l’exemple, on en ujj det A = avait plusieurs coupl´es entre eux et non plus astreints `a se j=1 d´eplacer dans un plan : on aurait alors deux angles polaires par pendule `a trouver et donc un syst`eme de 2N variables `a rechercher. 4.5.2.5 Matrice tridiagonale. C’est le moment de s’y attaquer. Soit donc n fonctions de n variables Si l’on ´etudie l’´equation (4.6), on s’aper¸coit vite que seuls les termes en i − 1, i et i + 1 sont non nuls. La fj (x1 , . . . , xi , . . . , xn ), ∀j ∈ [1, n] matrice A ne comporte alors que des termes diagonaux, sous-diagonaux et sur-diagonaux : elle est donc tridiago- dont on suppose qu’elles poss`edent un z´ero et qu’elles sont nale : raisonnablement « civilis´ees »14 : ces fonctions ne sont C’est encore plus simple :
A=
a11 a21 0 ··· ··· ··· 0 0
a12 a22 a32 ··· 0 ··· 0 0
0 a23 a33 ··· aii−1 ··· ··· ···
0 0 a34 ··· aii ··· 0 0
0 0 0 ··· aii+1 ···
an−1n−2 0
··· ··· ··· ··· 0 ···
an−1n−1 ann−1
0 0 0 ··· ··· ···
an−1n ann
Dans ce cas, il n’est nul besoin de stocker toute la matrice A avec ses n2 ´el´ements puisque, pour la plupart, ils sont
toutefois ´evidemment pas lin´eaires. On d´emarre la recherche comme avant `a partir d’un point de d´epart : (0)
(0)
x1 , . . . , xi , . . . , x(0) n on lin´earise alors les fonctions localement : fj (x1 , . . . , xi , . . . , xn ) 14 Le terme civilis´ e pour une fonction signifie en gros que l’algorithme que l’on va utiliser marche. . .
59
Physique num´erique, Philippe Depondt
= (0) (0) fj (x1 , . . . , xi , . . . , x(0) n )+
∂fj ∂fj ∂fj dx1 + . . . + dxi + . . . + dxn ∂x1 ∂xi ∂xn
ce qui donne : 2 ω a1
ω 2 a2
=
C g a1 + (a1 − a2 ) ℓ1 m1 ℓ 1 g C a2 + (a2 − a1 ) ℓ2 m2 ℓ 2
= On cherche le point {xi } tel que o` u dxi = xi − fj (x1 , . . . , xi , . . . , xn ) = 0, ∀j, donc les ´equations ci- et : dessus se re´ecrivent : g C C 2 + − ω a1 − a2 = 0 ∂fj ∂fj ∂fj ℓ1 m1 ℓ 1 m1 ℓ 1 dx1 + . . . + dxi + . . . + dxn ∂x1 ∂xi ∂xn C g C − a1 + + − ω 2 a2 = 0 = m2 ℓ 2 ℓ2 m2 ℓ 2 (0) (0) −fj (x1 , . . . , xi , . . . , x(0) n ) ce qui se r´esout ais´ement en ´ecrivant que le d´eterminant C’est un syst`eme d’´equations lin´eaires dont les inconnues du syst`eme est nul, etc.15 sont les {dxi } : Cependant, on peut re´ecrire le probl`eme matricielleJ · dx(1) = −f (0) ment : D · a = ω2a avec des notations sans surprise. La matrice J des d´eriv´ees ∂fj , s’appelle la matrice jacobienne. partielles, Jij = avec ´evidemment : ∂xi On r´esout donc le syst`eme, ce qui permet de calculer les g C C (1) − + a convergence, comme {xi } puis on recommence jusqu’` ℓ1 m1 ℓ 1 m1 ℓ 1 a1 , a = D= dans le cas `a une dimension. a2 C g C + − m2 ℓ 2 ℓ2 m2 ℓ 2 (0) xi .
4.5.4
Probl` emes de vecteurs propres et de La matrice D s’appelle la matrice dynamique du syst`eme valeurs propres ou eigenproblems.
Il s’agit de r´esoudre l’´equation : A · x = λx o` u connaissant A, on en cherche les valeurs propres λ et les vecteurs propres x. 4.5.4.1
Un exemple : les modes propres d’un ensemble d’oscillateurs harmoniques coupl´ es.
Prenons un cas tr`es simple : deux pendules simples coupl´es par un fil de torsion. L’´energie potentielle du syst`eme s’´ecrit : 1 V = −m1 g cos θ1 − m2 g cos θ2 + C(θ1 − θ2 )2 2 avec des notations ´evidentes. Les ´equations du mouvement s’en d´eduisent sans difficult´e : g C θ¨1 = − ℓ sin θ1 − m ℓ (θ1 − θ2 ) 1 1 1 g C θ¨2 = − sin θ2 − (θ2 − θ1 ) ℓ2 m2 ℓ 2
et l’on s’aper¸coit donc que ω 2 est une valeur propre de la matrice dynamique et que a en est un vecteur propre. Pour un syst`eme 2 × 2 comme celui-ci, l’int´erˆet d’une telle remarque n’est pas ´evident, mais pour un syst`eme 100 × 100 ? Par exemple, une mol´ecule qui comporte ne seraitce que quelques dizaines d’atomes. . . il suffit alors d’´ecrire la matrice dynamique du syst`eme, une matrice n × n o` u n est le nombre de degr´es de libert´e du syst`eme, et d’en chercher valeurs et vecteurs propres. Il se trouve qu’il y a des algorithmes tr`es efficaces pour calculer num´eriquement les valeurs propres et les vecteurs propres de tr`es grosses matrices. Ici encore, la fa¸con de proc´eder d´epend du type de matrice que l’on veut ´etudier, et ici encore, il faut faire appel `a des programmes de biblioth`eque. 4.5.4.2
Matrices tridiagonales sym´ etriques : la m´ ethode QL.
La matrice dynamique du paragraphe 4.5.4.1 peut ˆetre √ sym´etris´ee √ en rempla¸cant a1 par α1 = m1 ℓ1 a1 et a2 par α2 = m1 ℓ2 a2 . De plus, si le nombre de pendules est plus grand que deux, si les pendules sont align´es et chaque pendule n’interagit qu’avec ses deux voisins les plus Puisque l’on s’int´eresse ici ` a un probl`eme lin´eaire, on peut proches, la matrice D est tridiagonale sym´etrique. Il se se restreindre `a des oscillations de petite amplitude, et trouve que beaucoup de probl`emes peuvent ˆetre ramen´es au calcul des valeurs propres d’une matrice tridiagonale avec l’approximation habituelle, on obtient : sym´etrique qui est justement le cas le plus simple. C g La plupart des programmes de biblioth`eque utilise la ¨ θ1 = − ℓ θ1 − m ℓ (θ1 − θ2 ) m´ethode QL qui consiste `a faire une s´erie de transforma1 1 1 tions orthogonales : C g θ¨2 = − θ2 − (θ2 − θ1 ) ℓ2 m2 ℓ 2 15 C’est d’ailleurs un exercice conseill´ e : le d´ eterminant donne une un syst`eme pour lequel on cherche des solutions stationnaires p´eriodiques du type : θ1 = a1 eiωt ,
θ2 = a2 eiωt
´ equation bicarr´ ee en ω, on trouve donc deux solutions positives et donc deux fr´ equences propres ; a ` chaque fr´ equence propre correspond un couple (a1 , a2 ) d’amplitudes pour les deux pendules, c’est-` a-dire un mode propre. Le mouvement des pendules est une combinaison lin´ eaire de ces deux modes.
60
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
l’´equation stationnaire et l’on tentera une r´esolution en d´eveloppant la fonction d’onde ψ sur une base de fonctions connues : c’est, a priori, une approximation car rien o` u Ls est une matrice triangulaire inf´erieure et Qs une ne dit que la « vraie » solution puisse ˆetre correctement matrice orthogonale, c’est-` a-dire que : d´evelopp´ee sur la base choisie, surtout si celle-ci est r´eduite −1 t `a un nombre fini, voire un petit nombre, de fonctions. Qs = Qs La consultation d’un cours de physique quantique montre que l’on peut poser le probl`eme de la fa¸con suiUne s´erie de th´eor`emes, que nous n’´etudierons pas ici, vante : montrent que l’on peut d´ecomposer Ls de la fa¸con suiR ∗ ψ (X)H(X)ψ(X)dX vante R (4.11) E = t ψ ∗ (X)ψ(X)dX Ls = Qs · As As+1 = Ls · Qs
u H est le Hamiltonien (connu) du syst`eme consid´er´e, ´ecrire Qs comme un produit de rotations planes et que la o` X d´esigne l’ensemble des variables du probl`eme, ψ(X) s´equence la fonction d’onde que l’on cherche et E l’´energie (que As+1 = Qts · As · Qs l’on cherche ´egalement). Pour simplifier les notations, il fera apparaˆıtre les valeurs propres sur la diagonale. est d’usage d’´ecrire la mˆeme ´equation comme suit : Pour l’utilisateur, il suffit de fournir deux tableaux unidimensionnels contenant la diagonale et la sous-diagonale < ψ|H|ψ > E= de la matrice initiale A ou A0 . Au retour, on obtient les va< ψ|ψ > leurs propres `a la place de la diagonale en g´en´eral class´ees par ordre de valeur d´ecroissante. Si l’on veut aussi les vec- L’´energie E d´epend ´evidemment de la fonction d’onde et teurs propres, il faut ´egalement fournir un tableau n × n l’on montre que si l’on modifie l´eg`erement ψ, E doit ˆetre et. . . bien lire la documentation pour d´eterminer si un vec- minimum par rapport `a ce changement, si toutefois E et teur propre donn´e occupe une ligne ou une colonne de la ψ sont solutions du probl`eme. On d´eveloppe alors la fonction d’onde sur une base de dite matrice ! En g´en´eral, les vecteurs propres obtenus sont fonctions connues χℓ : normalis´es `a 1, soit, pour un vecteur propre ai donn´e : X X a2i,ℓ = 1 ψ= c ℓ χℓ ℓ
o` u ai,ℓ est la ℓ-i`eme composante du vecteur propre ai .
ℓ
en esp´erant que la base choisie « marchera ». Le principe variationnel ci-dessus dit que le meilleur jeu de coefficients cℓ est celui pour lequel E est minimum, donc pour un δck 4.5.4.3 Rendre une matrice tridiagonale. quelconque, le δE doit ˆetre nul au premier ordre. Avec ces Quand la matrice n’a pas la forme requise, il faut la notations, l’´equation (4.11) s’´ecrit : transformer d’abord, par exemple, lorsque les pendules X coupl´es de notre exemple « voient » leurs seconds voisins, c∗ℓ cm Hℓm ou bien lorsque l’objet ´etudi´e est une mol´ecule en vibra(4.12) E = ℓmX tion dont les atomes sont coupl´es les uns aux autres en c∗ℓ cℓ trois dimensions. ℓ La m´ethode tourne toujours autour du mˆeme genre d’op´erations : on fait une s´equence du type : o` u Hℓm =< χℓ |H|χm > As+1 = Rts · As · Rs `a condition toutefois que la base de fonctions soit orthoo` u Rs est une rotation plane judicieusement choisie et l` a norm´ee, soit : encore une batterie de th´eor`emes appropri´es montre que < χℓ |χm >= δℓm l’on doit converger vers une matrice tridiagonale. Si l’on impose une variation δck au coefficient ck dans l’´equation (4.12), on obtient alors : 4.5.4.4 Probl` emes aux valeurs propres g´ en´ eralis´ es. δE = ! X X X Ce sont des probl`emes du type : δc∗k cm Hkm + c∗ℓ δck Hℓk c∗ℓ cℓ m ℓ ℓ X A · x = λB · x (4.10) − c∗ℓ cm Hℓm (δc∗k ck + c∗k δck ) ℓm o` u l’on cherche les valeurs propres λ et les vecteurs propres x, A et B ´etant des matrices connues : voyons un exemple. or δE doit ˆetre nul ∀k, ∀δck , ce qui donne, apr`es avoir r´e-inject´e l’´equation (4.11) dans l’expression ci-dessus : 4.5.4.4.1 L’´ equation de Schr¨ odinger. La r´esoluX tion num´erique de l’´equation de Schr¨odinger est un cm Hkm = E ck ∀k probl`eme particuli`erement difficile et, outre qu’un tome m entier ne suffirait pas ` a le traiter compl`etement (voir, par exemple, la r´ef´erence [12]), c’est un domaine o` u autrement dit la recherche est active ! Ici, nous nous contenterons de H·c =Ec
61
Physique num´erique, Philippe Depondt
avec des notations sans surprise. On reconnait l` a une ´equation aux valeurs propres : la r´esoudre donne `a la fois les ´energies propres et les coefficients correspondants du d´eveloppement de la fonction d’onde. Pour des raisons diverses, il peut arriver cependant que la base de fonctions utilis´ee ne soit pas orthonorm´ee : par exemple, si l’on cherche des fonctions d’onde ´electroniques dans le champ d’un ensemble de noyaux, on peut vouloir utiliser des fonctions d’onde localis´ees sur les noyaux atomiques avec un certain recouvrement. Les produits scalaires : < χℓ |χm >= sℓm
4.6
Probl` emes autocoh´ erents.
ou self-consistent problems en anglais.
4.6.1
Qu’est-ce donc ?
Imaginons, par exemple, un di´electrique constitu´e d’un ensemble d’atomes polarisables qui, lorsqu’ils sont soumis `a un champ ´electrique, voient leur nuage ´electronique d´eform´e. Ils portent alors un moment dipolaire dont on supposera ici selon l’approximation d’usage qu’il est proportionnel au champ :
~ ri ) deviennent alors les ´el´ements d’une matrice S qui n’est p~i = α E(~ plus la matrice unit´e. Le probl`eme se reformule l´eg`erement u p~i est le moment dipolaire port´e par l’atome i et ~ri est pour donner apr`es le mˆeme genre de calcul, le r´esultat o` la position de celui-ci. suivant : ~ ext Chaque atome est donc soumis au champ ext´erieur E H·c =ES·c que l’on applique et au champ dˆ u `a tous les autres dipˆoles : un probl`eme aux valeurs propres g´en´eralis´e similaire a` X (4.10). ~ ri ) = E ~ ext + ~ dipj (~ri ) E(~ E j, j6=i
4.5.4.4.2 R´ esolution. La m´ethode est en g´en´eral tr`es ~ dipj (~ri ) est le champ produit en ~ri par le dipˆole port´e simple : il suffit de remplacer (4.10) par : o` uE par l’atome j. Donc : B−1 · A · x = λ x X −1 La matrice B · A n’est g´en´eralement pas sym´etrique ~ ext + ~ dipj (~ri ) ~pi = α E E (4.13) mˆeme si A et B le sont. Les sous-programmes de bij, j6=i blioth`eque font alors une d´ecomposition de B en ainsi, pour calculer les valeurs des moments dipolaires p~i , B = L · Lt il faut connaˆıtre les champs dipolaires mais pour obtenir les champs dipolaires, il faut connaˆıtre les moments dipoet le probl`eme se re-´ecrit : laires : on tourne en rond. ~ dipj (~ri ) par son On peut, certes, tenter de remplacer E t t C· L ·x =λ L ·x expression en fonction de ~pj et r´esoudre, par exemple, par la m´ethode de Newton le syst`eme d’´equations : avec : −1 −1 t C= L ·A· L ~pi − f~i ({~ pj , j ∈ [1, n]}) = 0 i ∈ [1, n] La matrice C a les mˆemes valeurs propres que le probl`eme initial et ses vecteurs propres sont Lt · x. En principe, cela suppose cependant de calculer toutes les d´eriv´ees toutes ces transformations sont transparentes pour l’utili∂ f~i sateur. ∂~pj 4.5.4.5
Conclusion
une entreprise parfois un peu laborieuse, surtout si n est grand. [0] On peut toutefois partir d’une solution d’essai ~pi , calculer les champs dipolaires correspondants, puis, `a l’aide [1] de l’´equation (4.13), de nouvelles valeurs ~pi , puis de nou[2] veaux champs et p~i et ainsi de suite. La solution sera obtenue quand on aura atteint un « point fixe » tel que :
Tous ces algorithmes sont efficaces et rapides : il ne faut surtout pas se priver de les utiliser quand le probl`eme s’y prˆete, mˆeme si l’on ne maˆıtrise pas absolument leur fonctionnement, car ils sont dans l’ensemble assez robustes16 . En revanche, les biblioth`eques de programmes sont souvent extrˆemement riches et l’on a parfois du mal a d´eterminer quel est le sous-programme qui r´epondra le ` [k] [k+1] mieux `a la question pos´ee : il faut prendre le temps de ≃ p~i ~pi r´efl´echir, de lire la documentation disponible, h´elas pas toujours limpide, voire se poser la question si une refor- avec une pr´ecision suffisante. mulation du probl`eme de fa¸con l´eg`erement diff´erente ne permettrait pas, par exemple, de sym´etriser la matrice 4.6.2 Formulation g´ en´ erale. ´etudi´ee ou si une ´ecriture avec des termes complexes ne pourrait pas simplifier consid´erablement la vie de celui qui On cherche donc la solution du syst`eme d’´equations : ´ecrit le programme ! xi = fi (x1 , x2 , . . . , xn ), i ∈ [1, n] 16 ce qui ne dispense pas bien sˆ ur de v´ erifier sur des probl` emes dont la solution est connue que les programmes marchent convenablement, et, comme d’habitude, ne pas oublier d’user de l’esprit critique du physicien. . .
ou x = f (x)
62
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
o` u les lettres en caract`eres gras repr´esentent des vecteurs de notre fonction tend vers 1 lorsque x tend vers z´ero : de n ´el´ements. On part d’une solution d’essai x[0] et l’on on est `a la limite de la condition de convergence |a| < 1, construit la s´equence : ainsi, dans ce cas, plus on s’approche de la solution, plus la convergence devient difficile. On en concluera n´eanmoins x[k+1] = f (x[k] ) que le crit`ere ci-dessus, a priori valable pour une fonction lin´eaire, l’est ´egalement pour une fonction non-lin´eaire `a Le point fixe sera consid´er´e comme atteint quand les condition d’en connaˆıtre la d´eriv´ee au point fixe, ou du x[k] n’´evolueront plus de fa¸con significative a` chaque moins d’ˆetre capable d’estimer si elle est, en valeur absog´en´eration. lue, inf´erieure `a 117 . Ce genre de raisonnement est g´en´eralisable `a des 4.6.3 Est-ce que ¸ca converge ? syst`emes lin´eaires du type : Rien n’est moins sˆ ur ! Prenons un cas tr`es simple pour x = Ax + b lequel n = 1 et : f (x) = ax On obtient ´evidemment que : La solution est ´evidemment x = 0. Si l’on veut r´esoudre x[k] = Ak x[0] + I + A + A2 + . . . + Ak−1 b [0] ce probl`eme par la m´ethode ci-dessus, on part d’un x choisi arbitrairement et Pour que cela converge, on montre18 qu’il suffit que : x[1] = a x[0] ,
x[2] = a x[1] = a2 x[0]
||A|| < 1
et bien sˆ ur :
o` u ||A|| est l’une des normes de A :
x[k] = ak x[0] Si |a| < 1, la convergence est acquise, mais sinon c¸a diverge ! ´ Etudions maintenant le cas :
||A||m = max i
ou bien
f (x) = tanh x
l` a encore la solution x = 0 est connue. Le programme pour r´esoudre cel` a est d’une grande simplicit´e : ou encore program autoco implicit none real :: x=1. ! point de depart de la recherche integer :: k, kmax=100000 open(1,file=’autoco.res’) write(1,*) 0, x do k = 1, kmax x = tanh(x) if( mod(k, 10) == 0 ) write(1,*) k, x enddo close(1) end 1
x
0.1
0.01
0.001
10
100
1000 k
10000
100000
Fig. 4.16 – Convergence plus que m´ediocre de la recherche autocoh´erente de la solution de l’´equation x = tanh x (les ´echelles sont logarithmiques). Le r´esultat est malheureusement assez d´ecevant (figure 4.16) : apr`es 105 pas, on en est encore ` a quelques milli`emes de la solution ! On ´etait habitu´e ` a mieux. . . Si l’on essaie d’appliquer le crit`ere ci-dessus, on s’aper¸coit que la d´eriv´ee
||A||l = max j
n X j=1
n X i=1
|aij |
|aij |
v uX n u n X |aij |2 ||A||k = t i=1 j=1
En particulier, si l’on a : aij <
1 , n
∀ i, j ∈ [1, n]
la suite converge. Pour un syst`eme non-lin´eaire, la matrice A devient la matrice jacobienne J `a proximit´e du point fixe : cela suppose que l’on soit capable d’´evaluer cette matrice au point fixe qui est justement ce que l’on cherche ! Afin de temp´erer cette note apparemment pessimiste, l’on mentionnera -et le lecteur est chaleureusement invit´e `a le v´erifier- que le probl`eme du di´electrique converge de fa¸con tr`es satisfaisante en moins de 10 pas de calcul `a la suite d’un effort de programmation modeste. Ces m´ethodes peuvent ainsi se r´ev´eler extrˆemement pr´ecieuses dans bien des cas, mˆeme si l’´evaluation a priori de leurs chances de succ`es rel`eve parfois plus de l’astrologie que de la science. . .
4.7
Recherche des minima d’une fonction.
Il arrive bien souvent que l’on ait besoin, par exemple, du minimum de l’´energie potentielle d’un syst`eme qui 17 C’est un probl` eme similaire a ` celui que l’on avait recontr´ e a ` propos de l’´ equation logistique (§ 3.2.2, la recherche des points fixes est en fait une recherche de z´ eros) o` u l’on avait vu qu’un syst` eme nonlin´ eaire pouvait ˆ etre susceptible d’un comportement chaotique. . . 18 Voir par exemple la r´ ef´ erence [2], p. 322.
63
Physique num´erique, Philippe Depondt
d´epend d’une ou plusieurs variables pour en obtenir l’´equilibre stable : mettons, un ensemble d’atomes qui composent une mol´ecule dont on veut la conformation `a l’´equilibre compte tenu des potentiels d’interaction atomeatome. Un autre exemple, qui sera ´etudi´e plus en d´etail dans le chapitre 4.8, est celui de la recherche du minimum d’´ecart possible entre des donn´ees exp´erimentales et les pr´evisions d’un mod`ele th´eorique qui d´epend lui-mˆeme d’un certain nombre de param`etres : il faut donc chercher les valeurs de ces param`etres qui donne l’´ecart le plus faible possible. On pourrait aussi, dans un autre ordre d’id´ees, chercher le chemin optique le plus court pour un rayon lumineux, encore que la r´esolution d’une ´equation diff´erentielle ordinaire selon les m´ethodes du chapitre 4.9 paraisse plus facile dans un bon nombre de cas.
f (x) une fonction d’un ensemble de n variables d´esign´ees par x = (x1 , . . . , xn ). Un extremum est donn´e par : di (x) =
∂f =0 ∂xi
∀i
cela donne un syst`eme de n ´equations dont on cherche les z´eros, or la variation δdi (x) de di pour des variations δxi s’´ecrit : δdi (x) =
X ∂di X ∂2f δxj = δxj ∂xj ∂xi ∂xj j j
(4.14)
La matrice H telle que Hij =
∂2f ∂xi ∂xj
s’appelle la matrice Hessienne. C’est cette matrice qui
4.7.1
Du mouvement des amibes (m´ e- intervient dans le syst`eme lin´eaire (4.14) que l’on doit r´esoudre en δxi en suivant la m´ethode de Newton d´ej` a thode du simplex).
4.7.1.1
` une dimension A
On cherche donc le minimum d’une fonction f (x). On pourrait imaginer quelques chose qui s’apparente `a la m´ethode de la dichotomie : on choisit un intervalle, on prend le milieu, on regarde s’il est plus bas que les bords, etc. En fait, il suffit, dans un espace unidimensionnel, de prendre deux points : a et b. Mettons que f (a) < f (b), alors on cherchera un point c sym´etrique de b par rapport a a : on va dans le sens o` ` u c¸a d´ecroˆıt et cela s’appelle une r´eflexion. Si f (c) < f (a) c’est sans doute qu’on pouvait aller plus loin : on double alors le d´eplacement dans le mˆeme sens (dilatation) ; sinon, c’est qu’on est all´e trop loin, alors on divise le d´eplacement par deux (contraction). Puis on recommence l’op´eration jusqu’` a ce que l’intervalle entre les deux derniers points soit plus petit que la pr´ecision voulue. 4.7.1.2
` N dimensions. A
Le principe est le mˆeme : si l’on est dans un espace `a N dimension, on part de N + 1 points de l’espace : la figure obtenue s’appelle un simplex, par exemple, si N = 2, c’est un triangle. On remplace alors le point du simplex qui donne la valeur la plus ´elev´ee de la fonction par un autre obtenu en faisant une r´eflexion par rapport au centre de gravit´e du simplex, puis des dilatations ou des contractions a la demande. Ainsi, le simplex se d´eplace en se d´eformant, ` telle une amibe, en cherchant toujours ` a se concentrer sur point le plus bas. Quand il devient assez petit, le probl`eme est r´esolu. La m´ethode du simplex a le m´erite de ne n´ecessiter aucun calcul de d´eriv´ee et d’ˆetre simple ` a mettre en œuvre. Autant dire, cependant, qu’elle est assez inefficace : elle est a r´eserver aux probl`emes pas trop lourds num´eriquement ` pour lesquels on n’a pas de raison de faire d’effort particulier.
4.7.2
M´ ethode de Newton
vue : H · δx = −d avec des notations ´evidentes. Le vecteur d donne les variations qu’il faudrait imposer aux variables x (ou xi ∀i) pour annuler l’´ecart dans l’approximation lin´eaire. Comme la fonction f (x) n’est pas a priori lin´eaire, il faut recommencer l’op´eration jusqu’` a convergence. C’est souvent efficace et c’est extrˆemement simple `a mettre en œuvre (` a condition de pouvoir calculer les d´eriv´ees secondes qui composent la matrice hessienne), mais il faut ˆetre conscient qu’on ne se donne, alors, pas tous les moyens pour r´eussir. En effet, la m´ethode de Newton recherche les z´eros d’un ensemble de fonctions compl`etement ind´ependantes, alors que les d´eriv´ees d’une fonction ne le sont pas. En outre, la matrice Hessienne n’est pas toujours disponible ais´ement.
4.7.3
Recherche ` a une dimension : interpolation parabolique.
Admettons que l’on connaisse trois points x = a, b et c avec a < c < b d’une part, et f (c) < f (a) et f (c) < f (b) de l’autre. La deuxi`eme condition impose qu’il doit y avoir un minimum au moins dans l’intervalle [a, b]. On assimile alors localement la fonction `a une parabole passant par les trois points (figure 4.17) : f (x) ∼ p(x) = f (a) f (b)
(x − c)(x − b) + (a − c)(a − b)
(x − a)(x − c) (x − a)(x − b) + f (c) (b − a)(b − c) (c − a)(c − b)
dont on cherche le minimum :
p′ (x) = 0 soit : x=
1 f (a)(c2 − b2 ) + f (b)(a2 − c2 ) + f (c)(b2 − a2 ) 2 f (a)(c − b) + f (b)(a − c) + f (c)(b − a)
Il y a une m´ethode ´evidente : puisque l’on peut chercher les z´eros d’un ensemble de fonctions par la m´ethode puis on recommence avec une proc´edure similaire `a celle de de Newton, il suffit, lorsqu’on cherche les minima d’une la dichotomie : si x ∈]a, c[ on prend les points a, x et c, sifonction, de chercher les z´eros de ses d´eriv´ees. Soit donc non, on prend c, x et b et l’on calcule par la mˆeme m´ethode
64
Licence de physique L3 : Physique Fondamentale & PHYTEM,
f(b) f (x) ∼
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
X ∂f ∂2f 1X xj + xi + f0 xi 2 i,j ∂xi ∂xj ∂xi i
(4.16)
o` u l’on peut introduire la matrice Hessienne H et le gradient g de f tel que
f(a) f(c)
gi =
∂f ∂xi
L’´equation (4.16) se re´ecrit en notations matricielles : f (x) ∼
1 x · H · x + g · x + f0 2
(4.17)
et f ′ (x) ∼ H · x + g = r
a
c
x
b
Fig. 4.17 – Recherche de minimum parabolique ` a une dimension.
o` u r est le r´esidu qui devrait ˆetre nul si l’on ´etait au point x solution. C’est aussi le vecteur qui indique la direction de plus grande pente, direction de recherche. Mettons que l’on d´emarre la recherche d’un point x0 avec une direction de recherche r0 , l’on ´ecrira donc :
x1 = x0 + α0 r0 une nouvelle estimation x′ et ainsi de suite jusqu’` a obtenir il faut chercher α0 tel que f soit minimum sur la direction la pr´ecision voulue. Il reste cependant la question de savoir r0 , or en d´eveloppant (4.17) et en ´ecrivant la d´eriv´ee par si le minimum de la parabole est bien un minimum et non rapport `a α0 , on doit chercher α0 tel que : un maximum ! On peut v´erifier si par exemple, f (x) est α0 r0 · H · r0 + x0 · H · r0 + g · r0 = 0 bien inf´erieur `a f (c) ; s’il ne l’est pas on peut prendre par exemple le point milieu de c et de x. o` u l’on a tenu compte du fait que H est une matrice sym´etrique19 , ce qui donne une expression de α0 : 4.7.4 M´ ethode du gradient conjugu´ e. r0 · r0 α0 = − r Soit de nouveau une fonction f (x) o` u x est un vecteur 0 · H · r0 dans un espace de dimension quelconque n. On cherche le Si l’on r´ep`ete la mˆeme s´equence, la nouvelle direction de minimum de cette fonction. recherche r1 doit ˆetre orthogonale `a r0 parce que justement Une premi`ere id´ee qui pourrait venir ` a l’esprit serait de nous sommes d´ej` a sur un minimum de la fonction dans la suivre la ligne de plus grande pente (steepest descent ) : on direction r0 , donc : suit une droite parall`ele au gradient local de la fonction : r1 · r0 = 0 ~ grad(f ) (4.15) ce que l’on v´erifie facilement par le calcul. δx = −α ~ kgrad(f )k ` deux dimensions, l’on obtient donc les zizags de la A figure 4.18 et avec un plus grand nombre de dimensions, o` u α est un scalaire obtenu par exemple par la m´ethode c ¸ a doit ˆetre, a priori, pire. . . On remarque cependant que du paragraphe 4.7.3. si les courbes de niveaux de la figure 4.18 avaient ´et´e des cercles, la convergence aurait ´et´e obtenue en un pas, `a condition de choisir une direction de recherche parall`ele au gradient ! Il serait donc habile de tenter de faire entrer en ligne de compte la g´eom´etrie des courbes de niveaux et d’introduire non pas le produit scalaire ordinaire x · y, qui est bien adapt´e `a une sym´etrie sph´erique, mais le H-produit scalaire adapt´e `a la g´eom´etrie de H : Fig. 4.18 – La « ligne de plus grande pente » dans une x·H·y vall´ee ´etroite. Il faut un grand nombre de pas pour atteindre le fond de la vall´ee. Sans entrer dans les d´emonstrations20 ni dans le d´etail de l’algorithme, il suffit alors de chercher une s´erie de direcIl se trouve que c’est souvent assez peu efficace mˆeme tions de recherches di qui soient H-orthogonales entre elles si cela peut donner de bons r´esultats dans certains cas : de telle fa¸con que : en effet, si l’on cherche un minimum au fond d’une vall´ee ´etroite et si l’on part d’un bord de la vall´ee, on va partir xi+1 = xi + αi di dans une s´erie de zigzags plutˆ ot inutiles (figure 4.18). ∂2 f ∂2 f 19 Parce que H i,j = ∂x ∂x = ∂x ∂x = Hj,i , donc on se convainc i j j i Pour trouver une meilleure solution, il faut ´etudier d’un ement que x0 · H · r0 = r0 · H · x0 . peu plus pr`es la m´ethode de la plus grande pente : il s’agit ais´ 20 Volontiers confuses dans la litt´ erature, en tous cas gu` ere pasen fait d’une approximation de f par une fonction quadra- sionnantes. . . mais ce n’est qu’une opinion qu’il n’est pas obligatoire de partager ! On se reportera ´ eventuellement a ` la r´ ef´ erence [7]. tique :
Physique num´erique, Philippe Depondt
65
en choisissant αi pour que la recherche donne un minimum or les dxi ne sont pas ind´ependants `a cause de l’´equation sur la direction di , et (4.18) ; mais cette ´equation dit que g est une constante et que donc sa diff´erentielle doit ˆetre nulle : di · H · dj = 0, ∀i 6= j n X ∂g dxi = 0 Il se trouve que contrairement aux apparences, on peut ∂x i i=1 tr`es bien se passer de la connaissance (et de l’espace m´emoire correspondant) de la matrice Hessienne en uti- ce qui introduit un lien entre les dx . Il suffit d’additioni lisant le fait que les r´esidus ri doivent ˆetre justement les ner ces deux relations en multipliant la deuxi`eme par un gradients de f ! « multiplicateur de Lagrange » λ : Moralit´e : une fois encore, ne pas chercher ` a r´einventer n ce qui existe d´ej` a, utiliser des sous-programmes de biX ∂f ∂g dxi = 0 (4.19) +λ blioth`eque ! Ce qu’il faut retenir de ces m´ethodes, c’est ∂xi ∂xi i=1 qu’elles sont proches de la m´ethode de Newton d´ej` a ´etudi´ee pour la recherche de z´eros et qu’elles ont les mˆemes Choisissons alors, par exemple, λ pour que : d´efauts. Ainsi, il s’agit toujours d’une recherche locale d’un minimum d’une fonction assimil´ee ` a une fonction quadra∂g ∂f +λ =0 tique qui ne poss`ede qu’un seul minimum. La « vraie » ∂xn ∂xn fonction n’est en g´en´eral pas quadratique et si elle poss`ede plusieurs minima, on en trouvera au mieux un, sans savoir alors les n − 1 variables x1 , . . . , xn−1 sont ind´ependantes. s’il n’y en a pas un nettement plus profond juste `a cˆ ot´e ! La relation (4.19) est donc vraie pour tout jeu de variables La m´efiance et la circonspection sont les deux mamelles x1 , . . . , xn−1 , en particulier, si du calcul num´erique. . . dxi = 0, ∀i 6= k On verra toutefois, dans le chapitre 4.11, des fa¸cons d’´eviter ces d´efauts lorsque le paysage du potentiel est ce qui donne puisque dxk 6= 0 : compliqu´e et que le nombre de param`etres est ´elev´e. ∂f ∂g +λ =0 ∂xk ∂xk 4.7.5 Minimisation avec contrainte : les
multiplicateurs de Lagrange.
une relation vraie pour tout k, puisqu’il a ´et´e choisi arbiImaginons que l’on doive chercher comme auparavent trairement. C’est aussi vrai pour k = n puisqu’on a choisi λ ainsi : on retrouve ainsi la sym´etrie un instant perdue. . . un minimum d’une fonction de n variables : Le r´esultat de tout ceci est que si l’on d´efinit la fonction : min(f (x)) Q = f (x) + λg(x) mais que les variables repr´esent´ees par x ne soient pas le probl`eme revient `a chercher le minimum de Q avec ind´ependantes mais reli´ees par une relation : la contrainte (4.18), mais ce qui est nouveau par rapg(x) = 0 (4.18) port au probl`eme pr´ec´edent, c’est que les n variables sont ind´ependantes et que l’on peut utiliser les m´ethodes clasc’est ce que l’on appelle une contrainte. Imaginons par siques. exemple que l’on cherche la configuration d’´equilibre d’un Prenons, par exemple, un syst`eme de pendules coupl´es ensemble d’atomes mais que deux atomes donn´es soient dont l’´energie potentielle s’´ecrit : li´es par une liaison tr`es rigide, covalente par exemple, et X 1 X 2 que la distance entre ces deux atomes soit connue. On a Cij (θi − θj ) mi gℓi cos θi + V =− 2 ainsi un syst`eme de n − 1 variables ind´ependantes et l’on i,j>i i pourrait re´ecrire l’´equation (4.18) : avec des notations standards. Admettons que l’on cherche xn = g˜(x1 , . . . , xn−1 ) l’´equilibre d’un tel syst`eme (en dehors ´evidemment de la solution triviale : certains angles peuvent ˆetre sup´erieurs et l’on rechercherait le minimum d’une fonction `a n − 1 `a π) avec la contrainte que la somme des angles soit nulle variables : (mettons qu’un syst`eme d’engrenages plus ou moins complexe impose cela) : min(f (x1 , . . . , xn−1 , g˜(x1 , . . . , xn−1 ))) X θi = 0 Outre le fait que la recherche de la fonction g˜ n’est pas i toujours facile, cette m´ethode est discutable en ce sens que l’on a choisi d’´eliminer la variable xn , mais pourquoi pas L’on ´ecrira donc : plutˆ ot xn−1 ou xi ? Dans certains cas le choix est ´evident, X dans d’autres non. θi Q=V +λ i Si l’on est `a un extremum de f , alors pour tout ensemble de variations infinit´esimales des xi on doit avoir : et en exprimant les d´eriv´ees : n X ∂f ∂Q dxi = 0 =0 ∂x i ∂xk i=1
66
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
on obtient :
Ainsi, cette th´eorie, si elle est juste, donne potentiellement ´egalement une information de type microscopique sur λ = −mk gℓk sin θk − Ckk′ (θk − θk′ ), ∀k l’´echantillon ´etudi´e : on aimerait bien savoir ´evidemment ′ k 6=k quelle est la valeur de ∆E qui est la plus en accord avec les r´esultats exp´erimentaux : ∆E (ainsi que P0 ) est donc un soit en sommant : param` etre ajustable de la th´eorie parce qu’on n’en connait pas la valeur a priori et l’on tentera donc d’ajuster ∆E aux X 1 X donn´ees exp´erimentales. λ=− mk gℓk sin θk − Ckk′ (θk − θk′ ) n Ainsi, il est important de comprendre que l’on est en k k′ 6=k train de poser, non pas une, mais deux questions disque l’on peut r´einjecter dans l’expression de Q pour faire tinctes : ensuite une minimisation par l’une des m´ethodes habi1. est-ce la th´eorie marche ? tuelles. 2. quelles sont les valeurs (et les incertitudes) des paTout ceci se g´en´eralise ´evidemment ` a un nombre quelram`etres ajustables ? conque de contraintes gℓ = 0, il suffit d’introduire autant de multiplicateurs de Lagrange que de contraintes : Il se trouve que les logiciels courants r´epondent pratiquement toujours `a la seconde question, mais pas `a la X Q=f+ λℓ gℓ premi`ere : cela vaut donc la peine de regarder d’un peu ℓ plus pr`es comment c¸a marche ! X
4.8
Mod´ elisation de exp´ erimentales.
donn´ ees
4.8.1.2
L’hypoth` ese de d´ epart.
En pratique, l’on rel`eve, pour n points de mesures {xi , i = 1, n}, les n valeurs {yi , i = 1, n} corresponLorsqu’on fait des exp´eriences, il est bien rare que dantes. Mettons que l’on ait une th´eorie qui donne y en l’on n’utilise pas un logiciel d’acquisition et de traite- fonction de x et d’un certain nombre de param`etres ajusment des donn´ees exp´erimentales. Ces logiciels proposent tables p1 , . . . , pm : g´en´eralement des options intitul´ees par exemple smoothing 21 ou curve fitting 22 ou least square fit 23 . L’objectif de y = f (x, p1 , . . . , pm ) = f (x, {pj }) ce chapitre est d’expliquer ce que font au juste ces options, comment c¸a marche, et quelles sont leurs limites. En effet, Ce qui nous int´eresse, ce sont les ´ecarts entre les yi mesur´es il ne s’agit pas de magie, contrairement parfois ` a ce qu’il et les f (xi , {pj }) calcul´es `a l’aide de la th´eorie. On d´efinit paraˆıt, mais de bons vieux algorithmes bien p´edestres, fa- ainsi : n X ciles `a comprendre et dont il vaut mieux connaˆıtre les hy(f (xi , {pj }) − yi )2 χ2 ({pj }) = poth`eses sous-jacentes et les petites manies, faute de quoi i=1 on a vite fait de faire dire ` a peu pr`es n’importe quoi aux On cherchera alors l’ensemble de param`etres {pj } qui r´esultats d’exp´erience ! rendra χ2 le plus petit possible : c’est pour cela que la m´ethode s’appelle « m´ethode de moindres carr´es », 4.8.1 Donn´ ees et moindres carr´ es. puisque χ2 est la somme des carr´es des ´ecarts entre th´eorie et mesures. 4.8.1.1 Quel est le probl` eme ? On aurait pu choisir autre chose que la somme des carr´es Lorsqu’on fait une exp´erience, on mesure une grandeur des ´ecarts, par exemple la somme des valeurs absolues ou y en fonction d’une autre grandeur x, par exemple la pres- le sup des carr´es. . . Le choix fait ici, ainsi que dans la sion en fonction de la temp´erature p(T ), l’intensit´e lumi- quasi-totalit´e des programmes, repose sur une hypoth`ese neuse en fonction de sa fr´equence ou de sa pulsation I(ω), qu’il faut expliciter. la position d’un objet en fonction du temps r(t). . . On peut Imaginons que l’on fasse un grand nombre de fois la aussi bˆ atir une th´eorie qui pr´edise la loi y = f (x) et l’on mesure de y pour une mˆeme valeur de x : on ne trouvera veut savoir si la th´eorie est juste : cette th´eorie repose sur pas la mˆeme valeur de y pour toutes les mesures mais des hypoth`eses physiques qui sont ainsi valid´ees ou non. une distribution parce que la mesure n’est pas parfaite, il C’est ce qu’on appelle la mod´elisation, on fait entrer une y a des incertitudes, il y a des vibrations dans le sol, le exp´erience dans le cadre d’un mod`ele. d´etecteur utilis´e produit du bruit, l’´electronique produit En g´en´eral, la loi issue de la th´eorie d´epend aussi de ´egalement du bruit. . . param`etres dits « ajustables ». Par exemple, on peut imaL’hypoth`ese qui m`ene `a l’expression de χ2 ci-dessus est giner que si l’on mesure une pression de vapeur saturante, que cette distribution est gaussienne, centr´ee autour de y0 la pression puisse s’´ecrire en fonction de la temp´erature de avec un ´ecart-type σ : la fa¸con suivante : p(y) = e−
∆E
P (T ) = P0 e− kT
(y−y0 )2 2σ2
`a un coefficient de normalisation pr`es24 . Il se trouve que une loi d’Arrhenius o` u ∆E est l’´energie qu’il faut fourpour un tr`es grand nombre d’exp´eriences, le th´eor`eme de la nir pour arracher un atome ` a la surface de l’´echantillon. limite centrale (valable pour les grands nombres) impose 21 Lissage. que cette condition soit v´erifi´ee. Toutefois, il faut faire 22 Ajustement 23 Ajustement
de courbe. de moindre carr´ e.
24 σ
√1 . 2π
67
Physique num´erique, Philippe Depondt
attention que des d´etecteurs tr`es sensibles peuvent ˆetre On peut alors introduire le « facteur de confiance capables de r´epondre ` a un nombre de « coups » tr`es faible pond´er´e » ou weighed reliability factor : pour lequel ce genre de th´eor`eme n’est plus valable. Les v u m´ethodes d´ecrites ici ne sont alors plus en toute rigueur χ2 u R = u n w directement utilisables. u X (f (xi , {pj }))2 t σi2 i=1
4.8.2
Ajustement d’une fonction lin´ eaire.
c’est un ´ecart quadratique ramen´e `a la moyenne des carr´es de la fonction. Il s’exprime en g´en´eral en % : si Rw vaut par Prenons pour commencer le cas le plus simple : y = exemple 10%, cela signifie en gros que la fonction th´eorique ax + b o` u les deux param`etres ajustables sont a et b. On est ´eloign´ee de 10% des valeurs exp´erimentales, en unit´es cherche donc a et b tels que de σ. Ce que l’on aimerait avoir, c’est l’incertitude sur a et b n X 2 puisque ce sont les r´esultats de tous ces calculs. Posons : (axi + b − yi ) χ2 = 4.8.2.1
Sans les incertitudes.
i=1
ei = f (xi , {pj }) − yi soit minimum. Il faut donc que les d´eriv´ees de χ2 par rapport aux deux param`etres soient nulles : c’est l’´ecart entre th´eorie et exp´erience pour le point i. Si l’on estime que cet ´ecart est enti`erement dˆ u au param`etre n 2 X ∂χ n ˚ 1, on obtient 2xi (axi + b − yi ) = 0 ∂a = i=1 ∂f (xi , {pj }) ∂ei n X ∂χ2 δp1 = δp1 ei = 2 (ax + b − y ) = 0 = ∂p ∂p1 i i 1 ∂b i=1
Quelques lignes de calculs sans difficult´e donnent : n n n X X X yi x x y − n i i i i=1 i=1 i=1 a = !2 n n X X 2 xi xi − n b
=
i=1 i=1 n n n n X X X X 2 xi xi yi yi − xi i=1 i=1 i=1 i=1 !2 n n X X 2 xi xi − n i=1 i=1
une majoration de l’incertitude δp1 sur le premier param`etre, or 2
χ =
n X i=1
e2i
=
n X ∂f (xi , {pj } i=1
∂p1
)δp1
2
et en g´en´eralisant ceci a` tous les param`etres pj : v u χ2 u δpj = u n u X ∂f (xi , {pj }) t ∂pj i=1
Lire dans un fichier les n valeurs de x et de y et faire ce calcul pour obtenir l’´equation de la droite est extrˆemement simple (c’est d’ailleurs un petit exercice de programmation conseill´e25) : on comprend que les ´editeurs de logiciels ne se privent pas de l’inclure dans leurs productions.
C’est ce que l’on appelle « d´eviations standards estim´ees » (estimated standard deviations ou esd ) et ce sont des estimations de majorants aux incertitudes sur les param`etres. Dans le cas d’une fonction lin´eaire, ´evidemment, ces formules se simplifient ais´ement, mais elles s’appliquent26 aux autres cas aussi.
4.8.2.2
4.8.2.3
Avec les incertitudes.
Exercice pratique et divertissant.
´ -Etape n˚1 : remplir une coupelle en plastique ou un pot de yaourt ou de petit suisse vide avec un peu d’eau. ´ -Etape n˚2 : poser la coupelle ou le pot de yaourt sur un p`ese-lettres et l’ensemble (pr´ecautionneusement) sur un radiateur. ´ -Etape n˚3 : pendant une semaine ou plus, relever plusieurs fois par jour le temps ´ecoul´e depuis le d´ebut de l’exp´erience n X (f (xi , {pj }) − yi )2 2 et la masse indiqu´ee par le p`ese-lettre. Mettre ces donn´ees χ ({pj }) = 2 σ i exp´ e rimentales dans un fichier. i=1 ´ -Etape n˚4 : faire une hypoth`ese physique. Puisque la Dans le cas de la fonction lin´eaire cela s’´ecrit ´evidemment : temp´erature du radiateur peut ˆetre consid´er´ee en premi`ere n 2 X approximation comme constante, la vitesse d’´evaporation (axi + b − yi ) χ2 = 2 de l’eau peut ˆetre consid´er´ee comme constante et donc σi i=1 la masse d’eau restante s’exprimer comme une fonction Un calcul `a peine plus compliqu´e que pr´ec´edemment donne lin´eaire du temps : de la mˆeme fa¸con les expressions de a et de b. m(t) = m ˙ t + m0 Il y a une faiblesse criante dans ce que nous avons fait jusqu’` a pr´esent : on ne voit nulle part d’incertitude ! Admettons donc que chaque mesure (xi , yi ) soit affect´ee d’une incertitude σi . On doit alors red´efinir χ2 de fa¸con qu’une mesure « compte » d’autant plus que son incertitude est petite :
25 Il est prudent de travailler en double pr´ ecision a ` cause des d´ enominateurs.
26 On
n’ose parler de validit´ e!
68
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
o` u, donc, m ˙ et m0 sont des constantes. ´ -Etape n˚5 : d´eterminer m ˙ et m0 selon les m´ethodes ci-dessus, ainsi que les d´eviations standards. Tracer les courbes exp´erimentale et th´eorique sur un mˆeme graphe ainsi que les ´ecarts entre courbe th´eorique et exp´erimentale. ´ -Etape n˚6 : s’interroger sur les r´esultats obtenus. ´ -Etape n˚7 : changer la valeur affich´ee sur le thermostat et recommencer l’exp´erience. ´ -Etape n˚8 : tracer la courbe m(T ˙ ) pour 253 < T < 333K.
Ces nombres n’ont, bien sˆ ur, aucun sens. Moralit´e : ce n’est pas parce qu’un programme d’ajustement donne un r´esultat que le mod`ele est valid´e et que les param`etres qu’il donne sont bons. Il ne faut pas oublier d’ˆetre physicien : quand on ajuste un mod`ele, c’est qu’on pense qu’il est adapt´e, puis on doit discuter les valeurs obtenues pour les param`etres en les consid´erant comme des grandeurs physiques et en se posant par exemple la question des cons´equences qu’entraˆınent les valeurs obtenues. Si, par exemple, dans le cas de la loi d’Arrhenius, on trouve ∆E ∼ 106 joules 4.8.2.4 Une g´ en´ eralisation possible. (au lieu de quelques eV), on est en droit de se demander si l’on a bien mesur´e de la sorte l’´energie pour arracher Ces m´ethodes qui ont le grand m´erite d’ˆetre simples et un atome d’une surface comme on le pensait initialement. faciles `a programmer ne sont pas limit´ees strictement aux fonctions lin´eaires. Reprenons l’exemple de la loi d’Arrhe4.8.3 Ajustement d’un polynˆ ome. nius : ∆E P = P0 e− kT On peut g´en´eraliser facilement les ´equations du paraSi l’on fait les changements de variable : y = ln P
x=−
graphe 4.8.2.1 au cas d’un polynˆome de degr´e p :
1 kT
on obtient y = ∆E x + ln P0
P (x) = c0 + c1 x + c2 x2 + . . . + cp xp =
p X
cj xj
j=0
On cherche, bien sˆ ur, les p + 1 coefficients cj , et donc,
o` u ∆E et ln P0 tiennent le rˆ ole de a et b dans le probl`eme pr´ec´edent. Ainsi, si l’on peut exprimer le probl`eme de la fa¸con suivante : g(y) = a h(x) + b
∂ ∂χ2 = ∂cj ∂cj
n X i=1
p X
ck xki
k=0
− yi
σi2
!2
=0
o` u g et h sont des fonctions connues sans param`etre ajustable (ici, k est la constante de Boltzmann, connue), tout Il est ais´e de se rendre compte que si l’on pose : ce qui est ci-dessus est utilisable sans difficult´e. n X xj+k i 4.8.2.5 Un caveat. A = jk 2 σ i i=1 n X yi xj i Bj = 2 σ i i=1
le probl`eme se ram`ene `a la r´esolution d’un syst`eme lin´eaire (p + 1) × (p + 1) : A·C=B
avec des notations ´evidentes. De plus : v u χ2 u Rw = u n u X P (xi )2 t σ2 i=1 et :
δck = Fig. 4.19 – L’ajustement d’une fonction lin´eaire `a des donn´ees al´eatoires donne un r´esultat. Ici : 0.79875 − 0.24841 × x. Quel sens donner ` a ces nombres ? Aucun ! Malheureusement, tout ceci est un peu trop beau. En effet il suffit de consid´erer les ´equations de ce chapitre pour constater que ces m´ethodes donneront toujours un r´esultat, si absurde soit-il. La figure 4.19 montre l’ajustement d’une droite sur un nuage de points al´eatoires. On obtient des nombres.
s
χ2 Akk
Les g´en´eralisations du type : g(y) = P (h(x)) o` u g et h sont des fonctions connues sont ´evidemment possibles. ` condition de disposer d’un sous-programme de A r´esolution de syst`emes lin´eaires, tout ceci est tr`es simple `a programmer, c¸a marche tr`es bien et c’est rapide car il n’y a pas `a converger plus ou moins laborieusement vers une solution.
69
Physique num´erique, Philippe Depondt
Alors, s’agit-il du programme « r´esout tout probl`eme, marche `a tout coup » ? Poser la question est ´evidemment un d´ebut de r´eponse. Revenons au pot de yaourt du paragraphe 4.8.2.3. Il est probable que l’ajustement d’une fonction lin´eaire laissera des ´ecarts entre cette fonction et les donn´ees exp´erimentales : faut-il alors prendre un polynˆome de degr´e plus ´elev´e ? Il est clair que l’ajustement en sera meilleur : `a la limite, si l’on prend un degr´e ´egal au nombre de points moins un, p = n − 1, on obtiendra un polynˆome passant par tous les points exp´erimentaux ! Mais les coefficients ainsi introduits ont-ils un sens physique ? Non ! Il faut d’abord se poser des questions physiques. Par exemple, y a-t-il une raison pour laquelle le mod`ele choisi ne conviendrait pas ? Comme le thermostat a un cycle de 24 heures car on chauffe moins la nuit, ne pourrait-on pas plutˆ ot introduire cette p´eriodicit´e dans le probl`eme ? On Fig. 4.20 – Un cosinus bruit´e, sa d´eriv´ee calcul´ee avec q = 3 et avec q = 10. pourrait tenter quelque chose comme ¯˙ + µ sin 2π t m ˙ =m τ ´ Evidemment, c’est plus difficile parce qu’il ne s’agit plus d’un polynˆome et il faudra recourir aux m´ethodes du para¯˙ graphe 4.8.6, mais c’est peut-ˆetre plus r´ealiste, puisque m devient alors la vitesse moyenne d’´evaporation et µ l’amplitude des variations p´eriodiques. On peut mˆeme aller un peu plus loin en remarquant que m ˙ est sans doute proportionnel `a la pression laquelle ob´eit probablement `a une loi d’Arrhenius en fonction de la temp´erature. . .
4.8.4
D´ eriv´ ee locale exp´ erimentale.
d’une
courbe
Exercice : essayer de calculer m(t) ˙ `a partir des donn´ees de mesure. On constatera qu’il faut choisir un intervalle de mesure sensiblement plus court que la dur´ee des variations quotidiennes de la temp´erature : l’id´eal ´etant un enregistrement toutes les heures par exemple.
4.8.5
Lissage : a dirty trick !
Il arrive que les informations int´eressantes d’une exp´erience soient difficilement visibles sur la courbe exp´erimentale obtenue `a cause du bruit. La plupart des logiciels d’acquisition offrent des options de smoothing ou lissage visant `a r´eduire le bruit. Il s’agit d’ajuster localement un polynˆome comme pr´ec´edemment, par exemple un polynˆome d’ordre 2 :
On peut aussi prendre la question diff´eremment : l’inconnue « int´eressante » de l’exp´erience est la vitesse d’´evaporation m ˙ : c’est cela que l’on cherche ` a mesurer. Lij = c2i δx2 j 2 + c1i δxj + c0i On voudrait calculer la d´eriv´ee locale de la mesure et c’est a cette grandeur l` ` a que l’on tentera d’appliquer quelque mais seul la valeur en xi de l’ajustement local nous int´eresse : th´eorie. Li0 = c0i Il suffit d’ajuster localement une fonction lin´eaire : ` la car on remplacera les xi par les valeurs liss´ees Li0 . A f (x) = c1i x + c0i suite de calculs sans difficult´e, on obtient, toujours par les a condition de rester proche de xi . Le χ2 devient local mˆemes m´ethodes : ` autour du point xi : q X (J4 − J2 k 2 )(yi+k + yi−k ) J y + +q 4 i X 2 k=1 (c1i xk+i + c0i − yi+k ) χ2i = (4.20) Li0 = c0i = J0 J4 − J22 k=−q u o` u q d´etermine la largeur de l’intervalle autour de xi o` u ce o` calcul est fait. Le coefficient c1i est donc la d´eriv´ee locale recherch´ee : un calcul sans difficult´e donne : c1i
+q X 3 k yi+k = δx q(q + 1)(2q + 1)
Jℓ =
q X
jℓ
j=−q
soit :
q(q + 1)(2q + 1) , 3 ´ q(q + 1)(2q + 1)(3q 2 + 3q − 1) dans le cas o` u xi = x0 + iδx 27 . Evidemment, le r´esultat J4 = 15 que l’on trouve d´epend de q : si l’on choisit une valeur de q petite, le r´esultat risque d’ˆetre sensible au bruit, en (les Jℓ pour ℓ impair sont bien sˆ ur tous nuls) et revanche, si q est trop grand, on perdra les fluctuations q(q + 1)(2q + 1)2 (4q 2 + 4q − 3) rapides (voir la figure 4.20). Il faut choisir autant que posJ0 J4 − J22 = 45 sible qδx < ∆x l’ordre de grandeur des variations que l’on cherche `a d´etecter. C’est encore extrˆemement facile `a programmer et raP+q 2 q(q+1)(2q+1) 27 Il faut se rappeler au passage que k = . pide `a l’ex´ecution. Il faut cependant r´ealiser que 1˚ le 3 −q k=−q
J0 = 2q + 1,
J2 =
70
Licence de physique L3 : Physique Fondamentale & PHYTEM,
r´esultat d´epend de q et 2˚ il ne s’agit en fait que d’une moyenne pond´er´ee de points voisins. Il y a ici une hypoth`ese sous-jacente tr`es importante : c’est que les variations int´eressantes sont de longueur d’onde ou de dimension caract´eristique grande par rapport aux fluctuations dues au bruit et donc ` a l’intervalle balay´e dans l’´equation (4.20). C’est pour cela qu’il vaut g´en´eralement mieux, sauf pour des raisons « cosm´etiques » ne pas faire de lissage, et, au contraire, ajuster une fonction physiquement justifi´ee aux r´esultats non liss´es : si l’information int´eressante est l` a et si le mod`ele choisi est susceptible de la r´ev´eler, l’ajustement devrait la faire apparaˆıtre.
4.8.6
Ajustement non-lin´ eaire.
Ce qui rend l’ajustement de polynˆ omes si simple, c’est que la d´ependance d’un polynˆ ome par rapport aux param`etres, c’est-`a-dire aux coefficients, est lin´eaire : ax2 + bx + c est une fonction lin´eaire de a, b et c, mˆeme si ce n’est pas une fonction lin´eaire de x. En revanche, on peut vouloir chercher `a ajuster une fonction comme : L(x) = 1+
L0 x − x0 γ
2
C’est une lorentzienne comme sur la figure 4.21 o` u, comme le montre une analyse ´el´ementaire, L0 est la hauteur de la courbe, x0 la position de son maximum et γ sa demilargeur `a mi-hauteur. Il est facile de montrer que la lorentzienne est le module au carr´e de la transform´ee de t Fourier de eiωt− τ et donc la r´eponse spectrale des oscillations amorties, ce qui en fait une courbe tr`es r´epandue en spectroscopie, par exemple optique : la position du sommet de la courbe donne la fr´equence de l’oscillateur et sa largeur, l’amortissement. 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0
−5
0
5
10
Fig. 4.21 – Lorentzienne avec L0 = 1, γ = 0.5 et x0 = 2. Les param`etres que l’on veut ajuster sont L0 , x0 et γ, or L n’est lin´eaire ni en x0 ni en γ ; alors on lin´earise le probl`eme en sachant que le r´esultat ne sera pas correct mais en esp´erant qu’il sera moins mauvais que le point de d´epart et l’on r´ep`ete l’op´eration jusqu’` a ce qu’une solution acceptable soit trouv´ee. Il s’agit donc, une fois de plus, de rechercher un minimum de χ2 en fonction de ses param`etres, seulement, il n’y a plus de solution simple, il faut utiliser une m´ethode du type Newton ou gradient conjugu´e avec les pr´ecautions qu’imposent ces m´ethodes : ce n’est pas parce que cela fait partie d’un logiciel tout fait
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
que ces m´ethodes deviennent infaillibles, elles conservent les d´efauts d´ej` a vus. Si le point de d´epart de la recherche, les param`etres initiaux, est trop ´eloign´e d’une solution, le r´esultat obtenu risque d’ˆetre absurde, si le mod`ele comporte un trop grand nombre de param`etres ajustables (chaque param`etre ajoute une dimension `a l’espace de recherche) la signification du r´esultat final risque d’ˆetre assez discutable. . . Ainsi, lorsqu’on ajuste un mod`ele th´eorique `a une exp´erience, on est donc confront´e `a deux types de difficult´es : – la recherche du minimum de χ2 , il est parfois difficile de se convaincre que le minimum trouv´e est bien le minimum de la fonction – le fait que d’avoir trouv´e le minimum de χ2 ne valide en aucun cas le mod`ele utilis´e. Ces mises en garde ne doivent toutefois pas ˆetre vues comme devant dissuader d’utiliser ces outils : il faut les utiliser, ils sont d’une grande puissance ! Parfois, un ajustement difficile ou qui paraˆıt donner des r´esultats douteux est une indication qu’un autre mod`ele (pas forc´ement plus compliqu´e, d’ailleurs) serait peut-ˆetre meilleur. Il faut simplement se rappeler que l’ordinateur qui fait le calcul est un serviteur puissant mais. . . stupide ! Au physicien de faire son m´etier et de garder un regard critique. Il existe, au reste, de bonnes habitudes qui peuvent aider `a ´eviter des m´esaventures. La premi`ere est de tracer sur un mˆeme graphe la courbe th´eorique et les r´esultats exp´erimentaux pour voir si c¸a ressemble ! L’œil humain est un bon juge en la mati`ere. On peut pousser un peu plus loin en tra¸cant la courbe des ´ecarts entre fonction th´eorique et exp´erience : en principe, on ne devrait voir que du bruit, c’est-`a-dire un signal al´eatoire, sym´etrique par rapport `a l’axe des abscisses. Si des zones o` u les ´ecarts sont syst´ematiquement positifs ou n´egatifs apparaissent, c’est peut ˆetre le signe qu’il y a l` a `a chercher davantage. On peut aussi refaire l’ajustement `a partir de jeux de param`etres initiaux diff´erents : il vaudrait mieux que le r´esultat final n’en d´epende pas trop ! Si certains param`etres se retrouvent affect´es d’une d´eviation standard estim´ee tr`es ´elev´ee (par exemple d’un ordre de grandeur comparable au param`etre lui-mˆeme), on se demander s’il est vraiment utile de le garder : ne pourrait-on pas imaginer un mod`ele dont il est absent ? Si oui, est-ce que le r´esultat obtenu est tr`es diff´erent du pr´ec´edent ? Voici un exemple authentique : il s’agissait d’une exp´erience de diffusion Raman, c’est-`a-dire de diffusion in´elastique de la lumi`ere. On ´eclairait un ´echantillon avec de la lumi`ere monochromatique de longueur d’onde connue 5145˚ A, et on analysait la lumi`ere diffus´ee par l’´echantillon `a l’aide d’un ensemble de r´eseaux. Le r´esultat exp´erimental ´etait l’intensit´e lumineuse en fonction de la pulsation I(ω) et la courbe obtenue ressemblait `a la figure 4.21 avec du bruit. On connaissait les propri´et´es du dispositif exp´erimental et la th´eorie disait que le r´esultat devait ˆetre le produit de convolution d’une lorentzienne par une « fonction d’appareil » qui reproduisait les caract´eristiques du dispositif. L’ajustement donna, sans surprise, hauteur, position et largeur de la lorentzienne. On tra¸ca alors la courbe des ´ecarts pour s’apercevoir qu’il y avait une bosse syst´ematiquement positive au pied de cette lorentzienne. On tenta alors de reprendre l’ajustement avec d’autres param`etres initiaux, et/ou en bloquant `a des valeurs « rai-
71
Physique num´erique, Philippe Depondt
sonnables » l’un ou l’autre param`etre sans jamais r´eussir ` r´eduire cette bosse. . . Finalement, l’on d´ecida d’introa duire dans le mod`ele une deuxi`eme lorentzienne, toujours convolu´ee avec la fonction d’appareil : le r´esultat devint excellent ! La lumi`ere diffus´ee comportait donc deux pics a deux fr´equences diff´erentes et non un : le premier ´etait ` celui que l’on voyait ` a l’œil nu, le deuxi`eme, beaucoup plus faible en intensit´e, `a une fr´equence l´eg`erement sup´erieure, ´etait cach´e dans le pied du premier : l’analyse attentive du r´esultat de l’ajustement avait seule permis de le d´etecter. Restait ´evidemment ` a expliquer d’o` u il venait, ce deuxi`eme pic. . . : il s’av´era qu’en fait le premier pic ´etait dˆ u` a des imperfections du dispositif exp´erimental et que l’information physique r´esidait dans le deuxi`eme.
Il suffit d’ajouter une deuxi`eme lorentzienne : f(x) = l1/(1+((x-x1)/g1)**2)+l2/(1+((x-x2)/g2)**2) x1 = 940 ; x2 = 950 ; l = 1000 fit f(x) ’lorentz.out’ u 1 :2 :(1) via l1, l2, x1, x2, g1, g2 et l’on obtient : 2500 f(x) ’lo2’
2000
1500
1000
500
Comme beaucoup d’autres programmes, le logiciel de trac´e de courbe gnuplot comporte une fonction fit qui permet de faire toutes sortes d’ajustements de fonctions ` a des donn´ees sans avoir ` a ´ecrire soi-mˆeme un programme. La syntaxe en est assez simple, par exemple : fit a*x**2+b*x+c ’fichier’ via a,b,c permet d’ajuster un polynˆ ome du deuxi`eme degr´e aux valeurs contenues dans un fichier. Implicitement, la premi`ere colonne du fichier contient les valeurs de x, la deuxi`eme celles de y et la troisi`eme celles des incertitudes sur y. Si ces derni`eres sont inconnues ou constantes, on peut taper : fit a*x**2+b*x+c ’fichier’ using 1 :2 :(1) via a,b,c ce qui fixe la valeur de cette incertitude uniform´ement ` a 1. Le r´esultat de l’op´eration est la valeur de a, b et c. On peut faire des choses plus sophistiqu´ees : f(x) = l/(1+((x-x0)/g)**2) x0 = 940 ; l = 1000 fit f(x) ’lorentz.out’ u 1 :2 :(1) via l, x0, g On ajuste alors une lorentzienne ` a des valeurs contenues dans un fichier, en donnant des valeurs initiales ` a plusieurs variables pour « aider » le programme. Pour tracer le r´esultat : plot f(x), ’lorentz.out’ ce qui donne la figure ci-dessous.
0 900
940
960
980
1000
avec les valeurs : l1 = 2019.76 +/- 8.07 ; l2 = 112.795 +/- 6.978 ; x1 = 940.013 +/- 0.02164 ; x2 = 953.61 +/- 0.4528 ; g1 = 4.96645 +/- 0.03408 ; g2 = 5.86099 +/- 0.7297 On peut mˆeme tracer les ´ecarts entre la fonction th´eorique et les donn´ees : plot "lorentz.out" using 1 :($2-f($1)) 60 50 40 30 20 10 0 -10 -20 -30 -40 900
l = 2007.89 +/- 14.49; x0 = 940.12 +/- 0.03819 ; g = 5.26853 +/- 0.05383
920
920
940
960
980
1000
2500 fonction donnees
Tab. 4.2 – Fit avec gnuplot (suite de la table 4.1).
2000
1500
4.9
1000
500
0 900
920
940
960
980
1000
On observe une petite « bosse ». . . qu’` a cela ne tienne ! Voir la table 4.2.
Tab. 4.1 – Fit avec gnuplot
Syst` emes d’´ equations rentielles ordinaires.
diff´ e-
Les physiciens sont extrˆemement prolifiques lorsqu’il s’agit de produire, `a partir de probl`emes divers, des ´equations diff´erentielles ordinaires (par exemple, les ´equations du mouvement de la m´ecanique newtonienne). Malheureusement, l’inspiration manque parfois lorsqu’il s’agit de les r´esoudre, en particulier quand elles ne sont pas lin´eaires : un petit programme de r´esolution num´erique peut alors s’av´erer pr´ecieux.
4.9.1
Un exemple : les lignes de champ.
Admettons que l’on puisse calculer en chaque point ~r le ~ r ) dˆ Cette anecdote n’a rien d’exceptionnel : pratiquement champ ´electrique E(~ u `a une distribution de charges et tout exp´erimentateur en a d’autres du mˆeme style `a ra- que l’on en veuille tracer les lignes de champ. Une ligne conter, ce genre d’aventure fait partie du m´etier ! de champ est d´efinie par le fait qu’elle est en chaque point
72
Licence de physique L3 : Physique Fondamentale & PHYTEM,
4.9.2
parall`ele au champ :
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
La m´ ethode d’Euler.
~ r) d~s // E(~
Soit donc, pour g´en´eraliser, un syst`eme de n ´equations diff´erentielles du premier ordre du type :
o` u le vecteur d~s est le vecteur ´el´ementaire tangeant au point ~r `a la ligne de champ (figure 4.22) et s est l’abscisse curviligne sur la ligne de champ.
dyℓ = fℓ (x, {yp }), ∀ℓ ∈ [1, n] dx
ds
Ligne de champ
Fig. 4.22 – Une ligne de champ
et l’on cherche `a calculer num´eriquement les valeurs des yℓ (x) en connaissant les expressions des d´eriv´ees fℓ (x, {yp }) en fonction de x et de l’ensemble des yp (dans l’exemple pr´ec´edent, on avait les d´eriv´ees des coordonn´ees d’un point sur la ligne de champ par rapport `a l’abscisse curviligne en fonction du champ, lui-mˆeme d´ependant de la position). Il faut alors fixer des conditions initiales (0) yℓ (x0 ) et un pas d’int´egration fini dx et proc´eder pas `a pas : (k) (k−1) yℓ = yℓ + fℓ (xk−1 , {yp(k−1) })dx Il s’agit simplement d’une approximation lin´eaire des fonctions yℓ pour chaque pas d’int´egration k o` u la pente des fonctions est estim´ee `a partir du r´esultat pr´ec´edent (figure 4.23).
Si les coordonn´ees de d~s sont (dx, dy, dz), on obtient ´evidemment en chaque point ~r : dy dz ds dx = = = Ex Ey Ez E
y (2) (1) y
~ et E = kEk. ~ On aboutit alors o` u, bien sˆ ur, ds = kdsk a un syst`eme de trois ´equations diff´erentielles du premier ` (0) ordre : y dx ds dy ds dz ds
= = =
xn yn
= =
xn−1 + dx yn−1 + dy
zn
=
zn−1 + dz
avec =
dy
=
dz
=
f
Ex (xn−1 , yn−1 , zn−1 ) ds E(xn−1 , yn−1 , zn−1 ) Ey (xn−1 , yn−1 , zn−1 ) ds E(xn−1 , yn−1 , zn−1 ) Ez (xn−1 , yn−1 , zn−1 ) ds E(xn−1 , yn−1 , zn−1 )
(2)
f
(3)
(0)
Ex (~r) E(~r) Ey (~r) E(~r) Ez (~r) E(~r)
dont la r´esolution doit donner les ´equations param´etriques x(s), y(s) et z(s) en fonction de l’abscisse curviligne s de la ligne champ consid´er´ee. Pour r´esoudre num´eriquement ce syst`eme, on part d’un point donn´e (x0 , y0 , z0 ) (les conditions initiales pour une ligne donn´ee), et l’on choisit un pas d’int´egration fini ds, comme pour les int´egrations num´eriques du chapitre 4.3.2. Il reste alors `a int´egrer pas ` a pas :
dx
f
f
(1)
dx
x0
x1
x2
Fig. 4.23 – La m´ethode d’Euler (ici `a une dimension, c’est-`a-dire une seule ´equation diff´erentielle) : on calcule les d´eriv´ees en un point, on prolonge les fonctions lin´eairement en ce point en utilisant les d´eriv´ees sur un pas d’int´egration fini dx ce qui donne un nouveau point de d´epart d’o` u l’on peut recommencer. Comme pour les probl`emes d’int´egrales, la difficult´e est ´evidemment le choix du pas d’int´egration : la premi`ere r`egle est ´evidemment qu’il doit ˆetre petit par rapport `a une distance de variation significative des fonctions ´etudi´ees. Ici, une fois de plus, il ne faut pas oublier que l’on est physicien : par exemple dans le cas des lignes de champ, on peut tenter de tracer deux lignes tr`es proches et v´erifier qu’elles ne se croisent pas. . .
4.9.3
La m´ ethode d’Euler « am´ elior´ ee » ou m´ ethode de Heun.
c’est ce que l’on appelle la m´ethode d’Euler. Pour tracer d’autres lignes de champ, il suffit de partir d’autres condiLa m´ethode d’Euler donne souvent des r´esultats satisfaitions initiales et de recommencer. sants, mais elle a le d´efaut que les d´eriv´ees sont ´evalu´ees au
73
Physique num´erique, Philippe Depondt
d´ebut de l’intervalle dx : il y a l` a une dissym´etrie g´enante, car il n’y a pas de raison d’´evaluer les d´eriv´ees au d´ebut plutˆ ot qu’` a la fin ou au milieu de l’intervalle. On retrouve les questions abord´ees pour l’int´egration dans le chapitre 4.3.2 par la m´ethode des rectangles, ` a gauche, `a droite ou centr´es. La diff´erence est qu’alors, on pouvait calculer la fonction `a int´egrer n’importe o` u : ce n’est plus le cas puisque les valeurs des fonctions sont les r´eponses que l’on cherche justement. On ne connait que les d´eriv´ees en fonction des valeurs prises par ce que l’on cherche, puisque les fℓ d´ependent des yp : on tourne en rond !
d’Euler et obtenir de nouvelles valeurs des yp : on ne trouvera pas le mˆeme r´esultat puisqu’on n’utilise pas les mˆemes d´eriv´ees, il ne s’agit toujours que d’estimations. Cela permet d’obtenir une troisi`eme estimation de d´eriv´ees. Cette troisi`eme estimation est utilis´ee pour faire un pas complet, cette fois-ci, d’Euler, toujours `a partir du mˆeme point de d´epart : quatri`eme estimation des yp et des d´eriv´ees. . .
(4) (3)
(2) (1) (3) (2)
première estimation de la dérivée
y(x)
deuxième estimation y(x+dx) moyenne des 2 dérivées
dx/2 x
dx
x+dx
Fig. 4.24 – M´ethode d’Euler am´elior´ee Fig. 4.25 – Les quatre ´evaluations de la d´eriv´ee dans la Ce que l’on aimerait faire, c’est une estimation de la m´ethode de Runge-Kutta d’ordre 4. d´eriv´ee au milieu de l’intervalle dx (au demi-pas) en faisant une moyenne entre les valeurs des d´eriv´ees au d´ebut et `a Il reste alors `a faire une moyenne pond´er´ee de ces quatre estimations en faisant compter celles du milieu la fin de l’intervalle : deux fois plus et faire enfin un pas de longueur dx. Le (k−1) (k) sous-programme correspondant est tr`es simple : f (x , {y }) + f (x , {y }) p p ℓ k−1 ℓ k fℓ (xk−1/2 , {yp(k−1/2) }) = 2 (4.21) subroutine rk4(x,y,dx,n,deriv) !--------------------------------------------! (k) Comme la valeur de yp est inconnue, on peut faire ! sous programme de resolution d’equations ! une premi`ere estimation ` a l’aide de la m´ethode d’Euler ! differentielles du premier ordre par la ! pr´ec´edente ; puis on applique l’´equation (4.21) pour ob- ! methode de Runge-Kutta ! tenir la d´eriv´ee au demi-pas et enfin on peut utiliser de ! x = abscisse ! nouveau la m´ethode d’Euler avec cette d´eriv´ee corrig´ee ! y = valeurs des fonctions ! (figure 4.24). ! dx = pas ! = nombre d’equations differentielles ! Le coˆ ut de cette am´elioration est ´evidemment que ! n ! l’on doit faire deux estimation des d´eriv´ees par pas ! deriv = variable contenant le nom du ! sous-programme qui calcule les derivees ! d’int´egration, mais ´evidemment, ce coˆ ut peut ˆetre com!--------------------------------------------! pens´e si l’on peut obtenir la mˆeme pr´ecision, voire mieux, qu’avec la m´ethode d’Euler en prenant un pas implicit none integer , intent(in) :: n d’int´egration deux fois plus grand.
4.9.4
La m´ ethode d’ordre 4.
de
Runge-Kutta
Il se trouve que la m´ethode de Heun est assez peu utilis´ee car, la m´ethode de Runge-Kutta d’ordre 4 est un pas suppl´ementaire dans cette direction qui offre souvent un tr`es bon compromis : elle tente de faire une meilleure estimation des d´eriv´ees ` a l’aide d’une moyenne de 4 estimations (d’o` u l’ordre 4). La premi`ere estimation est celle d’Euler : on calcule les d´eriv´ees au point x connaissant les yp (x) d´ej` a calcul´es au pas pr´ec´edent. On fait alors un demi-pas de longueur dx 2 par la m´ethode d’Euler pour ´evaluer les valeurs des yp au demi-pas : cela permet de calculer de nouvelles valeurs des d´eriv´ees (figure 4.25). On revient au point de d´epart et l’on utilise ces nouvelles d´eriv´ees pour refaire un demi-pas
real, dimension(n), intent(inout) :: y real , intent(in) :: x, dx ! d1, d2, d3, d4 = estimations des derivees ! yp = estimations intermediaires des fonctions real, dimension(n) :: d1, d2, d3, d4, yp real :: ddx, c = 1.0/6.0 ddx = dx/2 call deriv(x ,y ,d1,n); call deriv(x+ddx,yp,d2,n); call deriv(x+ddx,yp,d3,n); call deriv(x+dx ,yp,d4,n);
yp=y+d1*ddx yp=y+d2*ddx yp=y+d3*dx y =y+c*(d1+2*d2+2*d3+d4)*dx
end
-Exercice : v´erifier que le programme ci-dessus fait bien ce qui est annonc´e. . . Pour utiliser ce sous-programme, il faut un programme principal qui fasse une boucle sur x et qui g`ere les entr´ee-
74
Licence de physique L3 : Physique Fondamentale & PHYTEM,
sorties et un autre sous-programme qui contient la physique du probl`eme, soit le calcul des d´eriv´ees : dans le cas des lignes de champ, il doit calculer les composantes du champ, sa norme et faire les rapports. Cela ressemble certes ` a une recette de cuisine, mais c’est un des chevaux de bataille des physiciens : c’est une m´ethode remarquablement efficace ! Une illustration en est donn´ee figure 4.26.
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Un autre exemple c´el`ebre est l’´equation de Schr¨odinger d´ependant du temps : si l’on ne fait pas tr`es attention, on obtient que la norme de la fonction d’onde diverge exponentiellement avec le temps, ce qui est fˆacheux ! Dans les deux cas, la m´ethode de Cranck et Nicholson peut ˆetre une solution. Si l’on revient `a la m´ethode d’Euler, la critique qui en avait ´et´e faite ´etait qu’elle est dissym´etrique : (k+1)
yℓ
(k)
= yℓ
(k)
+ fℓ (xk , {yℓ′ })dx
la variation des fonctions ´etant enti`erement calcul´ee a` partir des valeurs des d´eriv´ees au d´ebut de l’intervalle : on pourrait tout aussi bien faire le mˆeme calcul en utilisant les d´eriv´ees `a la fin de l’intervalle : (k+1)
yℓ
(k)
= yℓ
(k+1)
+ fℓ (xk+1 , {yℓ′
})dx
La m´ethode de Heun faisait une estimation des d´eriv´ees en fin de l’intervalle par la m´ethode d’Euler, mais il y a l` a encore une part d’arbitraire : on peut remarquer toutefois que l’´equation ci-dessus est une ´equation implicite, (k+1) les inconnues yℓ figurant dans le deuxi`eme membre ; il faut donc r´esoudre un syst`eme d’´equations (en g´en´eral non-lin´eaires) : (k+1)
yℓ
(k)
− yℓ
(k+1)
− fℓ (xk+1 , {yℓ′
})dx = 0
c’est une recherche de z´ero qui peut ˆetre faite par la m´ethode de Newton d´ej` a vue (§4.5.3). Cette m´ethode est appel´ee la m´ethode d’Euler implicite mais elle n’apporte gu`ere par rapport `a la m´ethode d’Euler explicite d´ej` a vue -elle est tout aussi dissym´ e triquesinon qu’elle est sensiFig. 4.26 – Lignes de champ d’un syst`eme de trois charges calcul´ees `a l’aide de la m´ethode de Runge-Kutta d’ordre blement plus compliqu´ee ! La m´ethode de Cranck et Nicholson est une moyenne 4. entre la m´ethode d’Euler explicite et la m´ethode d’Euler implicite, qui r´etablit ainsi la sym´etrie `a la mani`ere de la m´ethode de Heun, mais de fa¸con plus rigoureuse : 4.9.5 La m´ ethode de Cranck et Nicholson (k) (k+1) f (x , {y }) + f (x , {y }) ′ ′ ℓ k ℓ k+1 ℓ ℓ Mˆeme la m´ethode de Runge-Kutta, malgr´e toutes (k+1) (k) yℓ = yℓ + dx ses qualit´es, ne donne pas toujours enti`ere satisfaction. 2 Un exemple classique et le mod`ele proies-pr´edateurs de (k+1) : Volterra-Lotka28. Le nombre x de proies croˆıt au cours du ce qui donne `a r´esoudre en yℓ′ temps d’un coefficient a mais diminue proportionnellement (k) (k+1) f (x , {y }) + f (x , {y }) ′ ′ ℓ k ℓ k+1 ℓ ℓ au nombre de pr´edateurs y : (k+1) (k) dx = 0 yℓ − yℓ − 2 dx (4.22) = x (a − by) C’est une m´ethode assez lourde puisqu’il faut r´esoudre dt un syst`eme non-lin´eaire d’´equations (4.22) par la m´ethode De mˆeme, le nombre de pr´edateurs d´ecroˆıt d’un taux c `a de Newton, ce qui suppose de calculer la matrice jacause de la mortalit´e, mais croˆıt proportionnellement aux cobienne des d´eriv´ees partielles et un programme de ressources disponibles en proies, soit : r´esolution de syst`emes lin´eaires appel´e it´erativement en esp´erant que les solutions trouv´ees accepteront de converdy = y (−c + d x) ger. Il s’agit cependant d’un moyen puissant pour se tirer dt de situations d´elicates, `a garder donc dans ses archives au u! On d´emontre que les solutions de ce syst`eme d’´equations cas o` sont p´eriodiques au cours du temps : un bon test est donc de v´erifier la p´eriodicit´e du r´esultat num´erique obtenu en 4.9.6 Equations ´ d’ordre sup´ erieur ` a 1. tra¸cant, par exemple, y en fonction de x afin de voir si Pour le moment, on s’en est tenu `a des syst`emes la trajectoire obtenue repasse toujours au mˆemes endroits (voir la figure 4.27). . . ce qui n’est, bien sˆ ur, jamais par- d’´equations d’ordre un : en fait, c’est beaucoup moins restrictif que cela en a l’air. Soit par exemple, une ´equation faitement obtenu ! du deuxi`eme ordre : 28 voir par exemple : http ://perso.univ-rennes1.fr/gregory.vial/agreg/cplt/ volterra.pdf.
dy d2 y +a =f dx2 dx
75
Physique num´erique, Philippe Depondt
temps dans le sous-programme de calcul des forces ; il est vital d’optimiser ces calculs l` a. Or, ce n’est sans doute pas une tr`es bonne id´ee, dans ce cas l` a, d’utiliser un algorithme comme Runge-Kutta30 qui exige quatre estimations des forces par pas de calcul ! L’algorithme de Verlet est une r´eponse tr`es simple `a ce probl`eme : dt f ({~r ′ (t)}) dt ~vℓ (t + ) = vℓ (t − ) + ℓ ℓ dt 2 2 mℓ ~r (t + dt) = ~r (t) + ~v (t + dt )dt ℓ ℓ ℓ 2
Les vitesses sont ´evalu´ees au demi-pas, alors que les positions et les forces sont ´evalu´ees au pas entier, ce qui supprime la dissym´etrie qui ´etait g´enante dans la m´ethode d’Euler. Fig. 4.27 – V´erification de la p´eriodicit´e du probl`eme de Cette m´ethode est fort utilis´ee sous des formes diverses Volterra-Lotka r´esolu par la m´ethode de Cranck et Nichol- d`es que l’on s’int´eresse `a la dynamique de syst`emes comson. portant un grand nombre de particules (de quelques dizaines `a quelques dizaines de milliers. . .). o` u a peut ˆetre une constante ou une fonction de y. Si l’on introduit une variable suppl´ementaire z qui est la d´eriv´ee premi`ere de y, on obtient : dy =z dx dz = f − az dx
deux ´equations diff´erentielles du premier ordre. On peut donc toujours d´ecomposer des ´equations diff´erentielles d’ordre sup´erieur `a un en plusieurs ´equations d’ordre un `a condition d’introduire des variables suppl´ementaires qui sont les d´eriv´ees successives des fonctions. Ainsi, trois ´equations du deuxi`eme ordre se transforment ais´ement en six ´equations du premier ordre, une ´equation du troisi`eme ordre devient trois du premier ordre, etc.
4.9.7
M´ ethode de Verlet.
Les syst`emes d’´equations diff´erentielles du deuxi`eme ordre sont d’un int´erˆet particulier en physique puisque les ´equations du mouvement d’un ensemble de n mobiles en interaction s’´ecrivent : d~rp d2~rℓ = f~ℓ ({~rp , }), ∀ℓ ∈ [1, n] 2 dt dt Cela se r´esout sans difficult´e majeure par la m´ethode de Runge-Kutta, voire par Cranck-Nicholson, puisque cela donne 3n ´equations du deuxi`eme ordre et donc 6n ´equations du premier ordre. Si l’on se restreint ` a des interactions de paire, les forces s’´ecrivent : n X f~ℓ = f~ℓℓ′ ℓ′ =1,ℓ′ 6=ℓ
4.9.8
Dans tout ces probl`emes d’´equations diff´erentielles, on l’a vu, le pas d’int´egration est non-nul, il est petit, certes, mais il n’est pas nul. « Il n’y a qu’` a » le choisir assez petit. . . Ce n’est, h´elas, pas toujours aussi simple : si on le choisit trop petit, on multiplie le nombre des it´erations, ce qui allonge inutilement la dur´ee du calcul, mais aussi multiplie les erreurs d’arrondi ; trop diminuer le pas d’int´egration diminue la pr´ecision du calcul, on perd sur tous les tableaux ! Un compromis s’impose alors, mais selon quel crit`ere ? Il appartient `a chacun de se poser cette question et de tenter d’y r´epondre par une ´etude a priori du probl`eme. Par exemple, s’il s’agit d’un syst`eme m´ecanique isol´e nondissipatif, la somme de l’´energie potentielle et de l’´energie cin´etique doit rester constante au cours du calcul, c’est la physique qui le dit ! La p´eriodicit´e attendue du probl`eme de Volterra-Lotka est aussi un bon crit`ere, la conservation de la norme de la fonction d’onde pour l’´equation de Schr¨odinger ´egalement. Bien souvent, on peut r´esoudre le syst`eme d’´equations diff´erentielles dans un cas proche de celui qui nous int´eresse mais dont on connait la solution analytique (un syst`eme lin´eaire, par exemple) et v´erifier que le calcul num´erique donne bien le mˆeme r´esultat, ou un r´esultat tr`es proche du calcul analytique. Ces questions ne sont pas `a n´egliger : revenons `a l’´equation logistique de la section 3.2. Si on la consid`ere comme une ´equation diff´erentielle, implicitement, puisque la population d’insecte de la g´en´eration n + 1 est calcul´ee un an apr`es celle de la g´en´eration n, le pas d’int´egration est de un an. On pourrait imaginer d’int´egrer analytiquement cette ´equation et consid´erant le temps comme une variable continue et donc un pas d’int´egration qui tend vers z´ero :
soit, en tenant compte du principe de l’action et de la forces ` a calculer. Si l’on est en train r´eaction29, n(n−1) 2 de s’int´eresser `a un syst`eme compos´e d’un grand nombre d’atomes, ou `a une galaxie comportant beaucoup d’´etoiles, soit : cela fait vite un nombre prodigieux de forces ` a calculer et l’exp´erience prouve que le programme va passer 99% du 29 f~ ′ ℓ ℓ
= −f~ℓℓ′ .
Le probl` eme du pas d’int´ egration.
30 sans
x(t + dt) = r x(t) (1 − x(t)) dt x(t + dt) − x(t) dx = = x (r(1 − x) − 1) dt dt parler de Cranck-Nicholson. . .
76
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Il s’agit d’une ´equation diff´erentielle qui se r´esoud analyti- Heun et Runge-Kutta, l’application est facile : il sufquement `a la main avec un peu de travail31 , ou alors grˆace fit de d´ecomposer l’´equation du deuxi`eme ordre en deux a un logiciel de calcul formel, et l’on obtient : ` ´equations du premier ordre, en introduisant une variable suppl´ementaire v : (r − 1)x0 x(t) = x˙ = v rx0 + (r(1 − x0 ) − 1) e−(r−1)t
v˙ = − sin x o` u x0 = x(t = 0). Pour r > 1, cette expression converge exponentiellement vers son point fixe : plus de chaos ! Pour Cranck-Nicholson, il y a un peu plus de travail ; On obtient donc un ´enorme changement qualitatif (figure soient, pour simplifier les notations, x = x(t) et v = v(t) 4.28)32 . x+ = x(t + δt) et v + = v(t + δt). Cela s’´ecrit : 1
x+
dt=1 continu
0.9 0.8
v+
0.7
x
0.6
v + v+ δt 2 sin x + sin x+ = v− δt 2 = x+
o` u x+ et v + sont les inconnues. On a donc deux fonction dont on doit chercher le z´ero par une m´ethode de Newton :
0.5 0.4 0.3 0.2
f (x+ , v + ) =
0.1 0
0
5
10
15
20
25 t
30
35
40
45
50
g(x+ , v + ) =
v + v+ δt 2 sin x + sin x+ v − v+ − δt 2
x − x+ +
Fig. 4.28 – R´esolution num´erique avec dt = 1 et r´esolution On doit appliquer `a x+ et v + des variations dx+ et dv + de analytique de l’´equation logistique pour r = 4 : qui a rai- fa¸cons `a ce que ces fonctions s’annulent, c’est-`a-dire que df = −f et dg = −g ; or, en lin´earisant, comme d’habitude son ? ∂f ∂f Le calcul num´erique est-il donc faux ? Cela d´epend du dx+ + + dv + df = + ∂x ∂v mod`ele. Si l’on consid`ere qu’il n’y a pas de saison et que le ∂g ∂g + taux de reproduction des insectes d´epend instantan´ement dg = dx + + dv + ∂x+ ∂v de la population `a l’instant t, alors c’est le calcul avec le temps continu qui est correct. Si, au contraire, on consid`ere ∂g ∂f = = −1, que le taux de reproduction des insectes d´epend de l’´etat Les d´eriv´ees sont ais´ees `a calculer : + ∂x ∂v + de la g´en´eration pr´ec´edente au moment de la ponte et donc ∂f δt ∂g + δt de la fa¸con dont elle a pu se nourrir l’ann´ee pr´ec´edente, ∂v + = 2 et ∂x+ = − cos x 2 . Cela donne, tous calculs faits : alors c’est le pas d’int´egration d’un an qui est correct. Au physicien - averti, bien sˆ ur -, donc, de choisir son f + g δt 2 mod`ele en connaissance de cause et de faire ses choix en dx+ = 2 cons´equence ! 1 + cos x+ δt 2
4.9.9
Quelle m´ ethode choisir ?
Comme chaque fois que l’on dispose de plusieurs m´ethodes pour r´esoudre un probl`eme se pose la question : laquelle choisir ? Il serait bien sˆ ur tellement agr´eable de pouvoir r´epondre de fa¸con univoque et d´efinitive ! C’est, h´elas, trop demander. ` titre indicatif, on a tent´e de comparer les m´ethodes A expos´ees ci-dessus dans le cas d’un pendule simple, dont l’´equation du mouvement s’´ecrit : x ¨ = − sin x o` u x est l’angle que fait le pendule avec la verticale. Comme il s’agit d’un syst`eme non-dissipatif (sans force de frottement), l’´energie doit rester constante ; ainsi la variance de l’´energie au cours d’une simulation devrait ˆetre nulle : voil` a donc un test pour mettre ces algorithmes `a l’´epreuve. Pour les m´ethodes d’Euler, Verlet, a peut faire le changement de variable x(t) = b+cy(t) o` u a, b et c sont des coefficients a ` d´ eterminer et y(t) la nouvelle variable. 32 Voir H. Krivine, J. Treiner, A. Lesne, soumis Am. J. Phys. 31 On
dv +
=
dx+ − f δt 2
Le programme qui fait tout cela et calcule la variance de l’´energie en fonction du pas de temps peut s’´ecrire : program pendule implicit none integer, parameter real, dimension(n) real double precision integer character (len=1) external
:: :: :: :: :: :: ::
n = 2 theta t, dt, tmax e, em, e2m, e0 nstep, step, it ode d
write(*,’("Runge-Kutta, Euler, Heun, Verlet, & & Cranck-Nicholson ? ")’,advance=’no’) read(*,*) ode open(1, file = ’pendule.var’) tmax = 157. ! 25 periodes do it = -24, 4 ! boucle sur la valeur du dt = 10.**(0.25*it) ! pas de temps nstep = nint(tmax/dt) em = 0. ; e2m = 0.
77
Physique num´erique, Philippe Depondt
theta(1) = 1.5 ; theta(2) = 0. ! cond. init. e0 = theta(2)**2*0.5 - cos(theta(1)) do step = 1, nstep ! boucle sur le temps t = step*dt select case (ode) case(’R’) call rk4(t, theta, dt, n, d) case (’E’) call euler(t, theta, dt, n, d) case (’H’) call heun(t, theta, dt, n, d) case(’V’) call verlet(t, theta, dt, n, d) case(’C’) call cranck(t, theta, dt, n, d) case default stop end select e = theta(2)**2*0.5 - cos(theta(1)) - e0 ! energie em = em + e ; e2m = e2m + e*e enddo em = em/nstep ; e2m = e2m/nstep write(1,*) dt, e2m -em*em ! variance de l’energie enddo close(1) end subroutine d(t,theta,dtheta,n) ! derivees implicit none integer, intent(in) :: n real, intent(in) :: t real, dimension(n), intent(in) :: theta real, dimension(n), intent(out) :: dtheta dtheta(1) = theta(2) ; dtheta(2) = -sin(theta(1)) end
subroutine euler(x,y,dx,n,deriv) implicit none integer , intent(in) :: real , intent(in) :: real, dimension(n), intent(inout) :: real, dimension(n) :: call deriv(x,y,k1,n) ; y = y + dx*k1 end subroutine verlet(x,y,dx,n,deriv) implicit none integer , intent(in) :: real , intent(in) :: real, dimension(n), intent(inout) :: real, dimension(n) :: call deriv(x,y,dy,n) y(2) = y(2) + dy(2)*dx ; y(1) = y(1) end subroutine rk4(x,y,dx,n,deriv) implicit none integer , intent(in) real , intent(in)
subroutine cranck(t,y,dt,n,deriv) implicit none integer , intent(in) :: n real , intent(in) :: t, dt real, dimension(n), intent(inout) :: y double precision :: x, v, xp, vp, dx, dv, f, g, & dth, eps = 1.e-8 external :: deriv integer :: count dth = dt/2.d0 x = y(1) ; v = y(2) xp = x + v*dt ; vp = v - sin(x)*dt ! Euler do count = 1, 100 ! Newton f = x - xp + (v + vp)*dth g = v - vp -(sin(x) + sin(xp))*dth dx = (f+g*dth)/(1+cos(xp)*dth**2) dv = (dx-f)/dth if ( abs(dx) < eps .and. abs(dv) < eps ) exit xp = xp + dx ; vp = vp + dv enddo y(1) = xp ; y(2) = vp end
La figure 4.29 montre le r´esultat de ces calculs et la table 4.3 donne le temps que cela prend. Le meilleur algorithme est bien sˆ ur celui qui donne la variance la plus faible pour le pas de temps le plus grand et la dur´ee d’ex´ecution la plus courte. . . 100000
1 Variance
subroutine heun(x,y,dx,n,deriv) implicit none integer :: i, n, nmax real , intent(in) :: x, dx real, dimension(n), intent(inout) :: y real, dimension(n) :: yp, k1, k2 call deriv(x,y,k1,n) ; yp = y + dx*k1 call deriv(x,yp,k2,n) ; y = y + dx*0.5*(k1 + k2) end
real, dimension(n), intent(inout) :: y real :: ddx, c= 1.0/6.0 real, dimension(n) :: yp, k1, k2, k3, k4 ddx = 0.5*dx call deriv(x ,y ,k1,n) ; yp = y+ddx*k1 call deriv(x+ddx,yp,k2,n) ; yp = y+ddx*k2 call deriv(x+ddx,yp,k3,n) ; yp = y+dx*k3 call deriv(x+dx ,yp,k4,n) y = y+dx*( k1 + 2.0*k2 + 2.0*k3 + k4 )*c end
n x, dx y k1
Euler Verlet Heun Runge−Kutta 4 Cranck−Nicholson
1e−05
1e−10
1e−15 1e−06
1e−05
1e−04
0.001
0.01
0.1
1
10
dt
n x, dx y dy +
y(2)*dx
:: n :: x, dx
Fig. 4.29 – Variance de l’´energie d’un pendule simple en fonction du pas de temps pour plusieurs m´ethodes d’int´egration (´echelles logarithmiques). On constate d’abord que la m´ethode de Verlet, pour une dur´ee d’ex´ecution identique `a celle d’Euler et un effort de programmation mineur, permet de gagner un ordre de grandeur dans le pas d’int´egration et plusieurs ordres de grandeur de pr´ecision : Euler paraˆıt donc `a rejetter sans h´esitation ! La m´ethode de Heun permet une am´elioration sensible des r´esultats par rapport au deux pr´ec´edentes, mais Runge-Kutta fait encore nettement mieux puisqu’on gagne `a peu pr`es un ordre de grandeur pour le pas de
78
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Euler Verlet Heun Runge-Kutta Cranck-Nicholson
2mn 2mn 3mn 5mn 2mn
8s 10s 2s 34s 57s
4.10.1
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
La transform´ ee de Fourier en physique.
Au d´ebut du XIXe si`ecle, en 1822, le baron Joseph Fourier34 , dans sa Th´eorie analytique de la chaleur, uti~ = lisa pour r´esoudre la relation qui porte son nom (φ ~ T , le flux de chaleur est proportionnel au graTab. 4.3 – Dur´ees d’ex´ecution du programme ci-dessus −κ grad pour les diff´erentes m´ethodes (sur un PC). dient de temp´erature) des d´eveloppements sur une base de sinus et de cosinus : les s´eries de Fourier. En notations complexes35 : X temps pour une dur´ee d’ex´ecution ` a peine deux fois plus f (t) = cℓ e−2πiℓνt (4.23) grande. Quant `a Cranck & Nicholson, elle se situe `a peu de ℓ choses pr`es dans la mˆeme gamme de qualit´e que Heun, au ou en d´eveloppant l’exponentielle : prix d’un effort de programmation nettement sup´erieur. X Ainsi, la m´ethode de Runge-Kutta offre un rapport quaf (t) = aℓ cos(−2πℓνt) + ibℓ sin(−2πℓνt) lit´e-prix excellent ce qui explique son succ`es aupr`es des ℓ physiciens ! u les coefficients aℓ et bℓ sont complexes, ou encore en Il convient toutefois de nuancer assez nettement ce o` d´ ecomposant les coefficients cℓ en module et phase : verdict : dans le probl`eme ci-dessus, l’amplitude des osX cillations a ´et´e choisie forte. Si l’on choisit de faire le f (t) = kcℓ k eiϕℓ e−2πiℓνt mˆeme calcul pour des amplitudes plus faibles, les r´esultats ℓ changent : en particulier, Cranck & Nicholson ne fait alors X = kcℓ k ei(−2πℓνt+ϕℓ ) gu`ere mieux qu’Euler (ce qui confirme que cette m´ethode ℓ est ` a r´eserver aux cas difficiles) ! Si, au lieu d’un pendule, on en avait eu 1000, coupl´es entre eux, il est fort probable que la m´ethode de Verlet aurait sensiblement am´elior´e son Ce genre de d´eveloppement1 est limit´e aux fonctions p´eriodiques de p´eriode τ = ν , mais on peut g´en´eraliser score. . . en consid´erant que la fr´equence, au lieu d’ˆetre limit´ee `a ν La conclusion de tout ceci est que, sauf raison contraire et `a ses harmoniques 2ν, 3ν, . . ., ℓν,. . ., varie continˆ ument, a priori, dans la plupart des cas, la m´ethode de Runge- ainsi la somme de l’´equation (4.23) devient une int´egrale : Kutta est un excellent point de d´epart, mais pour des Z ∞ syst`emes du second ordre sans frottement pour lesquels f (t) = F (ν) e−2πiνt dν (4.24) les temps de calcul des d´eriv´ees est grand (typiquement −∞ quelques milliers d’atomes en interaction), Verlet est sans doute un meilleur choix. Ces remarques ne doivent tou- et inversement : tefois en aucun cas servir de pr´etexte pour se dispenser Z ∞ de tests s´erieux pour chaque tentative particuli`ere : caveat f (t) e2πiνt dt F (ν) = 33 −∞ emptor . L’imagination des num´ericiens et des math´ematiciens appliqu´es concernant la r´esolution d’´equations diff´erentielles ordinaires paraˆıt infinie : la litt´erature sur la question est surabondante. En particulier, toutes les m´ethodes `a pas variable qui permettent d’adapter en cours de calcul la longueur du pas d’int´egration sont compl`etement ignor´ees ici. Se reporter au besoin `a la litt´erature, par exemple, la r´ef´erence [19] dans la bibliographie.
4.10
Transform´ ees de Fourier rapides.
o` u la fonction F (ν) est la transform´ee de Fourier de f (t), f (t) est la transform´ee de Fourier inverse de F (ν). La fonction f (t) n’a plus de raison d’ˆetre p´eriodique. Dans l’´equation (4.23), le coefficient complexe cℓ donne le poids et la phase du terme d’ordre ℓ du d´eveloppement, c’est-`a-dire de la contribution de fr´equence ℓν : la mˆeme note (c’est-` a-dire un son de mˆeme fr´equence fondamentale) jou´ee sur un clavecin et sur un piano ne produit pas le mˆeme son, c’est que la suite des cℓ n’est pas la mˆeme. Dans l’´equation (4.24), le terme F (ν) donne de la mˆeme fa¸con le poids et la phase de la contribution de fr´equence ν du signal temporel : il s’agit d’une d´ecomposition en fr´equences. 4.10.1.1
Un exemple : le paquet d’ondes.
Imaginons, par exemple, que l’on allume une lumi`ere Dans ce chapitre, nous verrons de fa¸con aussi concr`ete a ` l’aide d’un interrupteur `a un instant t0 − τ2 et que la que possible ce qu’est une transform´ee de Fourier pour un physicien, sans que cela remplace un cours plus for- maintienne allum´ee pendant un temps τ , puis on l’´eteint. mel, puis l’on ´etudiera ce qu’en font les logiciels et sous34 A ` ne pas confondre avec Charles Fourier, philosophe, auteur de programmes de transform´ee rapide afin de tenter de saisir l’utopie sociale fouri´eriste et des phalanst`eres. 35 On peut consid´ la puissance mais aussi les limites de cet outil extraordierer, pour se fixer les id´ ees, t comme un temps et ν comme une fr´ equence, mais les relations donn´ ees ici sont plus naire. 33 «
Que l’acheteur ouvre l’œil ».
g´ en´ erales : coordonn´ ees spatiales et vecteur d’onde, par exemple, sont susceptibles du mˆ eme traitement, c’est d’ailleurs le cas pour la relation de Fourier.
79
Physique num´erique, Philippe Depondt
Mettons, pour simplifier, que la lumi`ere soit monochromatique de fr´equence ν0 . On a ainsi produit une onde plane interrompue, pour ainsi dire de dur´ee finie, dont l’amplitude peut s’´ecrire, au point ~r = 0 : E(t) = E0 e−2πiν0 t si t0 − τ2 < t < t0 + τ2 E(t) = 0 sinon
dur´ee du paquet d’onde devient petite, la distribution des fr´equences s’´elargit jusqu’` a devenir infinie. Concr`etement, si en actionnant `a la main un interrupteur, l’on allume une lumi`ere ou un laser, puis on l’´eteint une seconde plus tard, la largeur de la distribution de fr´equences sera de l’ordre de 1Hz ; or la fr´equence de la lumi`ere visible est plutˆ ot dans le domaine des 1014 Hz : l’´elargissement en fr´equences est compl´etement La transform´ee de Fourier d’un tel signal donne, `a la n´egligeable, le paquet d’ondes peut ˆetre consid´er´e comme suite d’un petit calcul : infini sans inconv´enient, c’est d’ailleurs l’approximation Z t0 + τ2 habituelle en optique. En revanche, si l’on choisit d’utiliser E0 e2πi(ν−ν0 )t dt = un laser `a impulsions, chaque impulsion37 durant quelques t0 − τ2 centaines de femtosecondes38 (¸ca s’ach`ete dans le commerce), la largeur spectrale est de l’ordre de 1013 Hz ce (4.25) qui n’est plus du tout n´egligeable comme le montrera le E0 τ e2πi(ν−ν0 )t0 sinc π(ν − ν0 )τ donc, essentiellement un sinus cardinal36 repr´esent´e sur la cours d’optique. Ces consid´erations ne se limitent bien sˆ ur pas `a l’opfigure 4.30. tique : un instrument de musique capable de « tenir » 1 une note, comme un orgue, un violon ou une trompette, 0.8 produira un son dont la hauteur ou la fr´equence est bien d´efinie, alors que pour une percussion, timbale ou tam0.6 bour, dont le son est tr`es court dans le temps, la hauteur de 0.4 la note est beaucoup moins facile `a d´efinir (mˆeme s’il existe 0.2 des timbales de hauteurs diff´erentes). De mˆeme, dans le do0 maine des communications, en g´en´eral, on utilise une onde −0.2 porteuse d’une certaine fr´equence : il faut que la dur´ee −0.4 des impulsions qui codent l’information soit relativement −0.6 longue par rapport `a la p´eriode de la porteuse afin d’´eviter un ´elargissement trop grand du spectre de fr´equence ce qui −0.8 se traduit g´en´eralement par une d´egradation de la qualit´e −1 0 2 4 6 8 10 de la transmission. frequences
1
4.10.1.2
0.9
Quelques propri´ et´ es importantes.
4.10.1.2.1 Notations. La notation utilis´ee jusqu’ici prend la convention temps-fr´equence, or on pourrait tout aussi bien ´eviter le facteur 2π grˆace `a la pulsation ω = 2πν : Z ∞ F (ω) = f (t) eiωt dt
0.8 0.7 0.6 0.5 0.4 0.3
et
0.2
f (t) =
0.1 0
0
2
4
6
8
10
frequences
Fig. 4.30 – Transform´ee de Fourier d’une onde plane interrompue : en haut partie r´eelle de l’´equation (4.25) pour ν0 = 5, τ = 1 et t0 = 10. En bas, module au carr´e (i.e. produit par son complexe conjugu´e) de la mˆeme chose : c’est ce que l’on appelle le « spectre ».
1 2π
Z
−∞ ∞
F (ω) e−iωt dω
−∞
´ Evidemment, le changement de variable introduit le facteur de 1/2π dans la transform´ee inverse. Les notations sont parfois diverses : il arrive de√ trouver ce facteur r´eparti ´equitablement sous forme de 1/ 2π dans les expressions de la transform´ee directe et inverse, ou purement et simplement supprim´e. . . Il est vrai que cela n’a gu`ere d’importance puisqu’il ne s’agit « que » d’un facteur multiplicatif ! On a raisonn´e ici en termes de temps et de fr´equence mais rien n’oblige `a ce que t soit un temps : il peut tr`es bien s’agir d’une coordonn´ee spatiale z et dans ce cas, on remplacera la pulsation par le vecteur d’onde k = 2π u λ peut λ o` ˆetre consid´er´e comme une longueur d’onde, par exemple, si ρ(z) est la densit´e ´electronique dans un mat´eriau : Z ∞ S(k) = ρ(z) eikz dz
On constate que l’onde plane interrompue, au lieu de n’avoir qu’une fr´equence bien d´efinie ν0 comme une onde plane infinie, s’´etale sur tout un spectre de fr´equences. Ce spectre est centr´e sur ν0 , la fr´equence de l’onde plane de d´epart. Le premier z´ero du sinus cardinal donne une estimation de la largeur du spectre : on trouve ν − ν0 = ± τ1 . −∞ Ainsi, si la dur´ee τ du paquet d’ondes devient grande jusqu’` a tendre vers l’infini, le spectre de fr´equence se resserre la quantit´e S(k) s’appelle le facteur de structure et c’est autour de ν0 jusqu’` a ne plus comporter que la fr´equence ce que l’on mesure (ou du moins son module au carr´e) ν0 : on retrouve l’onde plane infinie. Au contraire, si la 36 sinc x
=
sin x . x
37 Ou
pulse en bon franglais.
38 1fs=10−15 s.
80
Licence de physique L3 : Physique Fondamentale & PHYTEM,
lors d’exp´eriences de diffraction de rayons X : c’est une grandeur d’une consid´erable importance en physique de la mati`ere condens´ee : ` a partir de la connaissance du facteur de structure, on peut remonter39 ` a la densit´e ´electronique, et en admettant que les ´electrons se situent ` a proximit´e des noyaux, la structure atomique du mat´eriau consid´er´e. C’est donc un moyen tr`es puissant d’investigation de la mati`ere. De fa¸con plus g´en´erale, les math´ematiciens ne se pr´eoccupent pas toujours du sens physique des variables utilis´ees pour s’int´eresser ` a l’objet math´ematique « transform´ee de Fourier » qui peut s’´ecrire : Z ∞ ϕ(u) = f (x) eiux dx −∞
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
c’est que l’onde plane infinie a une distribution spectrale qui ne comporte qu’une seule fr´equence. La distribution de Dirac est parfois fort utile, si , par exemple, on a une distribution de charge ρ(z) qui ne comporte qu’une charge ponctuelle q situ´ee en z0 , on peut ´ecrire : ρ(z) = q δ(z − z0 ) et introduire ceci sans arri`ere-pens´ee dans les int´egrales et transform´ees de Fourier que l’on choisira afin d’utiliser tous les th´eor`emes habituels. La distribution de Dirac permet ´egalement de v´erifier que l’expression de la transform´ee de Fourier inverse donn´ee au d´ebut de ce chapitre est correcte : il suffit d’injecter l’expression :
et la transform´ee inverse : Z ∞ 1 f (x) = ϕ(u) e−iux du 2π −∞
F (ν) =
Z
∞
f (t) e2πiνt dt
−∞
dans l’´equation (4.24) : 4.10.1.2.2 La distribution de Dirac. Intuitive Z ∞ Z ∞ ′ ment, il s’agit d’une « fonction »40 δ(x) qui vaut z´ero parf (t′ ) e2πiνt dt′ e−2πiνt dν f (t) = tout sauf en x = 0 o` u. . . elle est infinie. Soit une fonction −∞ −∞ Z ∞ Z ∞ f (x), alors, la propri´et´e fondamentale de la distribution ′ ′ e2πiν(t −t) dν dt′ f (t ) = de Dirac est : −∞ −∞ Z ∞ apr`es inversion de l’ordre des int´egrations. L’int´egrale sur f (x) δ(x) dx = f (0) −∞ ν donne δ(t′ − t) et finalement : ou bien `a l’aide d’un changement de variable trivial : Z ∞ f (x) δ(x − x0 ) dx = f (x0 ) −∞
f (t) =
Z
∞
−∞
f (t′ ) δ(t′ − t) dt′
ce qui est vrai.
Si l’on applique ceci a ` la transform´ee de Fourier, on obtient : Z ∞ 4.10.1.2.3 Lin´ earit´ e. La transform´ee de Fourier est δ(x) eiux dx = 1 une transformation lin´eaire : il est facile de se convaincre −∞ que la transform´ee de Fourier d’une somme est la somme la transform´ee de Fourier d’une Dirac est une constante des transform´ees de Fourier et que la transform´ee de Fou(un, en l’occurence) : c’est le cas extrˆeme du paquet rier d’une fonction multipli´ee par une constante est le prod’ondes infiniment court : sa largeur spectrale est infinie, duit de la transform´ee de Fourier par cette constante, sa transform´ee de Fourier non seulement infiniment large Z Z ∞ Z ∞ ∞ mais constante. (f (x) + g(x)) eiux dx = f (x) eiux dx + g(x) eiux dx Inversement, −∞ −∞ −∞ Z ∞ 1 et Z ∞ Z ∞ C e−iux dx = C δ(x) 2π −∞ Cf (x) eiux dx = C f (x) eiux dx −∞ −∞ la transform´ee de Fourier d’une constante est la distribuur aussi pour les transform´ees intion de Dirac. On peut s’en convaincre en remarquant que, Cela est vrai bien sˆ tant que x est non nul, l’int´egrale s’effectue sur un nombre verses. Les propri´et´es suivantes sont tout aussi faciles `a infini de p´eriodes des cosinus et sinus de l’exponentielle d´emontrer : Si. . . alors. . . complexe, or, bien ´evidemment : f (x) est r´ e el ϕ(−u) = [ϕ(u)]∗ Z 2π Z 2π f (x) est imaginaire pur ϕ(−u) = −[ϕ(u)]∗ cos x dx = 0 sin x dx = f (x) est paire ϕ(u) est paire 0 0 f (x) est impaire ϕ(u) est impaire et le r´esultat final est nul. En revanche, quand x = 0, f (x) est r´eelle et paire ϕ(u) est r´eelle et paire l’exponentielle vaut 1 et le r´esultat est infini. Si donc, la f (x) est r´eelle et impaire ϕ(u) est imag. et impaire transform´ee de Fourier d’une constante donne une Dirac, f (x) est imag. et paire ϕ(u) est imag. et paire f (x) est imag. et impaire ϕ(u) est r´eelle et impaire 39 En principe. . . toutefois, la grosse difficult´ e vient de ce qu’on mesure le module de S(k) seulement et donc on perd la phase de la fonction complexe. 40 Ce n’est pas une fonction au sens math´ ematique, mais une distribution. La nuance sera explicit´ ee en math´ ematiques.
Par ailleurs, si ϕ(u) est la transform´ee de Fourier de f (x), celle de f (ax) est a1 ϕ( ua ) et celle de f (x − x0 ) s’´ecrit ϕ(u) eiux0 .
81
Physique num´erique, Philippe Depondt
4.10.1.2.4 Produit de convolution. Imaginons que l’on fasse une exp´erience pour mesurer une grandeur y en fonction d’une autre grandeur x, mais l’appareil de mesure n’est ´evidemment pas parfait : si on le r`egle sur une certaine valeur x = x0 , il « bave » un peu et le r´esultat obtenu sera une superposition de contributions issues de points voisins de x0 : Z ymesure (x0 ) = y(x) a(x0 − x) dx (4.26)
La transform´ee de Fourier d’un produit de convolution est le produit des transform´ees de Fourier. Le produit des transform´ees de Fourier est souvent beaucoup plus facile `a faire que le produit de convolution lui-mˆeme, et quand on verra l’efficacit´e des transform´ees de Fourier rapides num´eriques. . .
4.10.1.2.5 Quelques transform´ ees de Fourier « c´ el` ebres ». On a d´ej` a vu que la transform´ee de Fouo` u a(x) est la « fonction d’appareil » dont on peut esp´erer rier d’une fonction cr´eneau donnait un sinus cardinal et qu’elle a un maximum relativement marqu´e en x = 0. . . Le que la distribution de Dirac donnait une constante. cas arrive, par exemple, si l’on fait une mesure de disper-La gaussienne. La fonction de Gauss s’´ecrit : sion de la lumi`ere `a l’aide d’un prisme avec un faisceau de (x−x0 )2 C lumi`ere incident qui ne serait pas parfaitement fin (figure √ e− 2σ2 4.31). 2π
ν1 ν2
o` u x0 est l’emplacement du sommet et σ sa variance. 0.4 0.35 0.3 0.25
A
0.2 0.15 0.1 0.05
Fig. 4.31 – Au point A, on re¸coit une superposition de lumi`ere de deux fr´equences diff´erentes ν1 et ν2 parce que le faisceau incident n’est pas parfaitement fin. En fait, on re¸coit aussi toutes les fr´equences interm´ediaires ce qui fait que le r´esultat est la superposition de toutes ces contributions comme dans l’´equation (4.26).
0 −2
−1
0
1
2
3
4
Fig. 4.32 – Gaussienne pour C = 1, x0 = 1 et σ = 0.5. C’est une courbe (figure 4.32) qui ressemble beaucoup `a la lorentzienne si ce n’est que les « pieds » en sont moins large `a cause de l’exponentielle qui d´ecroˆıt plus vite que la fraction rationnelle. Si l’on en calcule la transform´ee de Fourier dans le cas le plus simple (x0 = 0, σ = 1), l’on obtient : Z ∞ Z ∞ x2 x2 1 1 √ e− 2 eiux dx = √ e− 2 cos ux dx ϕ(u) = π −∞ 2π −∞
L’´equation (4.26) est un produit de convolution de la fonction y par la fonction a. C’est un objet que l’on retrouve fr´equemment, dans les probl`emes de fonction d’appareil comme on l’a vu, mais aussi par exemple lorsqu’un syst`eme r´epond avec retard ` a une sollicitation et que son ´etat est le produit de convolution de la sollicitation aux instants pr´ec´edents par une « fonction m´emoire ». Le produit de convolution d’une fonction f par une foncparce que le sinus de la partie imaginaire de l’exponention g se note par un ast´erisque : tielle est impair et donc l’int´egrale correspondante nulle. Z ∞ En supposant que tous les th´eor`emes de convergence sou′ ′ ′ f (x ) g(x − x ) dx f ∗g = haitables s’appliquent ici, une d´erivation par rapport `a u −∞ et c’est une fonction de x. Par un changement de variable, sous le signe int´egral donne : Z ∞ il est facile de montrer que : x2 1 x e− 2 sin ux dx ϕ′ (u) = − √ g∗f =f ∗g 2π −∞ Si l’on calcule la transform´ee de Fourier du produit de En int´egrant cette expression par parties (par rapport `a convolution f ∗ g, on obtient : x), on a : Z ∞ Z ∞Z ∞ ′ ′ h Z ∞ i∞ [f ∗ g](x′ ) eiux dx′ = f (x)g(x′ − x) eiux dxdx′ 1 x2 x2 ϕ′ (u) = √ e− 2 sin ux e− 2 cos ux dx −u −∞ −∞ −∞ Z ∞Z ∞ −∞ 2π −∞ = f (x)g(X) eiu(X+x) dxdX soit : −∞ −∞ Z ∞ Z ∞ ϕ′ (u) = −uϕ(u) = f (x) eiux dx g(X) eiuX dX −∞ −∞ une ´equation diff´erentielle qui donne : soit le produit des transform´ees de Fourier. C’est un u2 ϕ(u) = K e− 2 th´eor`eme important :
82
Licence de physique L3 : Physique Fondamentale & PHYTEM,
o` u K est une constante d’int´egration qui, via l’expression de la transform´ee inverse, vaut 1. Donc : Z ∞ u2 x2 1 √ (4.27) e− 2 eiux dx = e− 2 2π −∞ Le r´esultat final est que la transform´ee de Fourier d’une gaussienne est une gaussienne. En posant u = 0 dans l’´equation (4.27), on obtient : Z ∞ √ x2 e− 2 dx = 2π −∞
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
ondes de choc
v
0000000000000000 1111111111111111 0000000000000000 1111111111111111 0000000000000000 1111111111111111 1111111111111111 0000000000000000 0000000000000000 1111111111111111 0000000000000000 1111111111111111
L l x
l’int´egrale de Gauss. Des changements de variables ad hoc permettent de t g´en´eraliser l’´equation (4.27) en une relation utile pour bien t1 t2 des calculs : r Z ∞ Fig. 4.33 – Mod´elisation des ondes de chocs produites π β2 −αx2 −βx (4.28) par un objet qui se d´eplace `a vitesse supersonique. L’axe e 4α e dx = α −∞ horizontal sup´erieur donne une allure de la pression en o` u α et β peuvent ˆetre complexes ` a condition que ℜe (α) > fonction de la position et l’axe inf´erieur en fonction du 0 : ces relations expliquent que de nombreux mod`eles temps pour un auditeur immobile au sol. th´eoriques partent de distributions gaussiennes alors qu’il n’y a pas forc´ement toujours d’hypoth`ese physique tr`es Ainsi, un objet qui se d´eplace dans l’air avec une vitesse convaincante pour le justifier41 . . . supersonique (un avion, par exemple) produit le fameux -L’oscillateur harmonique amorti. Le mouvement double « bang » : il s’agit de la succession de deux ondes d’un oscillateur harmonique amorti peut s’´ecrire : de choc que l’on peut ˆetre tent´e de mod´eliser de fa¸con simple. Il suffit de se rappeler les vagues d’´etrave d’un baz(t) = z0 e−iω0 t−αt si t > 0 teau (qui lui aussi se d´eplace plus vite que les ondes -les z(t) = z0 si t ≤ 0 vagues- qu’il produit : les bateaux sont pratiquement touo` u ω0 et α sont r´eels. La transform´ee de Fourier de ceci jours supersoniques !) pour consid´erer que l’objet traˆınera donne : avec lui une onde de surpression initi´ee `a l’avant et une Z 0 Z ∞ onde de d´epression initi´ee `a l’arri`ere (figure 4.33). L’audiz0 teur, immobile au sol, percevra la premi`ere `a l’instant t1 z0 eiωt dt + z0 ei(ω−ω0 )t−αt dt = z0 δ(ω) + α − i(ω − ω0 ) −∞ 0 et la seconde `a l’instant t2 avec Si l’on en prend le module au carr´e, c’est-` a-dire la densit´e L ∆t = t2 − t1 = spectrale, on obtient : v ! 2 o` u L est la longueur de l’avion et v sa vitesse. 1/α 2α + I(ω) = z02 δ 2 (ω) + δ(ω) 2 2 2 La dur´ee de chacune de ces impulsions peut s’´evaluer ω−ω 0 α + ω0 1+ α approximativement comme : soit une lorentzienne centr´ee en ω0 , la fr´equence de l’osℓ δt = cillateur, et de demi-largeur ` a mi-hauteur α, le coeffiv cient d’amortissement (` a condition d’ignorer les Dirac sans u ℓ est une dimension caract´eristique des extr´emit´es de grand int´erˆet et dues ` a la partie t < 0 lorsque l’oscillateur o` ne bouge pas). Comme l’oscillateur amorti est un objet as- l’objet (rayon de courbure de la pointe avant par exemple). sez r´epandu dans le monde des physiciens, cela montre que Pour simplifier, on consid´erera l’objet comme sym´etrique la lorentzienne est un objet math´ematique d’usage plutˆ ot et chaque onde de choc comme gaussienne : c’est un courant : c’est bien souvent le premier candidat plausible mod`ele, il est fort probable que le profil des variations de pression ne soit pas gaussien ; toutefois on peut esp´erer comme mod`ele `a ajuster ` a quelque exp´erience. . . que quelques propri´et´es physiques importantes puissent ˆ etre mises en ´evidence malgr´e cette simplification. La sur4.10.1.3 Un exemple : le bang supersonique. pression ressentie au sol et due aux ondes de choc s’´ecrit L’int´erˆet des transform´ees de Fourier par rapport aux alors : (t−t1 )2 (t−t2 )2 s´eries du mˆeme nom est de pouvoir traiter des fonctions p(t) = p0 e− 2δt2 − e− 2δt2 qui ne sont pas p´eriodiques. Bien sˆ ur, tout ce qui est d´etonation, percussion, etc., entre dans ce cas. Il s’agit de calculer maintenant la d´ependance en fr´equence 41 Un peu loin de la physique, les calculs boursiers se basent en g´ en´ eral sur des distributions « normales » ou gaussiennes des fluctuations des cours, tout simplement parce que l` a s’appliquent des th´ eories d’int´ egration bien ´ etablies. . . alors qu’on sait tr` es bien que dans bien des cas les cours de la bourse ne suivent pas des distributions de fluctuations gaussiennes : c’est un peu l’histoire du type qui cherche ses clefs sous le r´ everb` ere parce qu’au moins l` a, il voit quelque chose !
car l’oreille humaine per¸coit la hauteur des sons, autrement dit leur fr´equence : il s’agit donc de faire une transform´ee de Fourier en utilisant les relations ci-dessus. L’´equation (4.28) permet d’´ecrire de fa¸con g´en´erale, r Z ∞ Z ∞ 2 2 t−t π − ω2 τ 2 −( τt ) iωt −( τ 0 ) iωt iωt0 iωt0 e dt = e e dt = e e 4 e e 2 τ −∞ −∞
83
Physique num´erique, Philippe Depondt
et, donc, la transform´ee de Fourier de p(t) s’´ecrit facileSi l’on s’int´eresse maintenant `a une h´elice supersoment42 : nique45 pour laquelle L = 0, 2m et ℓ = 1mm, on obtient ∆ν ∼ 35 000Hz et ν0 ∼ 850Hz. Z ∞ (t−t )2 (t−t )2 − 2δt1 − 2δt2 iωt Les choses deviennent alors qualitativement assez p˜(ω) = p0 e −e e dt −∞ diff´erentes : l’enveloppe du spectre s’´etend largement audel` a de la limite perceptible, mais la fr´equence fondar r π π ω2 2δt2 ω2 2δt2 mentale (850Hz) est parfaitement audible puisqu’elle est = p0 eiωt1 e− 4 − eiωt2 e− 4 2 2 proche du La situ´e une octave au-dessus du diapason 2δt 2δt (880Hz). Ainsi, on percevra un son dont la fr´equence est r π iωt1 − ω2 δt2 relativement bien d´efinie et toutes ses harmoniques. On 2 1 − e−iω∆t = p0 e e 2 peut ´ e videmment ajouter `a cela le fait qu’une h´elice tourne δt et donc ce signal est r´ep´et´e `a chaque passage d’une pale La densit´e spectrale correspondante s’´ecrit : et le son sera donc per¸cu comme continu (la fr´equence de passage des pales est de l’ordre de 100Hz). 2 2 π I(ω) = p˜(ω)˜ p∗ (ω) = p20 2 e−ω δt (1 − cos ω∆t) (4.29) Ce mod`ele est bien sˆ ur simpliste et les valeurs δt num´eriques sont `a prendre comme des ordres grandeur, tout au plus, mais il montre assez bien la puissance d’une 2 analyse en transform´ee de Fourier d’un ph´enom`ene somme ν toute assez compliqu´e. 0
1.5
4.10.1.4
enveloppe gaussienne ∆ν
1
Il peut arriver que l’on ait int´erˆet `a r´esoudre un probl`eme en passant par les transform´ees de Fourier plutˆ ot que directement. Ainsi, l’´equation de Poisson de l’´electrostatique s’´ecrit :
0.5
0
Un deuxi` eme exemple : r´ esolution de l’´ equation de Poisson.
0
5
10
15
20
25
freq
∇2 V =
∂2V ∂2V ∂2V ρ(x, y, z) + + =− ∂x2 ∂y 2 ∂z 2 ε0
Fig. 4.34 – Densit´e spectrale du double bang, eq.(4.29). En o` u ρ est une distribution de charges et V (x, y, z) le potennoir, l’enveloppe gaussienne, en bleu la courbe compl`ete. tiel ´electrostatique associ´e. En g´en´eral, on est confront´e Les unit´es sont arbitraires. au probl`eme qui consiste `a calculer V connaissant ρ. On peut utiliser des m´ethodes similaires `a celle d´ecrite au paLa figure 4.34 montre l’allure de cette courbe. L’enve- ragraphe 4.5.1, mais celles-ci ont souvent l’inconv´enient 1 loppe gaussienne a une largeur en fr´equence ∆ω = √ , d’ˆetre assez consommatrices de ressources de calcul, au2δt del` a parfois de celles dont on dispose. On peut ´egalement 1 √ . La pulsation ω0 qui tenter l’int´egration directe : soit en fr´equence ∆ν = 2π 2δt correspond au premier maximum de la partie p´eriodique 1 × V (x, y, z) = π 4πε0 (cos ω∆t = −1 ⇒ ω∆t = π) est donn´ee par ω0 = ou ∆t Z ∞Z ∞Z ∞ 1 ρ(x′ , y ′ , z ′ ) la fr´equence correspondante ν0 = . p dx′ dy ′ dz ′ 2∆t ′ )2 + (y − y ′ )2 + (z − z ′ )2 (x − x −∞ −∞ −∞ Que signifient ces r´esultats ? Admettons qu’il s’agisse d’un avion assez gros (Concorde peut-ˆetre) avec L = 100m Si, toutefois, on discr´etise l’espace par n points dans et ℓ = 0, 1m qui se d´eplace ` a peu pr`es ` a la vitesse du son, chaque direction, V (x, y, z) sera repr´esent´e par n3 valeurs soit v = 300m/s (ce sont des ordres de grandeurs, sans qu’il faudra calculer en sommant sur n3 valeurs de ρ, soit plus). Cela donne ∆t = 0, 3s, ν0 ∼ 1, 7Hz et ∆ν ∼ 380Hz. n6 termes. . . le processus risque de se r´ev´eler laborieux si La gamme de fr´equences auxquelles l’oreille humaine43 est n est grand ! sensible s’´etend de 20Hz ` a 20 000Hz, le La du diapason se Une autre fa¸con de proc´edre consiste `a utiliser une triple situant `a 440Hz. transform´ee de Fourier, ainsi, V (x, y, z) est la transform´ee L’intervalle de temps ∆t est assez long pour que les de Fourier inverse de V˜ (kx , ky , kz ) : deux chocs soient per¸cus s´epar´ement. La largeur totale du 1 spectre pr´esentant une intensit´e audible s’´etend en gros V (x, y, z) = × 3 (2π) jusque vers 500Hz et l’´ecart entre les harmoniques est tr`es faible (1,7Hz) : on percevra donc deux d´etonations Z ∞ Z ∞ Z ∞ V˜ (kx , ky , kz ) e−i(kx x+ky y+kz z) dkx dky dkz s´epar´ees assez graves dont le spectre est essentiellement un −∞ −∞ −∞ 44 continuum qui va du seuil inf´erieur de 20Hz ` a quelques 45 pendant la deuxi` eme guerre mondiale, alors que les moteurs a ` centaines de Hertz. 42 C’est
le gros avantage des gaussiennes ! 43 jeune et en bonne sant´ e. . . 44 les fr´ equences plus basses que 20Hz sont ´ egalement per¸cues par le corps humain, mais par l’interm´ ediaire de la cage thoracique et non les oreilles.
r´ eaction offraient des performances tr` es m´ ediocres au prix d’une consommation de carburant gargantuesque et d’une fiabilit´e catastrophique, l’option de fabriquer des h´ elices supersoniques pour gagner en vitesse ne paraissait pas absurde. Les ing´ enieurs s’aper¸curent toutefois assez rapidement qu’ils avaient fabriqu´ e l` a un dispositif tr` es efficace pour, disaient-ils, « transformer de l’´ energie en bruit » !
84
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Comme V˜ ne d´epend pas de x, y et z et en supposant 4.10.2 La transform´ ee de Fourier discr` ete. que l’on puisse d´eriver sous le signe somme, une d´eriv´ee Il existe des m´ethodes num´eriques tr`es efficaces pour partielle s’´ecrit : calculer des transform´ees de Fourier ; elle reposent toutes ∂2V 1 cependant sur une mˆeme approximation : = × ∂x2 (2π)3 Z ∞ n−1 X ZZZ f (xℓ ) eiuxℓ δx f (x) eiux dx ∼ 2 −i(k x+k y+k z) x y z −∞ V˜ (kx , ky , kz ) × −kx e dkx dky dkz ℓ=0 avec ´evidemment des expressions similaires pour y et z. On d´efinit ρ˜ de la mˆeme fa¸con : ρ(x, y, z) = 1 (2π)3
ZZZ
ρ˜(kx , ky , kz ) e−i(kx x+ky y+kz z) dkx dky dkz
En appliquant l’´equation de Poisson, on obtient alors : ZZZ V˜ (kx , ky , kz ) k 2 e−i(kx x+ky y+kz z) dkx dky dkz = 1 ε0
ZZZ
avec :
xℓ = xmin + ℓ δx et
xmax − xmin n ainsi, x0 = xmin et xn−1 = xmax − δx , on est dans la mˆeme situation que celle de l’int´egration par la m´ethode des rectangles. On remplace donc l’int´egrale de −∞ `a ∞ par une s´erie discr`ete sur un ´echantillonnage de points pris sur un intervalle born´e. En fait pour des raisons de g´en´eralit´e des programmes, on se borne `a calculer la s´erie : δx =
ρ˜(kx , ky , kz ) e−i(kx x+ky y+kz z) dkx dky dkz
Fk =
n−1 X
fℓ e
2πikℓ n
(4.30)
ℓ=0
o` u k 2 = kx2 + ky2 + kz2 . Si on choisit V˜ tel que :
` l’utilisateur de faire les o` u fℓ = f (xℓ ) et Fk = ϕ(uk ). A adaptations n´ecessaires ! ρ˜(kx , ky , kz ) L’expression (4.30) est celle de la transform´ee de FouV˜ (kx , ky , kz ) = ε0 k 2 rier discr`ete ou Discrete Fourier Transform ou encore DFT. La transform´ee de Fourier discr`ete inverse s’´ecrit alors la relation de Poisson est v´erifi´ee. ´evidemment : Cette m´ethode est donc de calculer la transform´ee de n−1 X 2πikℓ Fourier de ρ(x, y, z) puis la transform´ee de Fourier inFk e− n fℓ = ρ˜(kx , ky , kz ) k=0 pour obtenir V (x, y, z). Le calcul du verse de k2 ~ champ E(x, y, z) est ais´e, car on obtient facilement que : 4.10.2.1 Cons´ equences. ~ V ~ = −grad E donne en transform´ee de Fourier : ˜x (kx , ky , kz ) = E ˜y (kx , ky , kz ) = E E˜z (kx , ky , kz ) =
ikx V˜ (kx , ky , kz ) iky V˜ (kx , ky , kz ) ikz V˜ (kx , ky , kz )
ce qui est ´evidemment tr`es ais´e ` a calculer. On risque bien sˆ ur de rencontrer quelques difficult´es quand k = 0, mais il suffit de noter que : ZZZ V˜ (k = 0) = V (x, y, z) dx dy dz
L’approximation ci-dessus n’est pas anodine : il faut donc faire un peu attention lorsqu’on utilise ces outils, pourtant extrˆemement courants et ind´eniablement tr`es utiles. 4.10.2.1.1 P´ eriodicit´ e. La premi`ere remarque que l’on puisse faire est que l’on remplace en fait une transform´ee de Fourier par une s´erie de Fourier : autrement dit, on postule que la fonction consid´er´ee est p´eriodique. 1 0.9 0.8 0.7 0.6 0.5
pour voir que le choix de la valeur de V˜ (k = 0) n’est qu’un 0.4 choix de la constante arbitraire du potentiel : V˜ (k = 0) = 0.3 0 peut ˆetre une bonne option. 0.2 La m´ethode peut paraˆıtre assez lourde, mais en fait, la grande rapidit´e des transform´ees de Fourier num´eriques 0.1 0 permet de r´esoudre ainsi bien des probl`emes qui n’au0 1 2 3 4 5 6 7 8 9 raient pas de solution sinon. Il faut cependant maintenant se pr´eoccuper de ce que font r´eellement les transform´ees Fig. 4.35 – Une gaussienne « p´eriodique » et mal coup´ee ! de Fourier num´eriques propos´ees dans les biblioth`eques de En principe, ce n’est pas bien grave parce qu’on peut calcul car il s’agit bien sˆ ur d’approximations et cela peut choisir une tr`es grande p´eriode, « infinie » en pratique par avoir des cons´equences, parfois impr´evues.
85
Physique num´erique, Philippe Depondt
rapport aux dimensions ce que l’on veut ´etudier : c’est d’ailleurs g´en´eralement ce que l’on fait. Toutefois, il y a parfois des choix maladroits : par exemple, si l’on veut calculer la transform´ee de Fourier d’une gaussienne centr´ee en z´ero, on sait que la partie imaginaire doit ˆetre nulle puisque la gaussienne est paire ; or, si par malheur, on a choisit pour faire le calcul, l’intervalle [0, X], X > 0 et grand par rapport ` a la variance, on est en train de couper en deux la gaussienne ` a son maximum en x = 0 et `a l’autre extr´emit´e de l’intervalle, la valeur de la gaussienne sera presque nulle (figure 4.35). Mais, en x = X, subitement `a cause de la p´eriodicit´e, la fonction retrouvera une valeur non n´egligeable : une variation rapide qui donnera des contributions de haute fr´equence. De plus, notre fonction n’est plus paire : la partie imaginaire n’a plus de raison d’ˆetre nulle ! Un intervalle [−X, X] serait plus judicieux. . . On peut certes tenter d’ˆetre habile, mais alors, il faut ˆetre sˆ ur de soi : on peut garder l’intervalle [0, X] (et donc diviser par deux le nombre de points n´ecessaires), et forcer la partie imaginaire ` a z´ero. On perdra alors toutefois une possibilit´e de d´etecter des erreurs !
Ainsi, la longueur de l’intervalle dans l’espace de la transform´ee de Fourier est l’inverse du pas dans l’espace direct. Ces deux th´eor`emes qui ont l’air, il est vrai, triviaux, sont tr`es importants car c’est ainsi que l’on choisit l’intervalle d’int´egration en fonction, par exemple, de la r´esolution fr´equentielle voulue ou de l’intervalle de fr´equences d´esir´e. Ainsi, si l’on s’int´eresse `a un syst`eme d’oscillateurs pour lesquels les ph´enom`enes int´eressants se produisent aux environs de 10Hz, on peut vouloir un intervalle de fr´equences qui va de 0 `a 20Hz : cela signifie que le pas de temps doit ˆetre obligatoirement de l’ordre de 1/20=0,05s (ici, l’on raisonne en temps-fr´equence, donc le facteur 2π disparaˆıt). De plus, si l’on veut pouvoir distinguer des ph´enom`enes dont les fr´equences diff`erent de 0,1Hz, cela entraˆıne que la longueur de l’intervalle de temps est au minimum de 1/0,1=10s. Donc, n, le nombre de pas est ´egal, au minimum `a 10s/0,05s = 200. Quitte `a se r´ep´eter, ces relations tr`es simples entre pas de temps et fr´equence sont fondamentales d`es que l’on faire un usage pratique de cet outil, en particulier, quand (comme exp´erimentateur, par exemple) on a affaire au monde r´eel 4.10.2.1.2 Pas de calcul. La discr´etisation de qui a pour d´efaut principal que l’on ne peut pas consid´erer ¯ = l’´equation (4.30) a aussi des cons´equences. Pour faire la toutes les constantes comme valant 1 (m = e = c = h k = 1) ! B correspondance entre l’int´egrale et la somme discr`ete, on doit faire l’´egalit´e : 4.10.2.1.3 Une « fausse » sym´ etrie. Calculons le 2πikℓ terme Fn−k de la DFT, c’est-`a-dire le sym´etrique de Fk eiuk xℓ = e n par rapport au milieu de l’intervalle : sachant que : n−1 n−1 X X xℓ = xmin + ℓ δx 2πiℓ(n−k) 2πiℓk n Fn−k = fℓ e = fℓ e2πiℓ e− n et en posant : ℓ=0 ℓ=0 uk = umin + k δu or e2πiℓ = 1, et donc : soit : n−1 X 2πiℓk 2πikℓ Fn−k = fℓ e− n = F−k ei(umin +k δu )(xmin +ℓδx ) = e n ei(umin xmin +umin ℓδx +xmin k δu ) eikℓδx δu
=
e
2πikℓ n
ℓ=0
ce qui est coh´erent avec la p´eriodicit´e mais si la suite fℓ Une chose au moins paraˆıt claire : c¸a ne marche pas ! On est r´eelle, ce qui arrive tr`es souvent, on obtient : doit donc supprimer xmin et umin . Ainsi, la DFT postule que l’intervalle commence en z´ero. Fn−k = Fk∗ Il faut donc utiliser la propri´et´e que la transform´ee de Fourier de f (x − x0 ) est ϕ(u) eiux0 : si l’on ne s’int´eresse et pour le spectre, pas a` la phase, c’est sans importance, mais dans le cas ∗ In−k = Fn−k Fn−k = Ik contraire, il faut y penser. La correspondance entre int´egrale et somme discr`ete se seule la premi`ere moiti´e des points est utile : c’est `a ne ram`ene donc maintenant ` a: pas oublier lorsque l’on voudra d´eterminer l’intervalle de 2πikℓ ikℓδx δu d´efinition de f . . . n =e e soit : δu =
2π n δx
or n δx est la longueur de l’intervalle choisi. Ainsi, la r´esolution, c’est-` a-dire l’intervalle de fr´equence le plus petit que l’on puisse atteindre, de la transform´ee de Fourier est (` a 2π pr`es) l’inverse de la longueur de l’intervalle. Inversement n δu est la longueur de l’intervalle dans l’espace de la tranform´ee de Fourier et l’on obtient : n δu =
2π δx
4.10.2.2
Fast fourier Transform = FFT.
Quand on veut calculer une transform´ee de Fourier num´erique, il y a une chose `a ne pas faire : c’est programmer directement l’´equation (4.30) ! Cela revient `a calculer un grand nombre d’exponentielles complexes inutilement. Certes, quand le nombre de points dans l’´echantillonnage est r´eduit, il peut parfois ˆetre plus rapide de programmer rapidement une telle « Slow Fourier Transform » que de passer du temps `a essayer de comprendre les documentations des biblioth`eques de programmes, h´elas, pas toujours limpides. Cependant, la transform´ee de Fourier est d’un usage tellement courant en physique que, g´en´eralement,
86
Licence de physique L3 : Physique Fondamentale & PHYTEM,
on a d´ej` a utilis´e une FFT de biblioth`eque et que l’on a d´ej` a d´echiffr´e la documentation correspondante, et donc il devient aussi ais´e de l’utiliser que de reprogrammer soimˆeme quelque chose, si simple cela soit-il ! Toutefois, l’argument massif est que l’algorithme FFT est tr` es efficace d`es que le nombre de points consid´er´e devient important, et l’on a vu que des questions d’´echantillonnage de fr´equences pouvaient imposer de travailler avec beaucoup de points. Une premi`ere remarque est que l’´equation (4.30) peut se re´ecrire : Fk =
n−1 X
si : wn = e
D´ecoupons la somme ci-dessus en deux moiti´es, l’une comprenant les termes pairs et l’autre les termes impairs : (n−1)/2
Fk
=
ℓ=0
(n−1)/2
=
X ℓ=0
(n−1)/2
f2ℓ wn2kℓ +
X
f2ℓ+1 wnk(2ℓ+1)
ℓ=1
(n−1)/2
kℓ + wnk f2ℓ wn/2
X
kℓ f2ℓ+1 wn/2
ℓ=1
On peut rediviser l’intervalle en deux et ainsi de suite : `a terme, l’on n’aura plus ` a calculer que des termes du type w2kp . Reste `a faire un tri pour rep´erer quels termes fℓ interviennent dans quelle somme. . . toujours est-il qu’il s’agit d’un processus dont le coˆ ut est proportionnel a` n ln2 n op´erations au lieu de n2 . La diff´erence peut ˆetre ´enorme : si par exemple n = 210 = 1024, ce qui n’a rien d’exeptionnel, alors n2 = 1 048 576 mais, n ln2 n = 1024 × 10 = 10240 : un gain d’un facteur 100 ! Certes, il y a la restriction que n doit ˆetre une puissance de deux, et un bon nombre de sous-programmes courants l’exige, mais, 1o il est bien rare que l’on ne puisse pas en tenir compte a priori dans la pr´eparation des donn´ees initiales et 2o on peut toujours compl´eter si n´ecessaire l’intervalle avec des z´eros ! Il existe des programmes qui, au lieu de d´ecouper l’intervalle en moiti´es, commencent par faire une d´ecomposition de n en produit de nombres premiers, puis effectuent les d´ecoupages ` a partir de l` a : cela permet d’utiliser autre chose que des puissances de deux, mais il est clair que si n lui-mˆeme est un nombre premier, l’efficacit´e en sera plus que douteuse. . .
4.10.3
0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0
2
4
6
8
10
2πi n
ℓ=0
X
1
0
fℓ wnkℓ ,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
0 Fig. 4.36 – La fonction 12 (1 − tanh ν−ν γ ) avec ν0 = 5 et γ = 1 que l’on peut utiliser pour faire un filtre passe-bas.
La m´ethode, si elle est souvent employ´ee avec succ´es, peut ˆetre consid´er´ee comme un peu brutale. Une autre possibilit´e est alors de multiplier la transform´ee de Fourier par un fonction qui vaille 1 `a basse fr´equence et z´ero `a haute. Le choix est au goˆ ut de chacun : un bon candidat 0 est cependant 12 (1 − tanh ν−ν u ν0 est le seuil et γ la γ ) o` largeur du domaine o` u la fonction de filtrage d´ecroˆıt (figure 4.36)46 . La remarque faite pr´ec´edemment (§ 4.8.5) selon laquelle il vaut mieux faire l’ajustement d’un mod`ele sur les donn´ees bruit´ees puis ´etudier les ´ecarts qu’essayer « d’embellir » les exp´eriences en enlevant le bruit reste pertinente. Le filtrage propos´e ici est toutefois sans doute meilleur que la m´ethode propos´ee pr´ec´edemment car on peut contrˆoler pr´ecis´ement ce que l’on supprime, bien mieux qu’avant en tous cas. Il faut reconnaˆıtre qu’il est parfois utile, lors de phases interm´ediaires, lors du r´eglage d’une exp´erience, ou bien avant que l’on sache r´eellement o` u l’on en est au point de vue mod`ele, de nettoyer ainsi les donn´ees exp´erimentales afin de d´eterminer « s’il y a quelque chose `a voir ». . . La r`egle g´en´erale est toutefois que ces m´ethodes restent en principe `a ´eviter quand on en arrive `a l’´etape ultime de publication : le minimum est de le signaler clairement quand on le fait.
4.11
Les m´ ethodes Carlo.
de
Monte-
On regroupe sous le nom de m´ethodes de « MonteFiltrage de donn´ ees exp´ erimenCarlo » (` a cause du c´el`ebre casino) les m´ethodes qui retales. posent sur des tirages au sort : vaste monde dont nous
Dans le paragraphe 4.8.5 d´ecrivant une m´ethode de lissage de donn´ees exp´erimentales, la conclusion ´etait que c’´etait sans doute une m´ethode assez peu recommendable. Une autre approche est de faire un filtre passe-bas num´erique. Il s’agit de supprimer ou, du moins, de r´eduire le bruit consid´er´e comme un signal non-corr´el´e d’un point `a un autre : autrement dit, il s’agit de retirer ou de r´eduire une contribution de haute fr´equence. Ainsi, une premi`ere id´ee est de faire une transform´ee de Fourier des donn´ees exp´erimentales, puis fixer les termes de haute fr´equence `a z´ero, puis faire une transform´ee de Fourier inverse : on aura donc ainsi purement et simplement supprim´e les hautes fr´equences !
n’explorerons ici que quelques r´egions frontali`eres.
4.11.1
Processus stochastiques et chaˆınes de Markov.
On appelle « stochastique » (du grec stokhastˆes, devin) un processus dont le r´esultat est soumis au hasard : quand on lance un d´e, on ne peut pas - en principe - pr´edire le nombre qui en sortira. En revanche, le mouvement d’un satellite autour de la terre n’est pas stochastique, puisque, 46 Il est vrai que, parfois, les m´ ethodes num´ eriques font penser a ` la recette de la pˆ ate feuillet´ ee vue par Fernand Raynaud ; en particulier, le choix de γ, ici, paraˆıt ˆ etre de l’ordre de la fameuse « chaleur patissi` ere » indispensable a ` la r´ eussite de ladite recette !
87
Physique num´erique, Philippe Depondt
connaissant sa position et sa vitesse ` a un instant donn´e, on peut pr´edire sa trajectoire dans le futur. Une chaˆıne de Markov est une s´equence d’´ev´enements soumis au hasard comme ci-dessus, mais sans m´emoire : le d´e ne se rappelle pas le nombre sorti lors du jet pr´ec´edent, ce n’est pas parce que j’ai obtenu un six au coup pr´ec´edent que je peux dire quoi que ce soit sur le r´esultat du coup suivant (si le d´e se rappelait le six et interdisait par exemple d’obtenir deux fois de suite le mˆeme r´esultat, le processus serait stochastique mais non-Markovien). En physique, il y a bien sˆ ur des processus impr´evisibles (les trajectoires individuelles de chaque atome d’un gaz en thermodynamique statistique, par exemple) mais on peut aussi avoir int´erˆet `a utiliser des m´ethodes de tirage au sort pour calculer des grandeurs qui n’ont rien d’al´eatoire.
4.11.2
de rayon a2 vaut π4 , on peut lancer des fl`eches, cailloux ou tout autre projectile et compter le nombre de fois o` u le projectile tombe dans le cercle et le diviser par le nombre total de tirs. Cela donne des estimations successives de π 4 (figure 4.37). Evidemment, plus les tirs sont nombreux, meilleure est l’estimation. Mˆeme si l’on peut imaginer d’autres m´ethodes plus ´economiques pour d´eterminer π, ces remarques montrent que l’on peut tenter de r´esoudre des probl`emes qui ne comportent a priori aucun caract`ere al´eatoire `a l’aide de m´ethodes probabilistes. On notera que pour que les th´eor`emes probabilistes, comme la limite centrale, puissent s’appliquer, il faut un grand nombre de tirages au sort, comme dans la figure 4.37, et que donc la capacit´e des ordinateurs `a r´ep´eter de nombreuses fois la mˆeme op´eration sans se lasser n’est pas `a n´egliger.
Les vicissitudes de π.
Le chapitre « Nombres al´eatoires » des Numerical Recipes (ref. [3]) commence par la remarque (p. 266) : « Il peut paraˆıtre pervers d’utiliser un ordinateur, la plus pr´ecise et la plus d´eterministe de toutes les machines con¸cues par l’esprit humain pour produire des nombres “al´eatoires”. » En effet, mais nous nous garderons d’affirmer que la perversit´e n’a jamais fait reculer un math´ematicien appliqu´e. . . Toujours est-il que bien avant l’invention des ordinateurs, au XVIIIe si`ecle, Georges Louis Leclerc comte de Buffon, un individu par ailleurs honorablement connu, calcula que, si on lance au hasard une aiguille de longueur ℓ sur un r´eseau de droites parall`eles distantes d’une distance a, la probabilit´e que l’aiguille rencontre une droite s’´ecrit : 2ℓ aπ une m´ethode probabiliste de d´etermination exp´erimentale du nombre π. En effet, plusieurs tentatives de ce genre eurent lieu au XIXe si`ecle malgr´e le caract`ere quelque peu fastidieux de l’op´eration consistant ` a lancer un grand nombre de fois une aiguille et ` a compter le nombre de fois qu’elle recontre une droite47 . p=
4 3.8 3.6 3.4 3.2 3
4.11.3
La production « al´ eatoires ».
de
nombres
Mais comment une machine d´eterministe comme un ordinateur peut-elle produire des nombres al´eatoires ? En fait, un ordinateur est incapable de produire des nombres al´eatoires et donc il n’en produit pas. . . Un ordinateur produit des s´equences de nombres arbitraires dont on esp`ere qu’ils sont non-corr´el´es au probl`eme que l’on souhaite r´esoudre. C’est que l’on appelle souvent des « nombres pseudo-al´eatoires ». Pour illustrer ceci, imaginons qu’un touriste un peu obsessionnel d´ecide de visiter les mus´ees parisiens par ordre alphab´etique : c’est un ordre parfaitement d´etermin´e, et si l’on recommence un peu plus tard, en appliquant la mˆeme r`egle, l’ordre sera strictement le mˆeme48 . Cependant, si l’on s’int´eresse aux th´ematiques de ces mus´ees, on tombera sur une s´equence du type : Mus´ee de l’Arc de Triomphe, Mus´ee des Arm´ees, Mus´ees des Arts Africains et Oc´eaniens, etc. : une s´equence compl`etement arbitraire et qui peut ˆetre consid´er´ee pratiquement comme. . . al´eatoire car les arts africains et oc´eaniens n’ont pas grand-chose `a voir avec les arm´ees49. Bien sˆ ur, l’ordre alphab´etique introduit des corr´elations parasites : tous les Mus´ees des Arts xxx se suivent ! Ce sont des choses dont il faudra se m´efier aussi dans l’usage de g´en´erateurs de nombres « al´eatoires » des ordinateurs. Comment cela fonctionne-t-il ? Un g´en´erateur de nombres pseudo-al´eatoires produit une s´equence de nombres entiers I1 , I2 , I3 ,. . ., compris entre 0 et m − 1 par la r´eccurence : Ij+1 = aIj + b, modulo m
2.8
o` u m est un nombre entier « grand » et a et b des entiers positifs appel´es « multiplicateur » et « incr´ement ». A priori, cette s´equence se r´ep`ete puisqu’il n’y a que m Fig. 4.37 – Calcul du nombre π par tirage au sort. En abs- valeurs possibles pour les Ij , ainsi, si l’on a plus que m cisse le nombre de tirages en ´echelle logarithmique. En or- tirages, on doit retomber sur les mˆemes nombres : c’est donn´ee, les estimations de π correspondantes. Le r´esultat un syst`eme p´eriodique. On note qu’il faut initialiser la obtenu pour un million de tirages est 3,1428721 s´equence avec une « graine » I0 50 . Finalement, si l’on fait 2.6
1
10
100
1000
10000
100000
1e+06
Plus simplement encore, on peut remarquer que comme le rapport des surfaces d’un carr´e de cot´e a et d’un cercle 47 Ainsi, l’exp´ erience faite en 1901 par Lazzerini, en jetant une aiguille 3407 fois, donna : π = 3,1415929 (au lieu de 3,14159265).
48 A ` condition, ´ evidemment, que la liste des mus´ ees n’ait pas chang´ e entre-temps. 49 Sauf, bien sˆ ur, si l’on se rappelle qu’il s’agit de l’ancien Mus´ ee des Colonies, h´ eritage des conquˆ etes militaires du XIXe si` ecle. 50 seed en anglais.
88
Licence de physique L3 : Physique Fondamentale & PHYTEM, I
le rapport mj on obtiendra une s´equence de nombres r´eels dans l’intervalle [0, 1[. On a clairement int´erˆet ` a choisir m aussi grand que possible, soit, compte tenu de la repr´esentation des nombres entiers sur quatre octets : m = 231 − 1 = 2 147 483 647. Le choix de a et b (par exemple a = 75 = 16 807 et b = 0) fait l’objet de d´ebats infinis et d´epend parfois de la machine utilis´ee. Dans la grande majorit´e des cas, on a int´erˆet `a se servir du g´en´erateur fourni avec l’ordinateur que l’on utilise plutˆ ot que de tenter d’´ecrire quelque chose soi-mˆeme : il se trouve que le langage fortran fourni une fonction intrins`eque rand()51 qui en g´en´eral donne satisfaction. Si la variable x est d´eclar´ee en real, l’instruction x = rand() donnera un nombre pseudo-al´eatoire. Si l’on fait plusieurs tirages, on obtiendra une s´equence de nombres compris entre 0 et 1 avec une distribution uniforme (figure 4.38). Il existe aussi le sous-programme random number : call random number(x) remplira le tableau x de nombres pseudo-al´eatoires.
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
i est un entier permet de le faire : il suffit d’une instruction call srand(i) avant le premier appel `a rand(). Quelle valeur donner `a i ? Soit l’on veut en garder la maˆıtrise, alors, il faut pr´evoir de lire au clavier la valeur de i, soit, on peut choisir la fonction time qui donne l’heure sous forme d’un nombre entier : call srand(time()) donnera. . . n’importe quoi, ce qui est ce qu’on voulait !
?
60
1
50
0.9
40
0.8
30
0.7
20
0.6
10
0.5
0
0.4
−10
0.3
−20
0.2
−30
seed=1 seed=2 seed=3
0
500
1000
1500
2000
2500
3000
3500
4000
4500
5000
0.1 0 0 1.03
10
20
30
40
50
60
70
80
90
100
Fig. 4.39 – Marche au hasard ou drunkard’s walk (marche de l’ivrogne) avec trois graines diff´erentes.
1
La figure 4.39 montre une marche au hasard : un ivrogne a une probabilit´e ´egale de faire un pas `a gauche ou `a droite de longueur quelconque, en-dessous d’une certaine valeur (li´ee `a la longueur des jambes dudit ivrogne). Ainsi, `a chaque pas, on doit ajouter `a la position actuelle un nombre (pseudo)al´eatoire compris entre −0, 5 et 0, 5 (c’est`a-dire x = x + rand()-0.5). Trois graines diff´erentes donnent trois trajectoires diff´erentes. Ce type de simulation peut concerner, outre les errances53 ´ethyliques, le mouvement brownien ou le cours d’une action en bourse ! Il faut donc retenir de tout ceci que l’ordinateur ne produit pas de nombres al´eatoires et qu’il est bon de se m´efier un peu : faire le mˆeme calcul avec plusieurs graines diff´erentes, essayer plusieurs g´en´erateurs diff´erents si possible, voire utiliser des machines d’architectures diff´erentes. . . Certains algorithmes sont tr`es sensibles aux imperfections des s´equences de nombres pseudo-al´eatoires, d’autres beaucoup moins : cet avertissement ne se veut pas dissuasif, comme les pr´ec´edents, il vise `a rappeler au minimum de prudence !
1.02 1.01 1 0.99 0.98 0.97
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
Fig. 4.38 – En haut, une s´equence de 100 nombres pseudoal´eatoires et en bas, distribution des valeurs fournies par la mˆeme fonction intrins`eque rand() apr`es 1 000 000 de tirages : on obtient une distribution uniforme.
Le probl`eme de la graine est un peu plus d´elicat : si on ne la fixe pas, la s´equence de nombre produits par rand() sera la mˆeme d’un usage ` a l’autre : si on arrˆete l’ex´ecution du programme, l’ordinateur « oublie » o` u il en ´etait et si l’on relance l’ex´ecution, il repart au premier point et refait la mˆeme s´equence. Dans certains cas, cela n’a au- 4.11.4 Obtenir une distribution autre cune esp`ece d’importance, mais si, par exemple, on veut qu’uniforme. comparer des moyennes effectu´ees sur des ´echantillonnages Dans le paragraphe pr´ec´edent, il a ´et´e montr´e comdiff´erents, alors ´evidemment, il vaut mieux pouvoir changer d’´echantillonnage. Le sous-programme srand(i)52 o` u ment obtenir une s´equence de nombres pseudo-al´eatoires avec une distribution uniforme entre 0 et un, c’est `a dire 51 pour 52 le
random. s de srand est pour seed, ´ evidemment. . .
53 sinon
les errements. . .
89
Physique num´erique, Philippe Depondt
ce qui respecte la condition de normalisation : Z ∞ p0 (x) dx = 1 −∞
0.45 Generated distribution Normal distribution
0.4 0.35 0.3 0.25 p(x)
des nombres qui ont une probabilit´e p0 (x)dx d’apparaˆıtre entre x et x + dx qui s’´ecrit : dx si 0 ≤ x < 1 p0 (x)dx = 0 sinon
0.2 0.15 0.1
0.05 Mais si l’on veut autre chose qu’une telle distribution uni0 forme ? Soit une fonction y(x). On produit des nombres qui −4 −2 0 2 4 x ont une probabilit´e p0 (x)dx de tomber entre x et x + dx. Si on leur fait subir la transformation y(x), on obtient une deuxi`eme s´equence de nombres dont la probabilit´e de tom- Fig. 4.40 – Comparaison d’une distribution obtenue par ber entre y et y + dy est p(y)dy, mais c’est aussi celle de l’algorithme donn´e 2dans le texte et d’une distribution x 1 tomber entre x et x + dx pour la premi`ere s´equence, soit : gaussienne √ e− 2 . Le calcul a ´et´e fait avec 20000 ti2π |p(y)dy| = |p0 (x)dx| rages au sort.
Comme une densit´e de probabilit´e est positive, cela donne, dx p(y) = p0 (x) dy
Sachant que p0 (x) vaut un, le probl`eme est donc connaissant p(y), la distribution voulue, trouver la fonction y telle que : dx p(y) = dy donc, y(x) est la fonction r´eciproque d’une primitive de p(y). Par exemple, si l’on voulait p(y) = e−y , alors, y(x) = − ln x ; ou encore une distribution lorentzienne p(y) = 1 1 , cela donne y = tan πx (exercice : le v´erifier). π 1 + y2 Malheureusement, ce n’est pas toujours aussi simple. Si, par exemple, on veut une distribution gaussienne (ou normale) : y2 1 p(y) = √ e− 2 2π le calcul de la fonction r´eciproque de la primitive n’a rien d’´evident. . . En fait les choses s’arrangent si l’on passe en coordonn´ees polaires ` a deux dimensions en pensant `a la distribution de Maxwell-Boltzman : P (v) = v e−
4.11.5
Int´ egration multidimensionnelle sur des domaines compliqu´ es.
4.11.5.1
Principes
Au chapitre 4.3.2, on a vu des m´ethodes d’int´egrations a` une dimension comme la m´ethode des trap`ezes. Celle-ci se g´en´eralise sans difficult´e `a des int´egrales multidimensionnelles du type : Z
b1
a1
Z
b2
a2
...
Z
bn
f (x1 , x2 , . . . , xn ) dxn . . . dx2 dx1
an
Ce type d’int´egrale correspond en fait `a des domaines d’int´egration de g´eom´etrie simple (rectangle `a deux dimensions, parall´el´epip`ede `a trois dimensions, etc.) ; on peut dans une certaine mesure, par des changements de variables appropri´es (coordonn´ees cylindriques ou sph´eriques) adapter l’int´egration `a d’autres g´eom´etries. Il y a toutefois des limites.
v2 2
avec P (vx , vy ) dvx dvy = P (v) dv dϕ Donc, si l’on fait deux tirages au sort√ avec ϕ ∈ [0, 2π[ avec une distribution uniforme et v = −2 ln x et x avec ´egalement une distribution uniforme comprise entre 0 et 1, on obtient deux nombres al´eatoires (vx = v cos ϕ et vy = v sin ϕ) avec une distribution gaussienne : la figure 4.40 en est une illustration. Un exemple de subroutine tr`es simple capable de produire de tels nombres est donn´e ci-dessous : subroutine gauss_d(x1,x2) implicit none real :: x1, x2, v, phi, tpi = 6.28318531 v = sqrt(-2.*log(rand())) phi = tpi*rand() x1 = v*cos(phi) ; x2 = v*sin(phi) end
Fig. 4.41 – Un domaine d’int´egration un peu compliqu´e. . .
Imaginons, par exemple, que l’on veuille calculer la figure d’interf´erences donn´ee par deux fentes d’Young, mais la source lumineuse, au lieu d’ˆetre ponctuelle, est un filaC’est, certes, de l’ordre de la recette de cuisine et c’est ment d’ampoule ´electrique ´epais, torsad´e et courb´e (figure bien pour cela qu’il existe des ouvrages sp´ecialis´es et des 4.41), ou, pire, une galaxie vue `a travers un t´elescope : biblioth`eques de programmes tous faits ! comme la source est incoh´erente, il faut donc int´egrer les
90
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
intensit´es lumineuses issues de chaque point de la source. Le domaine d’int´egration est donc la source : il n’y a gu`ere d’habile changement de variable qui saute aux yeux ! Il existe une premi`ere solution qui consiste ` a int´egrer sur un volume de g´eom´etrie simple qui englobe la source, en fixant la valeur de l’intensit´e lumineuse ` a z´ero en dehors de la source.
−2 −1.5 −1 −0.5 0 0.5 1 1.5 2 d
d Fig. 4.42 – Si l’on veut calculer l’int´egrale d’une fonction dans un espace compliqu´e, on peut englober cet espace dans un (hyper)cube, ici un carr´e d × d, tirer au sort des points dans ce carr´e, c’est-` a-dire, pour chaque point, tirer deux nombres compris entre 0 et d et n’ajouter la valeur de la fonction en ce point que s’il se trouve dans l’espace d’int´egration. Sinon, on l’ignore et on fait un nouveau tirage. L’autre solution consiste ` a tirer au sort des points dans ce volume (figure 4.42), d’ignorer les points qui sont en dehors de la source et de ne compter que ceux qui sont sur la source. Cette deuxi`eme solution, si elle peut paraˆıtre un peu absurde, a au moins deux m´erites : 1o elle est simple `a mettre en œuvre, et 2o elle permet de tracer le graphe du r´esultat en fonction du nombre de tirages au sort, de sorte que lorsque le r´esultat ne fluctue que d’une valeur inf´erieure `a un certain seuil, on peut consid´erer que l’int´egrale est calcul´ee avec cette pr´ecision (c’est un peu comme sur la figure 4.37 o` u l’on peut consid´erer que π est calcul´e `a partir du moment o` u les fluctuations sont inf´erieures `a la pr´ecision souhait´ee). 4.11.5.2
Tentative « na¨ıve ».
Prenons un autre exemple : on veut calculer, Z sin(xy) dx dy ID = D
o` u D est le domaine d’int´egration. Si
2 1 1.5 0.8 0.6 1 0.4 0.2 0.5 0.0 0 −0.2 −0.4 −0.5−0.6 −0.8 −1 −1 −1.5 −2
Fig. 4.43 – Le domaine d’int´egration D d´efini par l’´equation (4.31) est d´elimit´e par la courbe continue rouge. . . c’est nettement plus compliqu´e ! Il suffit toutefois de tirer au sort des nombres x et y dans l’intervalle [−2, 2], et, si la condition de l’´equation (4.31) est v´erifi´ee, additionner la quantit´e sin(xy) `a toutes celles d´ej` a obtenues. Il faut alors normaliser le r´esultat en multipliant cette somme S VD par o` u VD est le volume (ici, avec deux variables seulenc ment, c’est en fait une surface) de D et nc est le nombre de « coups au but » c’est-`a-dire le nombre de fois o` u l’on est tomb´e dans D. Que vaut alors VD ? Il suffit de reprendre le raisonnement utilis´e pour calculer π par le rapport de la surface du cercle `a celle du carr´e : c’est le volume total Vt dans lequel on a fait des tirages multipli´e par la proportion de coups au but : nc VD = Vt nt o` u nt est le nombre total de tirages. Ainsi, en fin de compte, Vt ID = S nt Le programme qui fait cela est extrˆemement simple : program integr implicit none real :: x, y, s integer :: i, imax = 100000000, n s = 0. ; n = 0 open(10,file=’integr_sin.out’) do i = 1, imax x = 4*(rand()-0.5) ; y = 4*(rand()-0.5) ! [-2,2] if ( 4*tanh(x-y)*exp(-(x**2 + y**2)) > 0.4 ) & s = s + sin(x*y) if ( mod(i,5000) == 0 ) write(10,*) i, 4*s/i enddo write(*,*) 4*s/imax end
C ¸ a donne -8.9420289E-02 pour 108 tirages et quelques secondes de calcul. Le r´esultat en fonction du nombre de D = {(x, y), tels que x + y < π} tirages est represent´e sur la figure 4.44. Les huit chiffres c’est facile : ID = 0 ; mais si (figure 4.43) « significatifs » du r´esultat ci-dessus ne sont ´evidemment pas tous significatifs ! On constate ais´ement sur la figure 2 2 qu’avec tous ces tirages, on en a au plus 3, soit ID ≃ D = {(x, y), tels que 4 tanh(x − y) e−(x +y ) > 0.4} (4.31) −0.0894. . . Peut-on ˆetre plus efficace ? 2
2
91
Physique num´erique, Philippe Depondt
-0.0885
-0.088
-0.08875
-0.0882
-0.089 -0.08925
-0.0884
-0.0895
-0.0886
-0.08975 -0.0888
-0.09 -0.09025
-0.089
-0.0905
-0.0892
-0.09075 -0.091
-0.0894
-0.09125
-0.0896
-0.0915 -0.0898
-0.09175 -0.092 100000
1e+06
1e+07
1e+08
-0.09 1e+07
2e+07
n_t
4e+07
8e+07
n
Fig. 4.44 – Valeurs obtenues pour ID avec le domaine Fig. 4.45 – Valeurs obtenues pour ID avec le domaine (4.31) en fonction du nombre de tirages (l’axe des x a une (4.31) en fonction du nombre de tirages (l’axe des x a une ´echelle logarithmique). ´echelle logarithmique) comme dans la figure 4.44, mais cette fois-ci par une marche au hasard dans le domaine d’int´egration D. 4.11.5.3
Marche au hasard dans D
Dans le calcul pr´ec´edent, on a tir´e au sort des nombres dans un domaine plus grand que le domaine d’int´egration D et on a simplement ´elimin´e tous les tirages qui tombaient en-dehors de D. On est en droit de se dire que c’est inefficace et qu’il vaudrait mieux tenter de ne tirer des nombres que dans le bon domaine : c’est en toute rigueur impossible, mais, si, partant d’un point choisi dans D (par exemple (0.5, −0.5) dans la figure 4.43), au lieu de tirer d’autres nombres de fa¸con ind´ependante, on se borne `a se d´eplacer au hasard dans le domaine, soit tirer au sort, non pas un point, mais un petit d´eplacement (dx, dy), quitte a rejetter les d´eplacements qui font sortir du domaine, on ` devrait passer l’essentiel du temps (ou plutˆ ot des tirages au sort) dans le bon domaine. Ainsi, on peut commencer par fixer un point de d´epart dans D : x0 = 0.5 ; y0 = -0.5 dans l’exemple ci-dessus, puis calculer des d´eplacements −δx < dx < δx et −δy < dy < δy : dx = 2*delta_x*(rand()-0.5) dy = 2*delta_y*(rand()-0.5) et ajouter cela aux anciennes valeurs de x et y. Si le nouveau point obtenu est dans D le d´eplacement est conserv´e, sinon, il est rejett´e (c’est-` a-dire que l’on revient `a la position pr´ec´edente). Dans tous les cas (voir une discussion d´etaill´ee de ce point dans la r´ef. [21]), on ajoute la valeur de la fonction `a la somme que l’on aura d´ej` a initi´ee. En divisant cette somme par le nombre de tirages, on obtient la valeur moyenne de la fonction dans le domaine : il « suffit » de multiplier par le volume du domaine VD pour obtenir le r´esultat. Si on connait ce volume, c’est en effet assez facile, sinon, par exemple dans le cas de l’´equation (4.31), il faut le calculer. . . par une m´ethode Monte-Carlo ! C’est ce qui est fait fig. 4.45 et l’on obtient des r´esultats assez similaires `a ce qu’on avait pr´ec´edemment.
4.11.5.4
´ Echantillonnage par l’importance (importance sampling )
Pourrait-on, pour ainsi dire, « guider » le hasard ? Il faudrait pouvoir « dire » au hasard quand c¸a vaut le coup de faire le calcul, car calculer l’int´egrale d’une fonction en sommant au hasard partout, y compris l` a o` u elle est nulle ou presque n’a pas grand int´erˆet. Autrement dit, il serait peut-ˆetre habile d’utiliser des tirages au sort, non pas avec des distributions uniformes comme jusqu’` a pr´esent, mais avec des distributions qui favorisent les endroits o` u la fonction a des contributions non n´egligeables. Formellement, cela donne, avec l’exemple du calcul « na¨ıf » ci-dessus (§ 4.11.5.2) :
ID =
Z
D
sin(xy) dx dy =
Z
D
sin(xy) p(x, y) dx dy p(x, y)
o` u p(x, y) est une densit´e de probabilit´e choisie de fa¸con a` avoir des valeurs plus importantes l` a o` u la fonction a elle-mˆeme des valeurs plus importantes.On sommera alors sin(xy) les valeurs prises par , o` u maintenant x et y sont p(x, y) choisis avec la densit´e de probabilit´e p(x, y). On pourrait ´evidemment choisir comme distribution la fonction ellemˆeme, toutefois produire des nombres al´eatoires avec une distribution de probabilit´e sin(xy) comme ici n’est peutˆetre pas si facile que cela. Une approximation de la fonction peut suffire : ici, il suffit de poser, p(x, y) ∝ |xy| puisqu’une approximation de sin(xy) quand x et y ne sont pas trop grands est xy (on prend la valeur absolue, puisqu’une densit´e de probabilit´e est toujours positive). En utilisant la m´ethode du § 4.11.4, supposons que l’on tire au sort des nombres X et Y avec des distributions uniformes, on a alors
p(x, y) dx dy = dX dY Qu’a-t-on gagn´e en faisant tout cela ? Pas grand-chose, il faut le reconnaˆıtre, en termes de performances de calcul ; soit, en s´eparant toutefois, on est rassur´e que cela « marche », ce qui sera x dx = dX et y dy = dY pr´ecieux quand on n’aura plus le choix. . .
92
Licence de physique L3 : Physique Fondamentale & PHYTEM,
et
√ √ y = 2Y x = 2X o` u l’on a oubli´e les probl`emes de signe. . . On peut s’arranger pour que X et Y soient dans l’intervalle [−1, 1] et remultiplier par le coefficient qui va bien pour que x et y soient dans l’intervalle [−2, 2] comme auparavent. C’est plus simple que c¸a en a l’air : program importance implicit none double precision :: x, y, xx, yy, s, z integer :: i, imax = 10000000 s = 0. ; n = 0 open(10,file=’import_sampling.out’) do i = 1, imax xx = 2.*rand()-1. ; yy = 2.*rand()-1. x = 2.*sign(sqrt(abs(xx)),xx) y = 2.*sign(sqrt(abs(yy)),yy) if ( 4*tanh(x-y)*exp(-(x**2+y**2)) > 0.4 ) then z = x*y if ( abs(z) > 1.e-10 ) then ! no zero divide s = s + sin(z)/abs(z) else s = s + 1. endif endif if ( mod(i,10000) == 0 ) write(10,*) i, 4.*s/i enddo close(10) write(*,*) 4.*s/imax end
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
On sait qu’en thermodynamique statistique, pour un syst`eme donn´e, un grand nombre d’´etats microscopiques correspondent `a un mˆeme ´etat macroscopique : par exemple, la connaissance de la pression et de la temp´erature d’un gaz suffisent `a d´efinir son ´etat macroscopique qui correspond `a un nombre gigantesque d’´etats microsopiques possibles, d´efinis, eux, par la position et la vitesse de chacun des atomes qui composent le gaz. A priori, dans l’ensemble canonique, quand on connait la fonction de partition du syst`eme X − Ei e kB T Z= i
on peut calculer toutes les grandeurs que l’on veut (T ´etant la temp´erature du thermostat et kB la constante de Boltzmann). Le seul petit d´etail contrariant dans cette histoire est que la somme sur i dans l’´equation ci-dessus est une somme sur tous les ´etats microscopiques acccessibles au syst`eme 54 : autrement dit, sauf dans quelques cas55 , on ne sait pas calculer la fonction de partition. Dans la formulation de Gibbs, quand on veut calculer une grandeur macroscopique, par exemple l’aimantation d’un syst`eme magn´etique, on doit prendre un grand nombre de syst`emes identiques, plac´es dans le mˆeme ´etat macroscopique, mais dans des ´etats microscopiques diff´erents. La moyenne thermodynamique d’une grandeur (not´ee hM i pour une aimantation, par exemple) est la moyenne de toutes les valeurs prises par cette grandeur dans tous ces syst`emes. C’est donc une tr`es grosse On obtient la courbe de la figure 4.46. Pour des r´esultats int´egrale tr`es compliqu´ee et le rapport avec les paragraphes pr´ec´edents devrait commencer `a poindre. . . -0.085 -0.0855
4.11.6.1
-0.086 -0.0865 -0.087
Soit donc un syst`eme dans l’ensemble canonique (c’esta`-dire en interaction avec un thermostat `a temp´erature T ) et une grandeur A dont on veut calculer la valeur moyenne : Z E(q1 ,q2 ,...,qn ) − kB T dq1 dq2 . . . dqn A(q1 , q2 , . . . , qn ) e Z hAi = E(q1 ,q2 ,...,qn ) − kB T dq1 dq2 . . . dqn e
-0.0875 -0.088 -0.0885 -0.089 -0.0895 -0.09 -0.0905 -0.091 -0.0915 -0.092 100000
1e+06
1e+07
n
Fig. 4.46 – Valeurs obtenues pour ID avec le domaine (4.31) en fonction du nombre de tirages (l’axe des x a une ´echelle logarithmique) par une m´ethode d’´echantillonnage par l’importance. L’´echelle de l’axe des y est la mˆeme que pour la figure 4.44. tr`es comparables, voire meilleurs que ceux de la figure 4.44, on a fait dix fois moins de tirages au sort (107 au lieu de 108 ) : on a gagn´e un ordre de grandeur en temps de calcul ! C ¸ a m´eritait un petit effort. . .
4.11.6
Faire de la thermodynamique statistique avec un ordinateur.
Simulation Metropolis.
de
Monte-Carlo-
` quoi tous les calculs d’int´egrale plus ou moins comA pliqu´es ci-dessus peuvent-ils bien servir ` a part meubler la conversation d’un vieil enseignant ?
(4.32) Les q1 . . . qn sont les variables microscopiques du syst`eme (typiquement les positions, vitesses, etc., de tous les atomes ; n est, on l’aura compris, tr`es grand et les int´egrales tr`es multidimensionnelles) ; E(q1 , q2 , . . . , qn ) est l’´energie du syst`eme dans l’´etat microscopique d´efini par les valeurs de ces variables, A(q1 , q2 , . . . , qn ) la valeur de la grandeur A dans les mˆemes conditions. La probabilit´e d’atteindre un ´etat d’´energie E est proportionnelle `a l’exponentielle (dans une statistique de Maxwell-Boltzmann) et le d´enominateur de l’expression est la fonction de partition qui sert ici `a la normalisation. Il est bien sˆ ur hors de question de calculer directement l’expression (4.32), mais nous avons vu qu’il existe des chemins de traverse plus ou moins tortueux pour ce genre de situations. 54 la somme discr` ete ci-dessus, peut ˆ etre remplac´ ee par une int´ egrale multiple sur toutes les variables microscopiques du syst` eme, si celles-ci varient continˆ ument. 55 voir a ` ce sujet le cours de thermodynamique statistique.
93
Physique num´erique, Philippe Depondt
Imaginons de faire une marche au hasard dans l’espace 4.11.6.2 Concr` etement. des ´etats accessibles au syst`eme : partons donc d’un ´etat Admettons, par exemple, que l’on s’int´eresse `a un dont on peut calculer l’´energie E1 . La probabilit´e que cet ensemble d’atomes susceptibles de constituer un so´etat soit r´ealis´e est : lide et que l’on puisse calculer l’´energie potentielle du E syst`eme connaissant les positions atomiques : V ({~rℓ }), par − k 1T e B p1 = exemple : Z 12 6 ! σℓm σℓm 1X En g´en´eral, on ne peut pas calculer cette probabilit´e −2 εℓm V = 2 rℓm rℓm puisque Z est inconnu. Faisons alors un pas au hasard ℓ,m dans cet espace, on change alors d’´etat et l’´energie devient si les interactions interatomiques sont des interactions de E2 . La probabilit´e de ce nouvel ´etat est paire du type Lennard-Jones (figure 4.47), mais il existe E de nombreuses autres possibilit´es. − k 2T e B p2 = 2 Z 1.5
1
V
qui n’est pas plus calculable que p1 , mais Z, qui est une int´egrale sur tous les ´etats, n’a pas chang´e. La probabilit´e π1→2 de transiter de l’´etat 1 vers l’´etat 2 est simplement la probabilit´e p1 d’ˆetre dans l’´etat 1 multipli´ee par la probabilit´e conditionnelle p1→2 de transiter de l’´etat 1 vers l’´etat 2, alors que le syst`eme est d´ej` a dans l’´etat 1 : π1→2 = p1 p1→2
0
−0.5
−1
De mˆeme, en sens inverse : π2→1 = p2 p2→1
⇒
p1 p1→2 = p2 p2→1
Cela signifie que si, par exemple, l’´etat 1 est tr`es probable et l’´etat 2 tr`es improbable, le syst`eme ´etant d´ej` a dans l’´etat 2 aura une forte probabilit´e d’aller dans l’´etat 1, alors que s’il est dans l’´etat 1, il aura une faible probabilit´e d’aller dans l’´etat 2. En revanche, si l’on regarde le syst`eme « de loin », d’un point de vue macroscopique, on ne sait pas dans quel ´etat microscopique il est, et les probabilit´es de transition dans un sens ou dans l’autre sont ´egales. On arrive ainsi `a la relation suivante : p1→2 = soit p1→2 = e
−
p2 p2→1 p1
(E2 −E1 ) kB T
1
1.2
1.4 r
1.6
1.8
2
Fig. 4.47 – Le potentiel de Lennard-Jones, pour ε = 1 et σ = 1. Le potentiel est fortement r´epulsif pour r < σ ce qui correspond `a la r´epulsion dite de « cœur dur », attractif dans le cas contraire.
Le principe dit « de la balance d´etaill´ee » stipule que π1→2 = π2→1
0.5
Appliquons la m´ethode ci-dessus : `a partir d’une configuration initiale qui est, soit choisie, soit prise au hasard, on tire au sort un d´eplacement atomique, et l’on calcule la variation d’´energie correspondante ∆V . Si ∆V < 0, p1→2 = 1, on garde la nouvelle configuration et l’on reocommence. Si, en revanche ∆V > 0, p1→2 = e
− k∆VT B
il faut donc garder cette nouvelle configuration avec cette probabiit´e. On compare alors un nombre s, tir´e au sort dans l’intervalle [0, 1], avec cette probabilit´e de transition (figure 4.48). La probabilit´e que p1→2 > s est justement. . . p1→2 !
p2→1
une expression pr´ecieuse en ce sens que la fonction de partition, justement redout´ee, en a disparu ! L’algorithme de Monte-Carlo-Metropolis dit ceci : « si E2 < E1 , le syst`eme qui se trouve dans l’´etat 1 transitera vers l’´etat 2 avec une probabilit´e 1 : p1→2 = 1. Si au contraire, E2 > E1 , alors, p2→1 = 1 et p1→2 = e Ainsi si l’on choisit :
−
(E2 −E1 ) kB T
.
s
0
1 p = exp(dE/kT)
dE
Fig. 4.48 – On calcule p = e− kT et on compare avec un ) p1→2 = min(1, e nombre s tir´e au sort dans l’intervalle [0, 1]. Plus p est grand, plus on a de chances que s < p : donc p est la la marche au hasard ainsi produite ob´eira ` a la statistique probabilit´e de garder la nouvelle configuration. de Maxwell-Boltzmann, ce que l’on voulait ». En effet, nous sommes maintenant en train de faire une Donc, si p1→2 > s, on conserve la nouvelle configuration, ` chaque pas, marche au hasard dans le domaine d’int´egration avec une sinon on la rejette. Puis on recommence. . . A probabilit´e qui est justement celle que l’on attend, on fait on calcule la grandeur dont on veut la valeur moyenne et donc pour ainsi dire « spontan´ement » un ´echantillonnage l’on fait cette moyenne. selon l’importance. Une ´ecriture possible de cet algorithme serait −
(E2 −E1 ) kB T
Licence de physique L3 : Physique Fondamentale & PHYTEM,
C’est un algorithme tr`es simple que l’on peut optimiser de multiples fa¸cons, en particulier de calculer directement la variation d’´energie (la variation ne d´epend que de l’atome d´eplac´e et de ceux avec lesquels il est en interaction, alors que l’´energie concerne tous les atomes) peut repr´esenter un gain significatif de temps. On fait alors de nouveaux tirages au sort. L’´energie du syst`eme tend `a ´evoluer (puisque le point de d´epart n’est sans doute pas bien choisi car on ne connait pas au d´epart quelles sont les « bonnes » configurations) jusqu’` a ce que l’on aboutisse ` a une situation o` u l’ont obtient au fil des tirages autant d’augmentations que de diminutions de l’´energie : le syst`eme se met ` a fluctuer autour d’une mˆeme ´energie. Si l’on poursuit n´eanmoins les tirages au sort, on produit une succession de configurations poss´edant une ´energie dont les fluctuations sont de l’ordre de kB T . Les configurations obtenues sont les configurations que parcourt le syst`eme `a cette temp´erature : on peut faire des moyennes des grandeurs physiques pertinentes, ´etudier la structure, etc. Si l’on change la temp´erature, on peut ´etudier comment les grandeurs ´evoluent, en particulier s’int´eresser aux changements de structure : les transitions de phase. Les simulations de Monte-Carlo sont l’une des grandes m´ethodes de simulation en mati`ere condens´ee et les applications en sont multiples. Elle s’applique, comme on l’a vu, ` a des syst`emes classiques dont les variables (ici, les positions atomiques) peuvent varier continˆ ument, mais aussi ` a des syst`emes de spins dans le cadre du c´el`ebre « mod`ele d’Ising » (voir la figure 4.49).
4.11.7
Recherche du minimum fonction : le recuit simul´ e.
d’une
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
−0.4 5x5 10x10 20x20 30x30 40x40 50x50 70x70
−0.6 −0.8 −1 Energie
i = n*rand() + 1 ! tirage au sort d’un atome ! i est dans l’intervalle [1,n], or 0 <= rand() < 1 ! ! conserver l’ancienne configuration au cas ou il ! faudrait rejeter la nouvelle x_old = x(i) ; e_old = e ! ! deplacer l’atome i x(i) = x(i) + dx*(rand()-0.5) ! ! calcul de la nouvelle energie e = energie(x,n) de = e - e_old ! if ( de > 0 ) then ! si l’energie a augmente ! plus exp(-de/kt) est grand, plus la condition ! ci-dessous est difficile a remplir if ( rand() > exp(-de/kt) ) then ! rejet de la nouvelle configuration x(i) = x_old ; e = e_old endif ! sinon on garde endif
−1.2 −1.4 −1.6 −1.8 −2 −2.2
0
1
2
3
4
5
T 1.1 5x5 10x10 20x20 30x30 40x40 50x50 70x70
1 0.9 0.8 0.7 Aimantation
94
0.6 0.5 0.4 0.3 0.2 0.1 0
0
1
2
3
4
T
Fig. 4.49 – Le r´esultat d’une simulation Monte-Carlo Metropolis sur un ensemble de spins de tailles variables de 5 × 5 `a 70 × 70, plac´es sur un r´eseau bidimensionnel carr´e, avec des conditions aux limites p´eriodiques et des interactions ferromagn´etiques entre premiers voisins du type −Si Sj tendant `a aligner les spins ; chaque spin peut prendre les valeurs +1 ou −1. Pour plusieurs temp´eratures diff´erentes, on a fait quelques centaines de milliers tirages au sort, et calcul´e l’´energie moyenne par spin (en haut) et l’aimantation moyenne, ´egalement par spin (en bas). On constate qu’` a basse temp´erature, l’aimantation vaut 1 : tous les spins sont orient´es dans le mˆeme sens ce qui correspond `a l’´energie potentielle la plus faible. Puis l’aimantation diminue brusquement vers T = 2, 5 quand le d´esordre thermique prend le dessus. Si les courbes d’´energie se superposent (sauf pour 5 × 5) on observe, sur les courbes d’aimantation, que la transition est mieux marqu´ee pour le syst`eme le plus gros : l’aimantation ne devient v´eritablement nulle au-dessus de la transition que pour un syst`eme infini pour lequel les fluctuations sont n´egligeables. tion, mˆeme s’il ne s’agit pas d’une ´energie ? Les m´ethodes de recherche de minima de fonctions vues au chapitre 4.7 ont en effet toutes le d´efaut de reposer sur une analyse locale des d´eriv´ees de cette fonction, que ce soit la m´ethode de la plus grande pente ou celle du gradient conjugu´e. Rien ne garantit avec ces m´ethodes que l’on a atteint le minimum absolu de la fonction : le minimum trouv´e peut n’ˆetre qu’un minimum local (figure 4.50), un autre plus profond se trouvant ailleurs. La m´ethode du recuit simul´e est une tentative pour s’attaquer `a ce probl`eme. Soit, donc, une fonction :
La m´ethode de Monte-Carlo-Metropolis, on l’a vu, permet de parcourir des ´etats d’un syst`eme, mˆeme si l’´etat initial que l’on avait choisi ´etait inadapt´e : le syst`eme tend a converger vers des ´etats compatibles avec la temp´erature ` choisie, et l’on imagine volontiers que si l’on fait diminuer la temp´erature jusqu’` a la faire tendre vers z´ero, l’on tende f (x1 , . . . , xn ) = f (X) vers le minimum de l’´energie. Peut-on alors g´en´eraliser ce genre de m´ethodes `a la recherche du minimum d’une fonc- o` u X d´esigne l’ensemble des {xℓ }, et l’on cherche le mini-
5
95
Physique num´erique, Philippe Depondt
120 100 80 60
A
40 20 0 −20 −10
−5
0
5
10
Fig. 4.50 – Comment, ` a partir d’une analyse locale de la d´eriv´ee de cette fonction peut-on ˆetre sˆ ur d’aboutir sur son minimum absolu ? mum de cette fonction. On d´emarre la recherche comme d’habitude par un point [0] [0] de d´epart, X [0] = (x1 , . . . , xn ), mais en g´en´eral, il est tir´e au sort. Puis on modifie l’un des xℓ al´eatoirement ce qui donne X [1] . On fait alors une hypoth`ese « thermodynamique » que la probabilit´e de transiter de l’´etat X [0] `a l’´etat X [1] est : p0→1 = e−β0 ∆f , avec ∆f = f (X [1] ) − f (X [0] ) On est en train d’assimiler la fonction f ` a une ´energie avec β0 = 1/kB T0 , l’inverse d’une temp´erature fictive. On tire alors au sort un autre nombre s compris entre z´ero et un avec une distribution uniforme. Si f a diminu´e en passant de l’´etat X [0] `a l’´etat X [1] , alors p0→1 > 1 > s. Si en revanche, f a augment´e, alors p0→1 < 1 et donc peut ˆetre soit sup´erieur ou inf´erieur ` a s ; or, plus f a augment´e, plus p0→1 est petit, et plus sa probabilit´e d’ˆetre plus petit que s est grande. Si on se donne alors la r`egle : si p0→1 > s, on conserve la nouvelle configuration, sinon on la rejette, alors p0→1 joue bien le rˆ ole d’une probabilit´e de transition de l’´etat X [0] vers l’´etat X [1] . Ainsi, de tirage au sort en tirage au sort, on privil´egie les cas ou f diminue, mais pas syst´ematiquement : si β0 est petit un certain nombre de cas o` u f augmente seront conserv´es, ce qui permet d’esp´erer sortir d’un ´eventuel minimum secondaire. On modifie alors un autre xℓ et l’on recommence un grand nombre de fois jusqu’` a ce que les valeurs prises par f ne fassent plus que fluctuer autour d’une mˆeme valeur. Puis on diminue la temp´erature (en ´ecrivant par exemple βn = βn−1 B, B > 1) et l’on recommence et ainsi de suite, jusqu’` a ce que les variations de β ne modifient plus les valeurs prises par f . L’appellation « recuit simul´e » se justifie donc, puisque l’on a « chauff´e » le « syst`eme » pour lui permettre d’explorer un grand nombre de configurations (si la temp´erature est ´elev´ee, la probabilit´e p0→1 est plus facilement proche de un), puis on l’a « refroidi » progressivement afin de le laisser chercher la configuration de plus bas f . Une application classique de cette m´ethode est le probl`eme dit « du voyageur de commerce » (figure 4.51) : un voyageur de commerce doit explorer, pour y faire ses affaires, un certain nombre de villes, mais pour gagner du temps, il doit les visiter dans un ordre tel que la distance
Fig. 4.51 – Le probl`eme du voyageur de commerce : quel est l’itin´eraire le plus court qui permette au voyageur de commerce de visister toutes les villes ? parcourue finale soit la plus courte possible. Le recuit simul´e est probablement la meilleure m´ethode pour trouver un ordre optimal, sachant que le nombre de choix est vite immense ((n − 1)! si la premi`ere et derni`ere ville est fix´ee), d`es que le nombre de villes commence `a croˆıtre un peu : une recherche syst´ematique, seule susceptible de fournir le minimum absolu, serait trop coˆ uteuse (fig. 4.52). Ce genre de m´ethode est bien adapt´e `a des probl`emes comportant un grand nombre de variables et converge vers un ensemble de solutions acceptables, `a d´efaut de la meilleure solution ; en revanche il est peu efficace dans le cas o` u il existe une, ou un tr`es petit nombre de solutions, bien d´efinies (fig. 4.53). Une autre application parfois int´eressante est ce que l’on appelle le « Monte-Carlo inverse » pour laquelle la fonction dont on cherche le minimum est le χ2 correspondant `a une exp´erience ou un ensemble d’exp´eriences. Pour une exp´erience de diffraction de rayons X, par exemple, χ2 est une fonction d’un grand nombre de param`etres : les positions atomiques. Un recuit simul´e peut ˆetre parfois une bonne solution pour en chercher le ( ou les ) minimum.
4.12
Le tri.
On ne dira pas grand-chose ici sur les algorithmes de tri a` proprement parler, sinon pour une mise en garde, car cela sort un peu du domaine de la physique num´erique stricto sensu. Il peut arriver que l’on ait `a trier des nombres par valeurs croissantes ou d´ecroissantes : par exemple, si l’on a calcul´e les positions d’un certain nombre d’atomes et si l’on souhaite les repr´esenter sur une figure, il est souhaitable de tracer d’abord les atomes les plus ´eloign´es de l’observateur (ou les plus au fond de la figure) de telle fa¸con que les atomes les plus proches soient trac´es ensuite et puissent ´eventuellement les masquer. La m´ethode que l’on imaginerait au premier abord consiste `a comparer les nombres deux `a deux et `a les permuter si n´ecessaire : c’est tr`es inefficace et extrˆemement coˆ uteux en temps machine d`es que le nombre d’´el´ements dans le probl`eme d´epasse
96
Licence de physique L3 : Physique Fondamentale & PHYTEM, 1
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
1
Random 0.9
0.8
0.8
0.6
0.7
0.4
0.6 0.5
0.2
0.4
Y 0
0.3
−0.2
0.2
START
−0.4
0.1 0
0
0.1
0.2
0.3
1
0.4
0.5
0.6
0.7
0.8
0.9
−0.6
1
1 T=1
0.9
0.9
0.8
0.8
0.7
0.7
0.6
0.6
0.5
0.5
0.4
0.4
0.3
0.3
0.2
0.2
0.1
0.1
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
1
0
−1 −1 −0.8 −0.6 −0.4 −0.2
0
0.1
0.2
0.3
0.4
0.5
0.6
0.8
0.8
0.7
0.7
0.6
0.6
0.5
0.5
0.4
0.4
0.3
0.3
0.2
0.2
0.1
0.1 0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
1
0
0.9
1
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
0.9
1
0.9
1
1 T=0.0625
T=0.03125
0.9
0.9
0.8
0.8
0.7
0.7
0.6
0.6
0.5
0.5
0.4
0.4
0.3
0.3
0.2
0.2
0.1
0.1 0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
1
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
1 T=0.015625
T=0.0078125
0.9
0.9
0.8
0.8
0.7
0.7
0.6
0.6
0.5
0.5
0.4
0.4
0.3
0.3
0.2
0.2
0.1 0
0.8
T=0.125 0.9
0
0.7
1
0.9
0.1 0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
0
0
0.2
0.4
0.6
0.8
1
X
T=0.25
0
−0.8
T=0.5
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
Fig. 4.52 – Itin´eraires obtenus par recuit simul´e pour 100 villes plac´ees au hasard dans un carr´e de cot´e 1. En haut, un itin´eraire pris au hasard : la distance que le voyageur de commerce doit parcourir est de l’ordre de 55. Puis la « temp´erature » fictive est progressivement diminu´ee tout en faisant des tirages au sort pour permuter les villes `a visiter. La derni`ere figure propose un itin´eraire correspondant a une distance de 15 : le gain est significatif. Chaque figure ` fait suite `a plusieurs dizaines de millions de tirages, mais le temps d’ex´ecution sur un PC standard est de quelques minutes. . .
` ´eviter donc dans la plupart des cas. . . une dizaine ! A Le plus simple est ´evidemment d’aller chercher dans une biblioth`eque de programme une subroutine de tri
Fig. 4.53 – Le probl`eme du voyageur de commerce, trait´e par recuit simul´e comme dans la figure 4.52, mais dans un cas -des villes r´eparties sur un cercle- o` u la meilleure solution est facile `a deviner : ici la m´ethode par recherche au hasard aboutit `a un r´esultat assez peu convaincant, le voyageur serait amen´e `a faire plusieurs tours sur le cercle, avec des retours en arri`ere, alors qu’un seul tour suffirait ; la m´ethode n’est pas universelle. . . et de l’utiliser sans plus poser de question : c’est probablement la meilleure fa¸con de gagner du temps ! Si un tel programme n’est pas disponible, on peut tenter d’utiliser la commande Unix sort sur un fichier, c’est efficace mais pas toujours tr`es souple d’emploi. Sinon, en g´en´eral, un algorithme du type Quicksort devrait donner satisfaction : on partitionne en un endroit donn´e le tableau que l’on veut trier et l’on en permute les ´el´ements de telle fa¸con que tous les ´el´ements pr´ec´edents la partition soient inf´erieurs `a la valeur de l’´el´ement fronti`ere, et tous les suivants sup´erieurs. On trie alors chaque sous-tableau en refaisant une autre partition dans chacun d’eux, etc. : c’est une logique qui ressemble un peu `a celle des FFT et elle en partage l’efficacit´e. Voir `a ce sujet Numerical Recipes ref. [3] dans la bibliographie.
Chapitre 5
Introduction ` a la simulation num´ erique 5.1
Pourquoi la Simulation num´ erique ?
Les chapitres pr´ec´edents montrent comment la plupart des probl`emes physiques sont susceptibles de donner lieu a` des calculs sur ordinateur d`es que les solutions analytiques n’en sont pas triviales. Les m´ethodes de base (r´esolution de syst`emes lin´eaires, transform´ees de Fourier rapides, etc.) qui font partie de la culture g´en´erale des physiciens y sont expos´ees : ce sont les briques ´el´ementaires que l’on utilise pour bˆ atir des ´edifices plus imposants. La simulation num´erique est en effet simplement un pas de plus dans cette direction : faute de pouvoir calculer analytiquement le comportement d’un syst`eme physique, on le simule sur ordinateur. Il s’agit de r´esoudre num´eriquement les ´equations qui r´egissent par exemple son ´evolution temporelle, ou, plus simplement, calculer son ´etat dans telles ou telles conditions. En revanche, les probl`emes « s´erieux », tels qu’on peut les rencontrer dans un laboratoire de recherches ou dans un environnement de d´eveloppement industriel, n´ecessitent souvent des calculs dont le volume d´epasse assez largement les quelques minutes de temps de calcul sur un PC ! L` a commence ce que l’on peut appeler « le monde du calcul scientifique intensif » : voila certes une d´efinition plutˆ ot qualitative. . . Cependant, il s’agit d’un domaine qui comporte ses m´ethodes sp´ecifiques dont le but est d’obtenir des r´esultats physiquement significatifs dans des d´elais raisonnables ; l’appr´eciation de ce qui est « significatif » et « raisonnable » n’est certes pas universel, certains calculs pouvant prendre plusieurs mois ! Ces m´ethodes peuvent se regrouper grossi`erement en deux grandes cat´egories : 1. Les m´ethodes de programmation efficaces qui permettent d’utiliser au mieux l’architecture et les capacit´es de calcul de nos machines : c’est un volet plutˆ ot « informatique ». 2. Le volet plus « physique » comporte les questions physiques `a proprement parler : le milieu ´etudi´e doitil ˆetre consid´er´e comme continu ou compos´e d’atomes et de mol´ecules, quelles sont les approximations que l’on peut faire, pour quels types de probl`emes, quelles informations physiques sur le syst`eme ´etudi´e peut-on en attendre, que faire des r´esultats ? Le premier volet est abord´e dans le chapitre 6. Le pr´esent chapitre tente d’aborder le deuxi`eme ; il ne pr´etend bien sˆ ur en aucun cas `a l’exhaustivit´e tant le domaine est vaste ! On parlera donc principalement de : 1. La mati`ere consid´er´ee comme un milieu continu.
2. La mati`ere comme une collection de particules.
5.2
La mati` ere consid´ er´ ee comme un milieu continu.
5.2.1
Quels types de questions se pose-ton ?
Lorsqu’on s’int´eresse `a la mati`ere comme un milieu continu c’est, en g´en´eral qu’on se place `a une ´echelle telle que la structure atomique de la mati`ere ne joue pas. Par exemple, si l’on veut ´etudier la propagation d’une onde ´electromagn´etique en optique alors que la longueur d’onde de la lumi`ere visible λ ∼ 0, 5µm est beaucoup plus grande que les distances inter-atomiques dans un solide ou un liquide (∼ 1nm), alors on peut ´ecrire l’´equation de propagation (ici, `a une dimension) : ∂2E 1 ∂2E = 2 2 ∂x vϕ ∂t2
(5.1)
o` u E est le champ ´electrique et vϕ la vitesse de phase qui peut d´ependre de x afin de traiter des syst`emes comportant plusieurs mat´eriaux d’indices diff´erents ou bien des mat´eriaux inhomog`enes dont l’indice peut varier continˆ ument. Dans des cas plus compliqu´es, on pourra plutˆ ot ´ecrire : 2~ ~ = ∂ D ∆E ∂t2 ~ et E ~ qui peut ne pas ˆetre triviale avec une relation entre D (anisotrope ou non-lin´eaire par exemple). Un autre exemple, que l’on a d´ej` a mentionn´e `a propos des syt`emes lin´eaires (voir le paragraphe 4.5.1) est la propagation de la chaleur dans un milieu qui peut ˆetre h´et´erog`ene. On peut alors appliquer la loi de Fourier, toujours `a condition de se placer dans des conditions o` u celleci s’applique (temps caract´eristiques longs par rapport aux vibrations atomiques, ´echelles grandes par rapport aux distances inter-atomiques, . . .) : ~ r ) = −κ(~r) grad ~ T (~r) φ(~
(5.2)
~ r ) est proqui exprime que le flux de chaleur local φ(~ portionnel au gradient de temp´erature local, le coefficient de proportionnalit´e κ(~r) ´etant la conductivit´e thermique : celle-ci, comme le milieu peut ˆetre inhomog`ene, d´epend de l’endroit o` u l’on se trouve. . . Une hypoth`ese suppl´ementaire possible est celle du r´egime permanent : la
97
98
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
conservation de la quantit´e de chaleur (premier principe ainsi, l’indice entier i repr´esente l’espace et l’indice entier j le temps, et : de la thermodynamique en l’absence de travail) donne, ~ r ) = Q(~ ˙ r) div φ(~
la divergence du flux est en chaque point la cr´eation ou l’apport local (venant du monde ext´erieur) de chaleur. D’autres exemples pourraient venir de l’hydrodynamique o` u l’on applique les ´equations d’´ecoulement d’un fluide, en tenant compte ou non de la viscosit´e, de la m´ecanique des milieux continus o` u l’on d´eforme un solide plus ou moins compliqu´e par des contraintes ( e.g. un syst`eme constitu´e de deux solides coll´es avec des coefficients de dilatation diff´erents soumis ` a un accroissement de temp´erature. . .), etc. Tous ces probl`emes ont pour ingr´edient commun qu’il s’agit d’´equations aux d´eriv´ees partielles, c’est-`adire d’´equations diff´erentielles de plusieurs variables qui contiennent des d´eriv´ees partielles comme : ∂ , ∂x
∂ , ∂y
∂ , ∂z
E(x, t) = E(i δx , j δt ) = Ei,j
(5.3)
∂ ∂t
De mˆeme la vitesse de phase se r´e´ecrit : vϕ (i δx ) = vi L’´equation (5.4) des diff´erences finies permet d’´ecrire :
ou
∂E(x, t) Ei+1,j − Ei,j ≃ ∂x δx
(5.5)
Ei,j − Ei−1,j ∂E(x, t) ≃ ∂x δx
(5.6)
ce sont deux approximations possibles, ´equivalentes mais qui n’ont pas exactement la mˆeme valeur. . . en fait, il faudrait pouvoir prendre la valeur du champ au demi-pas : c’est parfois possible, parfois, non. Ce qui a ´et´e ´ecrit ici, c’est plutˆ ot :
δx δx ∂E(x − , t) ∂E(x + , t) Les syst`emes macroscopiques ne sont pas les seuls suscep2 2 et tibles de ce genre de traitement : l’´equation de Schr¨odinger ∂x ∂x pour une particule dans un potentiel est aussi une ´equation c’est-`a-dire les d´eriv´ees au demi-pas ; or ce sont les aux d´eriv´ees partielles, d´eriv´ees secondes, et non les d´eriv´ees premi`eres, qui nous 2 int´eressent dans ce probl`eme : h ¯ ∂ ∆ + V (~r) ψ(~r, t) i¯h ψ(~r, t) = − ∂t 2m δx δx ∂E(x + , t) ∂E(x − , t) 2 2 ainsi que bien sˆ ur les ´equations de Maxwell de − ∂ 2 E(x, t) ∂x ∂x ≃ l’´electromagn´etisme. ∂x2 δx Ces questions ne sont pas forc´ement faciles ` a traiter, et, parfois mˆeme dans certaines conditions et pour des rai- et en rempla¸cant les d´eriv´ees premi`eres par les expressions sons diverses, on ne sait pas les r´esoudre. Cependant, il (5.5) et (5.6), on obtient ais´ement l’approximation : existe deux classes principales de m´ethodes pour s’y attaEi+1,j + Ei−1,j − 2Ei,j ∂ 2 E(x, t) quer : les m´ethodes de diff´erences finies et les m´ethodes ≃ d’´el´ements finis. L’on mentionnera ´egalement les m´ethodes ∂x2 δx2 dites spectrales. La mˆeme op´eration peut ˆetre effectu´ee pour la d´eriv´ee temporelle, sauf que c’est maintenant l’indice j qui est 5.2.2 La m´ ethode des diff´ erences finies affect´e, et en fin de compte, l’´equation de propagation (5.1) Si f est une fonction de plusieurs variables x1 , x2 ,. . ., se r´e´ecrit : xn , on peut approximer la d´eriv´ee partielle par rapport `a 1 Ei,j+1 + Ei,j−1 − 2Ei,j Ei+1,j + Ei−1,j − 2Ei,j = 2 xi par : 2 δx vi δt2 ∂f ≃ ∂xi Ce que l’on cherche, c’est le champ E en tous points `a δxi δxi l’instant t + δt , le connaissant aux instant t et t − δt , ainsi : f (x1 , . . . , xi + , . . . , xn ) − f (x1 , . . . , xi − , . . . , xn ) 2
2
δxi
Ei,j+1 = (5.4) 2 c’est la d´efinition de la d´eriv´ee partielle, mais on ne passe vi δt pas a` la limite : δxi prend une valeur petite mais finie, (Ei+1,j + Ei−1,j − 2Ei,j ) + Ei,j − Ei,j−1 ∀i δx c’est l` a que r´eside l’approximation et c’est de l` a que vient (5.7) l’expression diff´erences finies. ce qui se programme fort ais´ement en quelques lignes. Dans les paragraphes qui suivent, diff´erentes variantes On appelle cela un sch´ema explicite puisque la solution de la m´ethode sont montr´ees ` a l’aide d’exemples. apparaˆıt explicitement : on doit connaˆıtre les conditions initiales et calculer pas `a pas les r´esultats au cours du 5.2.2.1 Le sch´ ema explicite temps. La figure 5.1 montre un exemple simple de propagation Prenons par exemple l’´equation de propagation d’une a ` travers une lame transparente d’un paquet d’ondes gausonde ´electromagn´etique dans un milieux unidimensionnel sien avec les r´eflexions sur les dioptres. On y voit bien sˆ ur (eq. (5.1) ) : il faut d’abord discr´etiser le temps et l’espace, le ralentissement du paquet dans le di´electrique (la pente x = i δx t = j δt est plus forte, autrement dit, il faut plus de temps pour
99
Physique num´erique, Philippe Depondt
30 2 1.5 1 0.5 0 −0.5 −1 −1.5 −2
25 20 t
15 10 5 0 0
5
10 x
15
20
Fig. 5.1 – Propagation d’une onde ` a travers une lame transparente obtenue par l’´equation (5.7). En abscisse, la coordonn´ee spatiale x, en ordonn´ee le temps. La condition initiale est donn´ee par un paquet d’ondes gaussien se d´epla¸cant dans le sens des x croissants, puisque l’on doit d´efinir les deux premiers pas de temps pour initialiser l’´equation (5.7). parcourir la mˆeme distance) et les interf´erences entre les et : ondes incidentes et r´efl´echies. On pourrait, par exemple, compliquer le probl`eme en − κi+1 − κi−1 + 4κi Ti+1 +2κi Ti − −κi+1 + κi−1 + 4κi Ti−1 4 4 consid´erant : D = ε0 (1 + χ1 )E + χ2 E 2 = −Q˙ i δx2
soit une d´ependance non-lin´eaire de D en fonction Le r´esultat important ici est que l’on obtient un syst`eme du champ ´electrique (ici un d´eveloppement limit´e au d’´equations lin´eaires dont les inconnues sont les Ti : la deuxi`eme ordre, χ1 ´etant la susceptibilit´e du premier ordre temp´erature en chaque point, or, le nombre d’´equations et habituelle et χ2 le terme du deuxi`eme ordre), ce qui d’inconnues est donn´e par la discr´etisation : permet de sortir du domaine habituel des di´electriques lin´eaires. L n= δx 5.2.2.2 Le sch´ ema implicite u L est la longueur de l’´echantillon. Autrement dit, le Si l’on combine l’´equation de Fourier (5.2) et la conser- o` nombre d’´equations peut ˆetre ´enorme et il est donc exclu vation de la chaleur (5.3), on obtient : de tenter de le r´esoudre `a la main ! ~ ˙ Il suffit alors de poser : div κ(~r) gradT (~r) = −Q(~r) soit, si l’on se restreint ` a un probl`eme ` a une dimension : ∂κ(x) ∂T (x) ∂ 2 T (x) ˙ = −Q(x) + κ(x) ∂x ∂x ∂x2
κi = κ(i δx )
(5.9)
(5.8) avec :
Comme dans le cas pr´ec´edent, on peut discr´etiser le probl`eme : Ti = T (i δx)
AT = Q
˙ δx ) Q˙ i = Q(i
On a de nouveau le probl`eme que l’on ne connaˆıt pas les valeurs des fonctions au demi-pas pour calculer les d´eriv´ees premi`eres : on peut s’en sortir n´eanmoins en consid´erant des intervalles de 2δx , et donc le demi-pas devient maintenant δx . . . Cela donne, ainsi : Ti+1 + Ti−1 − 2Ti κi+1 − κi−1 Ti+1 − Ti−1 + κi = −Q˙ i 2δx 2δx δx2
A=
.. .. . . .. 0 .
0 .. . . . 0 0 . κi+1 − κi−1 + 4κi 0 0 − 4
0 0 0 0 0 0
0
0
0
0
0
0
0
..
0 0
0 0
0 0 0 −κi+1 + κi−1 + 4κi 2κi − 0 0 4 .. .. . . 0 0 .. .. . . 0 0 .. .. . . 0 0 .
100
Licence de physique L3 : Physique Fondamentale & PHYTEM,
une tr`es grosse matrice n × n, et deux matrices colonne : −Q˙ 1 δx2 T1 .. .. . . 2 ˙ T = Ti Q = − Q i δx . .. .. . 2 ˙ Tn − Q n δx
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
renum´erotant : m = 3(i − 1) + α o` u α prend les valeurs 1, 2, 3. La mˆeme op´eration est ´evidemment faite pour ℓ. On con¸coit ais´ement que la matrice A peut facilement devenir ´enorme `a tel point qu’il faut parfois recourir `a des m´ethodes sophistiqu´ees pour r´esoudre le syst`eme lin´eaire ! 5.2.2.3
Contourner le sch´ ema implicite
Une fa¸con d’´eviter le sch´ema implicite pour retrouver un Il reste `a r´egler la question des conditions aux limites sch´ema explicite est d’´ecrire une ´equation d’´evolution temqui, dans ce cas ci, se r´eduisent ` a peu de choses, par porelle du syst`eme au lieu de tenter de calculer d’embl´ee exemple : une situation d’´equilibre o` u tous les points d´ependent les uns des autres. Avec une ´equation d’´evolution, on part T0 = Ta et Tn+1 = Tb d’une situation initiale et l’´etat au pas suivant d´epend exon introduit des points qui n’interviennent pas dans le plicitement de l’´etat initial : le syst`eme, si tout se passe syst`eme (5.9), i = 0 et i = n + 1 qui repr´esentent les bien, doit ´evoluer vers l’´equilibre que l’on cherchait. Par extr´emit´es de l’´echantillon et on fixe leurs temp´eratures `a exemple, l’´equation stationnaire (5.3) peut ˆetre remplac´ee Ta et Tb . Cela oblige ` a modifier la premi`ere et la derni`ere par une ´equation hors d’´equilibre : ligne de A et de Q. ∂T (~r) ˙ r ) − divφ = Q(~ C On peut aussi laisser les conditions aux limites libres, la ∂t ˙ seule contrainte ´etant alors Q(x). c’est-`a-dire que la variation temporelle locale de On fait appel alors ` a un sous-programme de bitemp´erature (multipli´ee par la capacit´e calorifique C d’une blioth`eque, ou bien pris dans un manuel de « recettes cellule) est la production locale de chaleur diminu´ee de la num´eriques », capable de r´esoudre le syst`eme (5.9). Si n est grand, le syst`eme est parfois lourd ` a r´esoudre, cepen- chaleur qui s’´ecoule hors de la cellule. En combinant cela avec la loi de Fourier (5.2), on obtient : dant, la matrice A comporte principalement des z´eros (on ∂T (~r) dit qu’elle est creuse), et dans le cas pr´esent elle est tridia~ T (~r) ˙ r ) − div κ(~r) grad C = Q(~ gonale ce qui facilite souvent la r´esolution num´erique du ∂t syst`eme d’´equations. On tombe ainsi sur un sch´ema explicite similaire `a celui Le r´esultat d’un exemple simple est montr´e sur la figure de la propagation d’une onde du paragraphe 5.2.2.1. Le 5.2. mˆeme probl`eme que pour la figure 5.2 est ainsi trait´e sur la figure 5.3.
Fig. 5.2 – Une solution num´erique de l’´equation (5.9) en fixant des conditions de temp´erature fixes aux deux extr´emit´es (T (x = 0) = 2 et T (x = 1) = 0) et sans production de chaleur. La conductivit´e κ d´epend de x. On retrouve le r´esultat connu que la temp´erature varie lin´eairement tant que κ est constant, un changement de pente ayant lieu `a chaque changement de valeur de la conductivit´e. Ce sch´ema est appel´e implicite puisqu’on n’obtient pas d’expression du type Ti = . . ., comme pr´ec´edemment, mais un syst`eme d’´equations qu’il faut r´esoudre num´eriquement. Si l’on veut r´esoudre un probl`eme ` a trois dimensions, la m´ethode est la mˆeme dans le principe, la mise un œuvre ´etant un peu plus lourde. Les indices (ℓ, m) de A deviennent composites : m ↔ (i, α) ; α ∈ {x, y, z} et en
´ Fig. 5.3 – Evolution temporelle de la distribution de la temp´erature dans le cas repr´esent´e par la figure 5.2. L’´etat initial est donn´e par T = 0 sur tout le barreau sauf `a la deuxi`eme extr´emit´e o` u elle vaut 2. Le syst`eme ´evolue spontan´ement vers la situation d’´equilibre trouv´ee pr´ec´edemment. L’avantage d’une telle proc´edure est d’´eviter les risques d’instabilit´e num´erique li´es `a la r´esolution du syst`eme d’´equations, mais l’inconv´enient en est un coˆ ut en ressources de calcul qui peut s’av´erer prohibitif. 5.2.2.4
Questions de stabilit´ e
Mˆeme les sch´emas explicites peuvent parfois r´eserver des surprises. . . Reprenons, par exemple, l’´equation de
101
Physique num´erique, Philippe Depondt
Schr¨odinger `a une dimension et d´ependante du temps On est dans la mˆeme situation que pour la m´ethode de Cranck et Nicholson (paragraphe 4.9.5). L’inconnue dans d’une particule dans un potentiel : ce probl`eme est ψ ℓ+1 puisqu’on cherche la fonction d’onde 2 2 ∂ψ(x, t) h ∂ ψ(x, t) ¯ `a l’instant t + δt , la connaissant `a l’instant t. Ainsi : i¯h + V (x)ψ(x, t) =− ∂t 2m ∂x2 δi δi Il est coutumier, dans ce genre de probl`eme, de se placer 1 + i HD ψ ℓ+1 = 1 − i HD ψ ℓ (5.11) 2 2 h ¯ = 1. On peut dans un syst`eme d’unit´es o` uh ¯ = 1 et 2m peut se r´esoudre `a partir d’un syst`eme lin´eaire du type : discr´etiser le probl`eme comme pr´ec´edemment : ψjℓ = ψ(j δx , ℓ δt )
Aψ ℓ+1 = B
Vj = V (j δt )
u A est une matrice tridiagonale n × n et B un vecteur o` u j et ℓ sont des indices entiers, j pour l’espace et ℓ pour o` de n ´el´ements : le temps. Soit : ℓ ℓ ψj+1 + ψj−1 − 2ψjℓ ∂ 2 ψ(x, t) ≃ ∂x2 δx2
A = B
et : ∂ψ(x, t) ≃ ∂t
ψjℓ+1
− δt
Un tel probl`eme -qui suit le sch´ema implicite- se r´esout ais´ement `a l’aide d’un sous-programme de biblioth`eque ad´equat (il s’agit d’une matrice triadiagonale, ce qui simplifie les choses), en prenant soin toutefois de travailler avec des nombres complexes (figures 5.4, 5.5 et 5.6). Un des charmes de cette m´ethode est que la norme de la fonction d’onde est conserv´ee. . .
Cela donne ais´ement : ψjℓ+1
=
ψjℓ
ℓ ℓ ψj+1 + ψj−1 − 2ψjℓ − Vj ψjℓ δx2
+ iδt
=
ψjℓ
!
que l’on peut ´ecrire matriciellement : ψ ℓ+1 = (1 − iδt HD ) ψ ℓ
δi 1 + i HD 2 δi 1 − i HD ψ ℓ 2
(5.10)
o` u HD est l’Hamiltonien discr´etis´e : HD =
..
.
0 0 0
0
et :
..
..
0
2 + Vj−1 δx2 1 − 2 δx 0
0 1 − 2 δx 2 + Vj δx2 1 − 2 δx
0
0
0
. 1 − 2 δx 0
.
0
0
0 0 1 − 2 0 δx 2 1 + Vj+1 − 2 δx2 δx .. .. . .
.. . .. . ψjℓ .. . .. .
0
0
0 0
..
0
0.005
0.01
0.015
10 3.16 1 1 0.316 0.1 0.9 0.8 0.7 0.6 0.5 X 0.4 0.3 0.2 0.1 0 0.02
.
time
Fig. 5.4 – Solution de l’´equation (5.11) dans le cas d’une barri`ere de potentiel qui va de x = 0.5 `a x = 0.75. La condition initiale pour la fonction d’onde est un paquet gaussien centr´e en x = 0.5. Cette figure montre les premiers pas de la simulation : on voit la la densit´e de probabilit´e de pr´esence s’´elargir de pr´ef´erence du cˆ ot´e du puits de potentiel, mais une partie continue `a passer de l’autre cˆ ot´e. Tout cela est fort beau. . . mais le d´efaut d’une telle On voit ´egalement les r´eflexions sur les parois (l’´echelle des m´ethode est qu’elle est instable ! On peut tenter de la courbes de niveaux est logarithmique). stabiliser en la sym´etrisant un peu mieux. En effet, on a appliqu´e l’Hamiltonien discr´etis´e ` a la fonction d’onde `a l’instant t ; on aurait pu tout aussi bien l’appliquer `a la 5.2.2.5 Crit` eres de stabilit´ e fonction d’onde `a l’instant t + δt : ´ Evidemment, la question est de savoir s’il existe des ψ ℓ+1 = ψ ℓ − iδt HD ψ ℓ+1 crit`eres permettant de savoir a priori si un algorithme est stable ou non. Il s’agit malheureusement l` a d’un tr`es vaste Il s’agit de la mˆeme ´equation que (5.10), seulement HD programme ! Les sp´ e cialistes de math´ e matiques appliqu´ees est appliqu´e `a ψ ℓ+1 et non ` a ψ ℓ . Ni l’une, ni l’autre de ces et ceux de m´ecanique d´emontrent de nombreux et fort ´equations n’est enti`erement satisfaisante, alors, on peut beaux th´eor`emes de convergence ou de non-convergence : faire un compromis en faisant une moyenne : c’est h´elas pour un physicien essentiellement pr´eoccup´e de ℓ+1 ℓ savoir si « c¸a marche » ou « comment faire pour que c¸a ψ +ψ ψ ℓ+1 = ψ ℓ − iδt HD marche », un monde quelque peu labyrinthique. . . 2 ℓ ψ =
102
0
Licence de physique L3 : Physique Fondamentale & PHYTEM,
0.005
0.01
10 3.16 1 1 0.316 0.1 0.90.0316 0.8 0.7 0.6 0.5 X 0.4 0.3 0.2 0.1 0 0.02
0.015
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
o` u z(x, t) est le d´eplacement de la poutre `a l’abscisse x et `a l’instant t, ρ sa masse volumique, E le module d’Young du mat´eriau dont elle est constitu´ee et e(x) son ´epaisseur qui peut ˆetre soit constante soit variable le long de la poutre1 . On peut tenter de r´esoudre directement l’´equation ci-dessus `a partir de conditions initiales ad hoc en utilisant les m´ethodes d´ej` a expos´ees, mais on peut aussi ne chercher que les mouvements p´eriodiques en fonction du temps. Dans ce cas, on cherche des solutions du type : z(x, t) = u(x) eiωt ce qui donne :
time
∂4u − c(x)ω 2 u(x) = 0 ∂x4
Fig. 5.5 – Mˆeme chose que la figure 5.4, seulement le paquet initial est centr´e en x = 0.35. On en voit passer avec des notations ´evidentes. n´eanmoins une partie de l’autre cˆ ot´e par effet tunnel. En discr´etisant de la fa¸con habituelle, on obtient sans difficult´e, au bout de quelques lignes de calcul : uℓ+2 − 4uℓ+1 + 6uℓ − 4uℓ−1 + uℓ−2 − δx4 ω 2 uℓ = 0 cℓ Posons :
10 1 0.1 0.01 0 0.002 0.004 0.006 0.008 time 0.01 0.012 0.014
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
0 A= 0 0 0
X
Fig. 5.6 – Mˆeme chose que la figure 5.5 en 3-D (l’´echelle verticale est logarithmique). Il arrive cependant qu’il faille en passer par l` a, quitte a solliciter l’aide d’un sp´ecialiste. Cependant, souvent un ` peu de flair suffit : on a vu avec l’´equation de Schr¨odinger que tenter d’´ecrire des ´equations aussi sym´etriques que possible pouvait arranger des choses. Une autre pr´ecaution a prendre est d’essayer de faire que l’´enorme matrice que ` l’on cherche `a inverser ou diagonaliser soit « aussi diagonale que possible » : autrement dit s’efforcer de rendre les termes les plus ´eloign´es de la diagonale aussi faibles que possible par rapport aux termes diagonaux, ou bien trouver des structures du type « tridiagonale par blocs » que certains algorithmes sont capables de traiter efficacement. 5.2.2.6
..
.
..
.
..
..
.
..
.
.
..
0
0
. −4 cℓ .. .
0
0
0
0
. +1 cℓ
..
..
.
. 6 cℓ .. .
0 .. . −4 cℓ .. .
..
..
..
.
.
u1 .. . U= uℓ . .. un
0 0 +1 cℓ .. . ..
.
0 0 0 0 0 .. . 0 .. .. . . 0
Les valeurs propres λp de A donnent : λp = ωp2 δx4 soit, au coefficient δx4 pr`es, les carr´es des pulsations propres ωp du syst`eme harmonique, c’est-`a-dire les pulsations auxquelles le syst`eme peut vibrer. Les vecteurs propres Up donnent les d´eplacements de la poutre pour chaque « mode propre » de pulsation propre ωp . ` l’aide d’un programme de biblioth`eque appropri´e, rien A de tout cela ne doit poser de gros probl`eme. . . si ce n’est que ce genre de programme « pr´ef`ere » quand la matrice est sym´etrique ! Il suffit de poser alors : ζ(x) iωt z(x, t) = p e c(x)
Syst` emes harmoniques
Des syst`emes harmoniques en mouvement oscillant ce qui donne : peuvent ob´eir `a des syst`emes similaires. Si l’on ´etudie, par 6ζℓ 4ζℓ−1 ζℓ−2 4ζℓ+1 ζℓ+2 exemple, les oscillations harmoniques d’une poutre de sec+ −√ +√ −√ −δ 4 ω 2 ζℓ = 0 √ tion variable, on doit r´esoudre l’´equation suivante (ici l’on cℓ+2 cℓ cℓ−2 cℓ x cℓ+1 cℓ cℓ cℓ−1 cℓ ne tient compte ni du champ de pesanteur, ni d’aucune Posons comme pr´ec´edemment : autre force ext´erieure) : ∂4z ∂2z ρ + =0 ∂x4 Ee2 (x) ∂t2
D= 1 Voir
par exemple G. Bruhat, M´ ecanique, Masson (1967) p. 653.
103
Physique num´erique, Philippe Depondt
..
..
.
0 0 0
..
.
..
. +1 √ cℓ−2 cℓ
0
..
.
..
0
. −4 √ cℓ−1 cℓ .. .
0
0
.
0 .. . −4 √ cℓ+1 cℓ .. . .. .
..
. 6 cℓ .. . .. .
Z=
0
0
0 +1 √ cℓ+2 cℓ .. . .. .
ζ1 .. . ζℓ .. . ζn
0 0 0
..
.
et ´evidemment, les transform´ees inverses : Z V (~r) = V˜ (~q) e−i~q.~r d3 ~q ρ(~r) =
Z
ρ˜(~q) e−i~q.~r d3 ~q
En utilisant les transform´ees inverses, l’´equation de Poisson se re´ecrit : Z Z −i~ q.~ r 3 2 ˜ V e d ~r = − ρ˜ e−i~q.~r d3~r ∇ soit apr`es une d´erivation sous l’int´egrale : Z Z −|~q|2 V˜ e−i~q.~r d3~r = − ρ˜ e−i~q.~r d3~r
Il suffit d’´ecrire explicitement quelques termes pour montrer que D est sym´etrique. Cela ne change rien pour les et : ρ˜(~q) valeurs propres, celles de D sont les mˆemes que celles de A, V˜ (~q) = |~q|2 seulement les vecteurs propres donnent les d´eplacements pond´er´es par c(x) : il suffit d’en tenir compte (voir par extrˆemement facile `a r´esoudre. . . La m´ethode consiste exemple la figure 5.7). donc a` calculer d’abord la transform´ee de Fourier de ρ(~r), diviser le r´esultat par |~q|2 puis retransformer par Fourier 0.1 1 inverse pour obtenir le potentiel V (~r). Tout ceci est tr`es 0.08 2 3 efficace et rapide. En ~q = 0, on a : 4 0.06 5 Z 6 0.04 ˜ V (~q = 0) = V (~r)d3~r 0.02 0
−0.02 −0.04 −0.06 −0.08 −0.1
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
il s’agit simplement de d´efinir la constante arbitraire qui intervient dans le potentiel. Malheureusement, les choses sont parfois un peu retorses comme on peut le constater sur la figure 5.8 puisque les deux charges plac´ees sur un axe horizontal donnent un potentiel qui n’a pas la mˆeme sym´etrie, ce qui est fˆacheux !
Fig. 5.7 – Les six premiers modes propres de vibration d’une poutre homog`ene fix´ee ` a une extr´emit´e (` a gauche) et libre `a l’autre, calcul´es avec 500 points de discr´etisation.
5.2.3
Les m´ ethodes spectrales
Les m´ethodes dites « spectrales » visent ` a profiter de la remarquable efficacit´e des transform´ees de Fourier rapides ou FFT. Elles seront donc utilis´ees pour des calculs particuli`erement lourds car elles ont aussi des d´efauts. 5.2.3.1
Un premier exemple simple
Prenons, par exemple, l’´equation de Poisson de l’´electrostatique : ∇2 V (~r) = −ρ(~r) o` u bien sˆ ur, ρ(~r) est une densit´e de charges et V (~r) le potentiel ´electrostatique correspondant. On peut introduire les transform´ees de Fourier spatiales de ces quantit´es : Fig. 5.8 – Calcul par une m´ethode spectrale `a deux dimenZ sions du potentiel ´electostatique produit par deux charges. i~ q .~ r 3 ˜ V (~ q ) = V (~r) e d ~r En revanche, le mˆeme calcul par diff´erences finies (figure 5.9), bien qu’exigeant sensiblement plus de temps calcul o` u le symbole d3~r indique qu’il s’agit d’un int´egration sur (c’est un sch´ema implicite qui requiert la r´esolution d’un les trois coordonn´ees d’espace. De mˆeme : syst`eme lin´eaire 4096 × 4096, puisque le carr´e de 64 × 64 Z donne 642 = 4096 mailles) fournit un r´esultat bien plus ρ˜(~ q ) = ρ(~r) ei~q.~r d3~r satisfaisant.
104
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
comme indiqu´e `a la fin du paragraphe 5.2.2.2. Il faut toutefois noter que cela suppose, en pratique, un d´ecoupage de l’espace en petits parall´el´epip`edes rectangles de cot´es δx , δy , δz . On peut imaginer de r´e´ecrire les ´equations dans un autre syst`eme de coordonn´ees, mais cela reste relativement limit´e. Beaucoup de probl`emes peuvent ˆetre ainsi r´esolus, mais quid, par exemple, de l’´ecoulement de l’air autour d’une aile d’avion, de la recherche des modes de vibration d’une carrosserie de voiture ou du refroidissement d’une bouteille en verre moul´ee au sortir du moule ? Les g´eom´etries complexes de ces probl`emes risquent de mal s’accomoder du d´ecoupage, tr`es rigide, en petits cubes ou en ´el´ements tr`es simples. Dans les probl`emes de g´eom´etrie compliqu´ee, la m´ethode des ´el´ements finis est plus adapt´ee, ce qui en fait un outil tr`es r´epandu dans le monde industriel.
Fig. 5.9 – Calcul par une m´ethode de diff´erences finies du mˆeme potentiel ´electostatique que dans la figure 5.8. L’on retiendra de cet exemple que les hypoth`eses inh´erentes `a la tranform´ee de Fourier discr`ete (p´eriodicit´e, etc.) peuvent jouer des tours comme on le sait. Il reste des cas pour lesquels, `a cause, par exemple, du volume des calculs mis en œuvre, l’on n’a gu`ere le choix que d’utiliser la vitesse de la FFT : des pr´ecautions s’imposeront alors ! 5.2.3.2
L’´ equation de Schr¨ odinger (encore !)
Celle-ci s’´ecrit une fois de plus : i¯h
∂ψ(~r, t) h2 2 ¯ − ∇ ψ(~r, t) + V (~r)ψ(~r, t) ∂t 2m
Si l’on applique la mˆeme m´ethode que ci-dessus, on obFig. 5.10 – Un exemple de maillage `a deux dimentient apr`es quelques calculs sans difficult´e bien qu’un peu sions pour le calcul des caract´eristiques d’une aile d’avion laborieux (on a trois transform´ees de Fourier spatiales et (http ://fun3d.larc.nasa.gov/example-20.html). une temporelle) : Z ˜ ~ h2 ψ(ω, q) ˜ ~q) = − ¯ ˜ ~q′ )d~ −¯hω ψ(ω, V˜ (~ q′ − ~ q )ψ(ω, q′ + 2m q 2 avec des notations similaires ` a ce qui pr´ec`ede. On obtient sans grande surprise un produit de convolution. Celui-ci peut ˆetre tr`es rapide ` a calculer si V˜ (~ q ) est bien localis´e (i.e. V (~r) varie lentement) et donc l’int´egrale ais´ee `a calculer ; au contraire, si V (~r) est localis´e, avec des variations rapides, le produit de convolution dans l’espace r´eciproque sera extrˆemement laborieux ` a obtenir. . . on retrouve ici la bonne vieille propri´et´e des transform´ees de Fourier : avec des fonctions localis´ees, on a g´en´eralement int´erˆet `a travailler dans l’espace direct (l’espace de ~r), au contraire, s’il s’agit de fonctions « proches » d’ondes planes, l’espace r´eciproque (l’espace des ~ q ) est plus efficace.
Au lieu d’approximer les d´eriv´ees partielles comme dans l’´equation (5.4), on approxime la fonction f (x, y, z) recherch´ee par un d´eveloppement local sur une base de fonctions. On fait ainsi un maillage de l’espace (voir la figure 5.10), en g´en´eral avec de petits t´etra`edres de tailles variables de telle fa¸con que la g´eom´etrie du maillage suive d’assez pr`es celle du probl`eme : dans le cas de l’aile d’avion, par exemple, les « mailles » seront plus petites et plus resserr´ees pr`es du bord d’attaque de l’aile, l` a o` u le flux d’air subit les d´eviations les plus brutales, les champs de vitesse et de pression pr´esentent des variations importantes. Dans chaque maille Mp , la fonction recherch´ee fait l’objet d’un d´eveloppement sur une base de fonctions ϕj (x, y, z) : X p vj ϕj (x, y, z), (x, y, z) ∈ Mp f (x, y, z) ≃ j
5.2.4
Introduction aux ´ el´ ements finis
les vjp ´etant les coefficients du d´eveloppement dans cette Pratiquement tous les exemples ci-dessus sont unidi- maille. mensionnels pour des raisons de simplification ´evidente. Le Comme les fonctions ϕj sont connues, choisies par l’utipassage `a trois dimensions peut se faire dans tous les cas lisateur, leurs d´eriv´ees partielles sont calculables et les
105
Physique num´erique, Philippe Depondt
d´eriv´ees partielles de f s’´ecrivent : ∂f (x, y, z) X p ∂ϕj (x, y, z) vj ≃ ∂x ∂x j Tr`es souvent, les fonctions ϕj sont tout simplement des polynˆomes de telle fa¸con que leurs d´eriv´ees soient faciles a obtenir. ` En g´en´eral, on se retrouve avec un tr`es grand syst`eme d’´equations `a r´esoudre dont les inconnues sont les coefficients vjp . A titre d’exemple, le probl`eme du paragraphe 5.4 est trait´e ici, bien qu’il soit absurde d’utiliser les ´el´ements finis dans ce cas qui se r´esout facilement par diff´erences finies ! Il s’agit simplement de montrer ici le principe de la m´ethode. Dans ce cas, les mailles sont de nouveaux des petits intervalles d’indice p. Sur un intervalle, la temp´erature s’´ecrit : T (x) = ap x2 + bp x + cp si
δx δx xp − p < x < xp + p , δxp = xp − xp−1 2 2 o` u xp est le milieu du p-i`eme intervalle. La temp´erature n’est donc pas consid´er´ee comme une constante dans l’intervalle comme c’´etait le cas avec la m´ethode des diff´erences finies. La base de fonctions est ici limit´ee `a trois monˆ omes de degr´es 0, 1 et 2. Les inconnues sont les coefficients ap , bp et cp . Dans le p-i`eme intervalle, l’´equation de diffusion de la chaleur (5.8) s’´ecrit en tenant compte des expressions des d´eriv´ees : ∂κ(xp ) ˙ p) (2ap x + bp ) + κ(xp )2ap = −Q(x ∂x
a` une ´echelle suffisamment grande pour que la structure atomique de la mati`ere n’intervienne pas. Lorsqu’on se pr´eoccupe de question se situant `a une ´echelle plus petite, il faut bien sˆ ur adopter une mod´elisation appropri´ee o` u la mati`ere est consid´er´ee comme constitu´ee d’atomes.
5.3.1
Matrice dynamique
On a vu, `a propos des probl`emes de valeurs propres (§ 4.5.4), que beaucoup de questions pouvaient se ramener `a un probl`eme de matrice dynamique dont on cherche les valeurs propres et les vecteurs propres. Pratiquement tous les probl`emes d’oscillateurs harmoniques coupl´es peuvent ˆetre avantageusement abord´es de la sorte. Plusieurs probl`emes de cet ordre, suffisamment diff´erents pour montrer la force de cette approche, sont d´ecrits ci-dessous. 5.3.1.1
La chaˆıne unidimensionnelle d´ esordonn´ ee
Consid´erons d’abord la dynamique d’une chaˆıne unidimensionnelle harmonique d’atomes : le probl`eme est math´ematiquement assez proche de celui du paragraphe 5.2.2.6. La chaˆıne est repr´esent´ee en figure 5.11 ; l’´equation du mouvement en est bien connue : m¨ xℓ = κ(xℓ+1 − xℓ ) + κ(xℓ−1 − xℓ ) o` u m est la masse des atomes tous identiques, κ la raideur des «ressorts » et xℓ le d´eplacement par rapport `a sa position d’´equilibre de l’atome ℓ. La distance entre les positions d’´equilibre des atomes est a.
m
κ
Cependant, la temp´erature doit ˆetre continue aux joncFig. 5.11 – La chaˆıne lin´eaire unidimensionnelle d’atomes tions des intervalles, soit : identiques ap (xp + δxp+1 )2 + bp (xp + δxp+1 ) + cp = Dans ce genre de probl`eme, on cherche des solutions de ap+1 (xp + δxp+1 )2 + bp+1 (xp + δxp+1 ) + cp+1 type onde plane o` u ω est la pulsation de l’onde, q son vecteur d’onde : De mˆeme les d´eriv´ees premi`eres : 2ap (xp + δxp+1 ) + bp = 2ap+1 (xp + δxp+1 ) + bp+1 On obtient ainsi un syst`eme de 3n ´equations ` a 3n inconnues (puisque l’on `a une base de 3 fonctions, cela n’a rien a voir avec la dimensionnalit´e) que l’on peut r´esoudre par ` les m´ethodes habituelles. Si le principe en est simple, l’´ecriture de programmes d’´el´ements finis est assez lourde. Le maillage a` lui seul n’est pas simple. Il s’agit cependant d’un probl`eme assez modulaire sur le plan informatique : le choix du maillage, par exemple, est pratiquement ind´ependant du traitement a proprement parler des ´equations aux d´eriv´ees partielles. ` Ainsi, les utilisateurs semblent pr´ef´erer utiliser des programmes d´ej` a existants qui, en g´en´eral, s’adaptent assez bien `a chaque probl`eme particulier. Point n’est besoin de r´einventer ce qui existe d´ej` a!
5.3
La mati` ere comme une collection de particules.
Tous les probl`emes ci-dessus, ` a l’exception bien sˆ ur de l’´equation de Schr¨odinger, reposent sur une mod´elisation
xℓ = x0 ei(ωt−qℓa) et l’on obtient l’´equation de dispersion habituelle : r κ qa ω=2 sin m 2
Mais si le syst`eme pr´esente du d´esordre, par exemple si l’on introduit des impuret´es, c’est-`a-dire des atomes de types diff´erents, κ et m d´ependent du site ℓ : κ doit ˆetre remplac´e par κℓ,ℓ+1 (la raideur entre les sites ℓ et ℓ + 1) et m par mℓ , mℓ x ¨ℓ = κℓ,ℓ+1 (xℓ+1 − xℓ ) + κℓ−1,ℓ (xℓ−1 − xℓ ) On peut tenter une r´esolution analytique par des m´ethodes perturbatives, mais le cas d’un fort d´esordre paraˆıt difficile `a traiter et la g´en´eralisation `a trois dimensions probl´ematique (car le probl`eme est en g´en´eral trait´e `a l’aide d’une m´ethode dite de « matrice de transfert » intrins`equement unidimensionnelle.) Toutefois, on peut aussi poser : uℓ xℓ = √ eiωt mℓ
106
Licence de physique L3 : Physique Fondamentale & PHYTEM,
on se d´ebarrasse alors de la d´ependance temporelle, mais on ne postule plus la p´eriodicit´e spatiale comme pr´ec´edemment, puisque uℓ d´epend de ℓ, c’est-` a-dire du site. On obtient le syst`eme d’´equations suivant : ω 2 uℓ
κℓ,ℓ−1 uℓ−1 −√ mℓ−1 mℓ κℓ+1,ℓ + κℓ,ℓ−1 κℓ+1,ℓ + uℓ − √ uℓ+1 mℓ mℓ mℓ+1
=
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
de structure dynamique » dont les maxima fournissent ce qui tient lieu de « courbe de dispersion » (figure 5.12) qui ressemble `a ce que pourrait donner une exp´erience, par exemple, de diffusion in´elastique de neutrons. On peut ´egalement regarder, ce qui paraˆıt pour le moins difficile `a r´ealiser exp´erimentalement, les mouvements correspondants `a diff´erents points de la figure 5.12 : par exemple, en figure 5.13.
La matrice dynamique D de dimension n × n compos´ees des coefficients du syst`eme s’´ecrit : D=
..
.
..
.
0
..
.
..
.
..
0
−√
0
. κℓ+1,ℓ + κℓ,ℓ−1 mℓ .. .
κℓ,ℓ−1 mℓ−1 mℓ 0
0
0
0
−√
0
0
0 κℓ+1,ℓ mℓ mℓ+1 .. . .. .
0 0 ..
.
..
.
et le probl`eme revient ` a chercher valeurs propres ω 2 , les u1 u2 .. . et les vecteurs propres U = uℓ de cette matrice . .. un dynamique. Comme pour l’exemple de la poutre 5.2.2.6, il y a des programmes de biblioth`eque qui font cela tr`es bien ! (surtout si la matrice est creuse, ce qui est toujours le cas –` a 1-D, elle est mˆeme tridiagonale–).
3
40 20 10 5
2.5 2 1.5 1 0.5 0
0.5
1
1.5
2
2.5
3
0
freq
Fig. 5.13 – Deux vecteurs propres. En haut, un vecteur propre du d´ebut de la courbe de dispersion (ω ≃ 0,6), peu affect´e par le d´esordre. En bas, un vecteur propre nonpropagatif, localis´e sur des impuret´es (ω ≃ 2,2). Ainsi, l’on peut directement ´etablir une relation entre des r´esultats « exp´erimentaux » et des processus qui ont lieu au niveau microscopique. .
q
5.3.1.2 Dynamique d’une mol´ ecule Fig. 5.12 – Facteur de structure dynamique d’une chaˆıne La dynamique d’une mol´ecule unidimensionnelle `a trois d´esordonn´ee de 100 atomes. Cela revient ` a la courbe de dispersion d’une onde acoustique dans la chaˆıne. On ob- atomes sera d’abord d´ecrite pour pr´eciser les principes de serve une branche « normale » pour les basses fr´equences la m´ethode de fa¸con sch´ematique, puis on g´en´eralisera `a et une composante `a haute fr´equence due au d´esordre (les des cas plus g´en´eraux. impuret´es dans cet exemple ´etant plus l´eg`eres). ` une dimension, trois atomes. Soient 5.3.1.2.1 A La matrice U donne les d´eplacements atomiques en donc trois atomes align´es, de masses m1 , m2 et m3 . Ils fonction du num´ero du site, autrement dit de la position sont li´es par un potentiel harmonique, de telle fa¸con que ri = a×i : une transform´ee de Fourier spatiale des vecteurs l’´energie potentielle d’interaction entre 1 et 2 s’´ecrive propres doit donc donner quelque chose qui d´epend du vecteur d’onde q, or il y a ´egalement d´ependance en fonction 1 V12 = k(x1 − x2 )2 de la pulsation ω. On obtient alors S(q, ω), le « facteur 2
107
Physique num´erique, Philippe Depondt
` trois dimensions, N atomes. On o` u x1 et x2 sont les d´eplacements des atomes 1 et 2 par 5.3.1.2.2 A rapport `a leur position d’´equilibre. De mˆeme, r´ealise, `a la lumi`ere de l’exemple ci-dessus, que d`es que la matrice dynamique a une dimension qui d´epasse 3, 1 ′ 2 le calcul devient inextricable, or la dimension de D est V23 = k (x2 − x3 ) 2 le nombre de degr´es de libert´e du syst`eme : pratiquement toutes les mol´ecules ´echappent `a cette analyse ! k k’ ´ Evidemment, comme cela a d´ej` a ´et´e montr´e, la r´esolution num´erique est beaucoup plus ais´ee. Essayons de poser le probl`eme de fa¸con plus g´en´erale : soit une mol´ecule de N atomes de masses mℓ situ´ees m1 m2 m3 On n´eglige l’interaction entre 1 et 3. Les ´equations du aux coordonn´ees ~rℓ . On suppose que l’on est capable de calculer l’´energie potentielle du syst`eme V ({~rℓ )}, ℓ ∈ mouvement s’´ecrivent simplement : [1, N ]. On suppose ´egalement que l’on connait les positions (0) m1 x ¨1 = k(x2 − x1) d’´equilibre des atomes ~rℓ . Afin de simplifier les notations, on pose que : m2 x ¨2 = k(x1 − x2) + k ′ (x3 − x2 ) m3 x ¨3
=
k(x2 − x3)
qk = rℓ,α ℓ ∈ [1, N ], α ∈ [1, 3], k = 3(ℓ − 1) + α
De la mˆeme fa¸con que pour la chaˆıne lin´eaire d’atomes, on o` u α indice les trois coordonn´ees de l’espace. L’indice k pose : varie de 1 `a 3N , c’est-`a-dire le nombre de degr´es de libert´e du syst`eme. Les ´equations du mouvement2 s’´ecrivent : u1 x1 = √ eiωt m1 ∂V u2 iωt ∀k ∈ [1, 3N ] mk q¨k = − x2 = √ e ∂qk m2 u3 Les d´eriv´ees sont prises en {qk } : comme on s’int´eresse `a x3 = √ eiωt m3 un syst`eme harmonique, on peut faire un d´eveloppement (0) limit´e autour de la position d’´equilibre {qk }, ainsi : X ∂2V √ u1 u2 ∂V ∂V (0) (0) −√ ) − m1 ω 2 u1 = k( √ ′′ ({qk′ }) = ({qk′ }) + ′′ ({qk′ })(qk − qk ) m2 m1 ∂qk ∂qk ∂q ∂q k k k′′ √ u2 u3 u2 u1 − √ ) + k′ ( √ −√ ) − m2 ω 2 u2 = k( √ Les d´eriv´ees de l’´energie potentielle `a l’´equilibre m1 m2 m3 m2 ∂V √ (0) u u 2 3 ({qk′ }) sont nulles, et les ´equations du mouvement − m3 ω 2 u3 = k( √ −√ ) ∂qk m2 m3 se re´ecrivent : En termes matriciels : X ∂2V (0) (0) ′ m q ¨ = k k k ′ ({qk′′ })(qk − qk′ ) √ k ∂q ∂q − 0 k k ′ m m m u1 1 1 2 k ′ k+k′ − √mk2 m3 U = u2 D = − √mk1 m2 m2 (0) ′ k′ En posant xk = (qk − qk ) (les d´eplacements par rapport u3 0 − √mk2 m3 m3 `a l’´equilibre), on obtient : et X mk x ¨k = − (5.12) Ck,k′ xk′ ω 2 U = DU k′
La recherche des valeurs propres revient ` a la recherche u Ck,k′ est la matrice des d´eriv´ees secondes de l’´energie des racines de |D − ω 2 I| = 0 : a priori, cela donne un o` polynˆome en ω 6 , mais compte tenu de la solution ω = 0 potentielle, ce qui nous ram`ene `a une forme famili`ere : il correspondant `a la translation d’ensemble de la mol´ecule reste `a appliquer la proc´edure habituelle, (car |D| = 0), on obtient une ´equation bicarr´ee en ω : uk xk = √ eiωt mk ′ k(m + m ) + k (m + m ) m + m + m 1 2 2 3 1 2 3 ω4− ω 2 +kk ′ = 0 et X Ck,k′ m1 m2 m3 m1 m2 m3 ω 2 uk = uk ′ √ mk mk ′ soit k′ 1 k(m1 + m2 ) + k ′ (m2 + m3 ) ω2 = × soit, comme avant : 2 m1 m2 m3 s ! ω 2 U = DU m m m (m + m + m ) 1 2 3 1 2 3 1 ± 1 − 4kk ′ k(m1 + m2 ) + k ′ (m2 + m3 ) Il est ais´e de v´erifier que la matrice D est sym´etrique. Il « suffit » de r´einjecter ces solutions dans l’´equation aux valeurs propres pour obtenir les vecteurs propres et les d´eplacements atomiques correspondant ` a chaque valeur propre.
2 Ici, les variables sont des variables spatiales (x, y, z), mais, fort souvent dans les syst` emes m´ ecaniques comportant par exemple des contraintes, la situation est plus complexe : on a alors souvent int´ erˆ et ∂L d ∂L = . a ` utiliser les notations Lagrangiennes : L = K − V et dt ∂ q˙ℓ ∂qℓ
108
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Si le formalisme est nettemement plus lourd que pr´ec´edemment, la physique est sensiblement la mˆeme ; cependant la m´ethode qui vient d’ˆetre expos´ee a le m´erite d’ˆetre d’utilisation quasiment automatique, ` a partir de la connaissance des potentiels d’interaction et des positions d’´equilibre3 .
1 2 0
3
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
=
ℓ,ℓ′
=
X ℓ,ℓ′
∂Sℓ ∂Sℓ′ ∂2V ∂Sℓ ∂Sℓ′ ∂xk ∂xk′ ∂2V gk,ℓ gk′ ,ℓ′ ∂Sℓ ∂Sℓ′
(5.13)
La matrice G nous donne ainsi, non seulement le lien entre les coordonn´ees cart´esiennes (pour lesquelles les ´equations sont simples) et les coordonn´ees internes (pour lesquelles le calcul de l’´energie et de ses d´eriv´ees et « naturelle »), mais aussi celui entre les coefficients de couplage dans les deux syst`emes. Il reste `a d´efinir les Sℓ . Il y a d´ej` a 4 variables internes ´evidentes : les ´elongations des quatre liaisons radiales : S1 S2 S3 S4
4
X
= = = =
(~ ρ1 − ρ ~0 ) · ~e1 (~ ρ2 − ρ ~0 ) · ~e2 (~ ρ3 − ρ ~0 ) · ~e3 (~ ρ4 − ρ ~0 ) · ~e4
Fig. 5.14 – Une mol´ecule t´etra´edrique, par exemple CH4 u les vecteurs ~ei sont les vecteurs unitaires le longs des ou C Cl4 . L’atome central est num´erot´e 0 et les quatre o` liaisons (0, i) : ~ei = (~ri − ~r0 ) /|~ri − ~r0 |. On obtient alors autres : 1, 2, 3, 4. assez ais´ement : 5.3.1.2.3 Calcul pour une mol´ ecule t´ etra` edrique. ~si,ℓ = ~eℓ si i = ℓ ℓ ∈ [1, 4] Imaginons, par exemple, une mol´ecule t´etra`edrique ~s0,ℓ = −~eℓ ℓ ∈ [1, 4] (fig. 5.14) : a priori, comme on a 5 atomes et trois degr´es ~si,ℓ = 0 sinon. de libert´e par atomes, soit quinze degr´es de libert´e en x tout, la matrice dynamique est (15 × 15). Toutefois la si,ℓ translation et la rotation d’ensemble de la mol´ecule ne o` syi,ℓ . u ~si,ℓ = nous int´eressent pas : 3 degr´es de libert´e translationnels szi,ℓ et 3 degr´es de libert´e rotationnels (pour une mol´ecule triLes angles entre les liaisons paraissent aussi ˆetre des vadimensionnelle) ne sont pas pertinents ; de fa¸con g´en´erale, riables assez naturelles, mais c’est un peu plus compliqu´e d de pour une mol´ecule `a N atomes, on doit aboutir ` a 3N −6 va- puisqu’un simple d´enombrement donne θ12 (l’angle 102 riables internes et une matrice dynamique (3N − 6 × 3N − sommet l’atome 0 qui se situe entre les liaisons 0 − 1 et 6), soit (9 × 9) ici. Comme nous sommes dans une approxi- 0 − 2), θ13 , θ14 , θ23 , θ24 , θ34 , c’est-`a-dire six angles, or il mation harmonique, on consid`ere que les d´eplacements n’en faut que cinq puisqu’on a d´ej` a quatre variables S1 `a ρ ~i , ∀i ∈ [1, N ] des atomes par rapport ` a leurs positions S4 et qu’on en attend 9 en tout : c’est que ces angles ne d’´equilibre ~ri sont petits, ainsi on peut ´ecrire une relation sont pas ind´ependants. On peut poser lin´eaire entre les variables internes Sℓ , ℓ ∈ [1, 3N − 6] et ~hi ~ri + ρ ~i − ~r0 − ρ ~0 les d´eplacements atomiques : = ~εi = |~ri + ρ ~i − ~r0 − ρ ~0 | |~hi | N X X α La diff´erence entre ~εi et ~ei est que le premier comprend les Sℓ = sα i,ℓ ρi d´eplacements ρ ~i : `a l’´equilibre ces vecteurs sont identiques. i=1 α=x,y,z On a : o` u α repr´esente les trois directions de l’espace et les sα i,ℓ cos θi,j = ~εi · ~εj sont les coefficients de ce d´eveloppement au premier ordre. Si l’on ´ecrit comme pr´ec´edemment k = 3(i − 1) + α et On peut diff´erencier cette expression : xk = ρα d (cos θi,j ) = − sin θi,j dθi,j = d~εi · ~εj + ~εi · d~εj i , alors X o` u Sℓ = gℓ,k xk avec gℓ,k = sα i,ℓ d~hi |~hi | − ~hi d|~hi | k d~εi = |~hi |2 ou q 1 2~hi · d~hi S =G·x |~hi |2 = = or d~hi = ρ~i − ρ~0 , et d|hi | = d 2 |~hi | en notations matricielles. A priori, la matrice G n’est pas ~ei · (~ ρi − ρ ~0 ) = Si , ainsi : carr´ee puisqu’elle est (3N − 6 × 3N ).
Ainsi les ceofficients qui apparaissent dans l’´equation (5.12) peuvent s’´ecrire : Ck,k′
=
∂2V ∂xk ∂xk′
3 Voir par exemple : E. B. Wilson Jr., J. C. Decius, P. C. Cross, Molecular vibrations (1955) re´ ed. Dover (1980), chap. 4.
d~εi =
ρ ~i − ρ ~0 Si − ~ei |~ri − ~r0 | |~ri − ~r0 |
En posant que les ´el´ements diff´erenciels dθi,j = ηi,j sont les variations angulaires correspondant au mouvements dits « de libration », on obtient apr`es quelques lignes de calcul : |~ei ∧ ~ej | ηi,j =
109
Physique num´erique, Philippe Depondt
ρ ~0 − ρ~j ρ~0 − ρ ~i · ~ej + · ~ei + |~ri − ~r0 | |~rj − ~r0 |
Sj Si ~ei · ~ej + |~ri − ~r0 | |~rj − ~r0 |
Si l’on pose, par exemple : S5 = η12 , S6 = η13 , S7 = η14 , S8 = η23 , S9 = η24 , S10 = η34
s’´ecrivent alors m1 x ¨1,ℓ
=
mk x¨k,ℓ mp x ¨p,ℓ
= =
cp,1 (xp,ℓ−1 − x1,ℓ ) + c2,1 (x2,ℓ − x1,ℓ )
ck−1,k (xk−1,ℓ − xk,ℓ ) + ck+1,k (xk+1,ℓ − xk,ℓ ) cp−1,p (xp−1,ℓ − xp,ℓ ) + c1,p (x1,ℓ+1 − xp,ℓ )
o` u mk est la masse de l’atome de type k et les ck,k′ les constantes d’interaction entre les atomes k et k ′ . On s’est ~e1 − ~e2 1 1 limit´e ici aux interactions entre premiers voisins, mais ~s05 = − on peut g´en´eraliser sans difficult´es. . . autres que « tech|~e1 ∧ ~e2 | |~r2 − ~r0 | |~r1 − ~r0 | niques » ! etc. Comme les mailles se succ`edent en restant identiques L’´energie potentielle de la mol´ecule peut s’´ecrire en fonc- les unes aux autres, notre syst`eme est p´eriodique et nous tion des variables internes : pouvons chercher des solutions de type onde plane :
cela permet d’obtenir,
4
V ({~ ρk }) =
1X 1X 2 ki (~ ρi − ρ ~0 ) 2 + cij ηij (5.14) 2 i=1 2
uk xk,ℓ = √ ei(ωt−q(ℓa+Xk )) mk
i = 1, 3 j = i + 1, 4
o` u q est le vecteur d’onde de l’onde plane. Jusqu’ici, nous n’avons rien fait de nouveau par rapport `a la chaˆıne unidi1 mensionnelle `a un type d’atomes, sinon des am´enagements ki Si2 = 2 i=1 pour tenir compte du nombre d’atomes par maille, ce qui ne fait qu’alourdir les notations sans apporter grand-chose Dans l’´equation (5.14), le premier terme correspond a` de nouveau. . . Si l’on poursuit dans la mˆeme voie, on doit l’allongement des liaisons et le deuxi`eme aux oscillations injecter ces expressions d’ondes planes dans les ´equations lat´erales, les mouvements de libration. Les coefficients ki du mouvement ; on obtient : et cij correspondent aux d´eriv´ees secondes de l’´equation u1 −iqX1 up −iq(Xp −a) 2 −iqX1 e − −ω u1 e = cp,1 √ + e (5.13). m1 mp m1 On constate que, dans cet exemple, la difficult´e ne tient u1 −iqX1 u2 pas tant `a la m´ethode elle-mˆeme qui n’a rien de partie−iqX2 − e c2,1 √ m1 m2 m1 culi`erement nouveau par rapport ` a ce que l’on a d´ej` a vu uk−1 uk −iqXk dans les paragraphes pr´ec´edents, mais dans une mise en 2 −iqXk −iqXk−1 −ω uk e = ck−1,k √ e − e + mk mk−1 mk œuvre de la g´eom´etrie de la mol´ecule. 10 X
5.3.1.3
Dynamique de r´ eseau
ck+1,k
√
uk −iqXk uk+1 e−iqXk−1 − e mk mk+1 mk
Cette technique qui utilise la matrice dynamique est −ω 2 up e−iqXp = cp−1,p √ up−1 e−iqXp−1 − up e−iqXp + mp mp−1 mp extensible `a un r´eseau p´eriodique d’atomes, c’est-`a-dire un cristal. Elle recouvre que qu’on appelle la « dynaup −iqXp u1 −iq(Xp +a) e − e c1,p √ mique de r´eseau » et elle est tr`es utilis´ee pour interpr´eter mp m1 mp des exp´eriences de spectroscopie optique ou neutronique qui servent `a d´eterminer les modes de vibrations pr´esents Apr`es quelques manipulations simples, cela donne : dans des syst`emes qui peuvent ˆetre assez compliqu´es. cp,1 e−iq(Xp −X1 −a) cp,1 + c2,1 u1 up + Sa limite cependant est que les interactions entre les ω 2 u1 = − √ m1 mp m1 atomes doivent pouvoir ˆetre trait´es dans l’approximac2,1 e−iq(X2 −X1 ) tion harmonique ce qui impose plusieurs contraintes : u2 − √ que les positions d’´equilibre soient d´ej` a connues, donc la m1 m2 structure microscopique du mat´eriau ´etablie et que les ck−1,k e−iq(Xk−1 −Xk ) ck−1,k ck+1,k uk−1 + uk d´eplacements atomiques restent suffisamment petits pour ω 2 uk = − √ mk mk−1 mk qu’un d´eveloppement limit´e au premier ordre des forces ck+1,k e−iq(Xk−1 −Xk ) soit possible. uk+1 − √ Prenons, pour simplifier les notations, le cas unidimenmk mk+1 sionnel : nous avons une chaˆıne unidimensionnelle infinie cp−1,p e−iq(Xp−1 −Xp ) cp−1,p + c1,p up−1 + up (et non finie comme dans le § 5.3.1.2.1) avec p atomes ω 2 up = − √ mp mp−1 mp par maille, ces mailles ´etant ind´efiniment r´ep´et´ees. Chaque c1,p e−iq(X1 −Xp +a) atome est en principe rep´er´e par 2 indices, ℓ le num´ero de − u1 √ la maille (qui va de −∞ ` a +∞) et k le num´ero de l’atome mp m1 dans la maille ℓ (k ∈ [1, p]). La position d’´equilibre de On constate qu’une fois de plus on tombe sur un l’atome k, ℓ est donc probl`eme aux valeurs propres, la matrice dynamique ´etant maintenant p × p, donc a priori moins grosse qu’avant. . . Xk,ℓ = ℓa + Xk toutefois, comme le vecteur d’onde apparaˆıt dans la mao` u a est le param`etre de maille et Xk la position dans la trice, il faudra r´esoudre le probl`eme un grand nombre de maille. Les d´eplacements des atomes par rapport `a ces po- fois, soit une fois pour chaque valeur souhait´ee du vecsitions d’´equilibre sont xk,ℓ ; les ´equations du mouvement teur d’onde. La matrice dynamique elle-mˆeme est devenue
110
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
complexe `a cause des termes en eiqx , toutefois les termes Il existe cependant une solution : les tirages au sort ou sym´etriques par rapport ` a la diagonale sont conjugu´es Monte-Carlo comme on l’a vu au paragraphe 4.11.6. l’une de l’autre : la matrice est hermitique et il suffira de choisir un sous-programme de biblioth`eque appropri´e.
5.3.2
Simulations Monte-Carlo.
Dans un autre ordre d’id´ees, on peut ne pas connaˆıtre la structure microscopique d’un mat´eriau et donc la chercher sans se pr´eoccuper de la dynamique. Si l’on connait les constituants de ce mat´eriau, on peut rechercher l’´etat d’´equilibre de ce syst`eme d’atomes ` a condition de connaˆıtre les potentiels d’interaction atome-atome : V ({~ri }) o` u V est l’´energie potentielle de l’ensemble des atomes du syst`eme consid´er´e en fonction des distances interatomiques ~ri . On ´ecrit souvent V comme une somme de potentiels `a deux corps : X vi,j (ri,j ) (5.15) V ({~ri }) =
o` u le symbole
X
d´esigne une somme sur toutes les paires
d’atomes (i, j) (il y en a n(n−1) ) et vi,j (ri,j ) est l’´energie 2 potentielle de deux atomes i et j connaissant leur distance ri,j , mais il arrive que l’on doive faire des choses plus compliqu´ees pour tenir compte du fait, par exemple, que l’interaction entre deux atomes puisse ˆetre perturb´ee par la pr´esence d’un troisi`eme.
f
Fig. 5.16 – Syst`eme de spins pos´es sur un r´eseau triangulaire, par simulation Monte-Carlo. Une structuration complexe en vortex s’´etablit (E. Yu. Vedmedenko, A. Ghazali, J.-C.S. L´evy Phys. Rev. B 59 (1999) 3329). Les applications en sont nombreuses, voir par exemple la figure 5.16. Comme le r´esultat d´epend de la temp´erature, on peut ´etudier l’´evolution du syst`eme en fonction de la temp´erature, ses ´eventuels changement de structure, les transitions de phase. On peut ´egalement introduire dans l’´energie potentielle des contraintes comme la pression ext´erieure et faire des ´etudes en fonction de cela. Contrairement `a ce que l’on pourrait penser, cette m´ethode est relativement rapide par rapport `a d’autres m´ethodes microscopiques. On est, certes, dans le domaine du calcul lourd, les temps de calcul se chiffrent en heures ou en jours, mais on a, avec un ordinateur moyennement puissant, la possibilit´e de traiter des « gros » syst`emes, jusqu’` a environ un million d’atomes, ce qui est largement suffisant pour un nombre incroyablement ´elev´e de probl`emes.
x Fig. 5.15 – Quand on recherche num´eriquement le minimum d’une fonction, on part d’un point de d´epart et l’on fait une analyse locale de la fonction afin de trouver un point –meilleur– qui peut servir de nouveau point de d´epart (fl`eche pleine). La plupart des algorithmes est incapable de suivre la trajectoire indiqu´ee par la fl`eche tiret´ee. . .
La restriction principale vient de ce qu’on n’a pas acc`es aux mouvements atomiques en fonction du temps ou aux fr´equences des modes de vibration, ou seulement de fa¸con tr`es indirecte.
5.3.3
Simulations de dynamique mol´ eculaire.
Si l’on veut ´etudier la dynamique d’un syst`eme C’est un probl`eme de recherche du minimum d’une foncd’atomes, le plus simple est de s’attaquer `a la r´esolution tion d’un grand nombre de variables, les positions atonum´erique des ´equations du mouvement (classiques) de ce miques ; il existe des m´ethodes pour faire cela (e.g. grasyst`eme : dient conjugu´e), mais lorsqu’elles convergent vers un minimum, il est tr`es difficile de savoir s’il s’agit d’un minimum local ou DU minimum de la fonction (figure 5.15) ! mℓ ~r¨ℓ = f~ℓ (~r1 . . . ~rℓ′ . . . ~rN ), ∀ℓ ∈ [1, N ]
111
Physique num´erique, Philippe Depondt
o` u:
vants (voir par exemple les figures 5.18 et 5.19) : nombre d’atomes : N ≃ 104 longueurs d’onde accessibles : λ ≤ 10nm pas de temps d’int´egration : δt ≃ 10−3 ps dur´ee accessible : τ ≃ 103 ps fr´equences accessibles : 10−2 tHz ≤ ν ≤ 10tHz A priori, on travaille `a E = K + V = Cste et `a volume constant, mais on peut aussi fixer P et T . Maintenir la pression constante, plutˆ ot que le volume est utile pour simuler des transitions de phase ou des changements structuraux, voire simplement tenir compte de la dilatation. Maintenir la temp´erature constante permet de traiter par exemple des ph´enom`enes dissipatifs, tels que diffusion de (5.16) la chaleur `a l’´echelle microscopique. On a perdu, par rapport `a la m´ethode de Monte-Carlo, deux ordres de grandeur pour le nombre d’atomes maximum que l’on peut inclure dans le syst`eme, mais en contrepartie, comme on a la dynamique, on peut suivre l’´evolution temporelle du syst`eme, ´etudier les vibrations (la gamme de fr´equence accessible est celle des vibrations acoustiques dans la mati`ere condens´ee). Le mˆeme type de simulation peut servir pour l’´etude de syst`emes fort diff´erents et tr`es divers comme les grains d’un tas de sable ou les ´etoiles dans une galaxie !
∂V ∂xℓ ~ V = − ∂V f~ℓ = −grad ℓ ∂yℓ ∂V ∂zℓ et, par exemple avec un potentiel d’interaction de paire de type Lennard-Jones (figure 5.17) : 12 6 ! σij 1X 1X σij V (~rij ) = εij −2 V = 2 i,j 2 i,j rij rij
1
0.5
0
−0.5
−1 0
1
2
3
4
5
5.3.4
Simulations ab-initio.
C PB
Toutefois, la faiblesse des m´ethodes ci-dessus, simulaFig. 5.17 – Le potentiel de Lennard-Jones de l’´equation tion Monte-Carlo ou dynamique mol´eculaire, est qu’elles (5.16), pour σij = 1 et εij = 1. Le potentiel est attractif supposent que les potentiels d’interaction soient connus pour rij > σij , r´epulsif dans le cas contraire, la distance et mod´elisables avec une pr´ecision suffisante. Les expresd’´equilibre ´etant σij . sions de type Lennard-Jones ou analogues ne sont que des mod`eles dont on esp`ere qu’ils rendent compte de la r´ealit´e Il s’agit d’un tr`es gros syst`eme d’´equations de mani`ere satisfaisante. Il arrive que ce ne soit pas le diff´erentielles d´ependantes du temps que l’on peut cas, simplement parce que l’on ne dispose pas d’expression r´esoudre num´eriquement par les m´ethodes habituelles (en analytique valide dans un domaine suffisant de distances g´en´eral Verlet). Cela suppose toutefois que l’on dispose interatomique, ou bien que l’interaction soit modifi´ee par de mod`eles d’interaction entre les atomes, par exemple l’environnement : Lennard-Jones comme ci-dessus. – quand on simule une surface, le nombre de voisins d’un type d’atome donn´e n’est pas le mˆeme selon que PBC l’atome consid´er´e est dans le cœur de l’´echantillon ou en surface : la forme de l’interaction de cet atome avec Substrate ces voisins peut en ˆetre affect´ee Adsorbate – des atomes ou des mol´ecules dont les nuages ´electroniques sont fortement modifi´es par la pr´esence ou non d’autres atomes, – si l’on comprime le milieu de fa¸con que les noyaux se rapprochent suffisemment pour modifier les nuages ´electroniques – ... On peut introduire des potentiels `a trois corps, voire Fig. 5.18 – Un exemple de simulation de dynamique plus, afin de tenir compte de l’effet que la pr´esence d’un mol´eculaire pour ´etudier le frottement d’un adsorbat sur troisi`eme atome peut avoir sur l’interaction entre deux un substrat. La substrat est constitu´e de 18×18×4 mailles autres atomes, on peut ´egalement introduire des charges cubiques `a faces centr´ees. Chacune des deux surfaces libres qui peuvent se d´eplacer dans certaines conditions : tous est recouverte d’une monocouche de 288 atomes d’un autre ces mod`eles restent cependant assez ph´enom´enologiques. type (soit un total de 5760 atomes). L’on exerce des forces Toutefois, d`es que l’on s’int´eresse, par exemple, aux liens ext´erieures oppos´ees sur l’adsorbat et le substrat afin de entre propri´et´es structurales et propri´et´es ´electroniques les faire glisser l’un sur l’autre (Ph. Depondt, A. Ghazali, d’un mat´eriau, on peut aussi tenter de revenir aux prinJ.-C. S. L´evy, Surf. Science 419 (1998) 29). cipes fondamentaux et faire ce que l’on appelle des simulations ab-initio (` a partir du d´ebut). Dans ce cas, Avec un ordinateur « raisonnablement » puissant, l’on on ne fait pas d’hypoth`ese sur la forme des interactions atteint sans difficult´e majeure les ordres de grandeurs sui- mais on consid`ere un ensemble de noyaux avec leurs
112
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Fig. 5.19 – Vue de dessus de l’adsorbat (gris sombre) et d’une couche du substrat (gris clair) de la figure 5.18, `a gauche avant glissement, `a droite apr`es. nuages ´electroniques. En principe, on doit alors r´esoudre et l’´equation de Schr¨odinger se re´ecrit comme avant l’´equation de Schr¨odinger de n noyaux de num´ero aton ψi+1,j,k − 2ψi,j,k + ψi−1,j,k X − Zi ´electrons en interaction. mique Zi et δx2 i=1 ψi,j+1,k − 2ψi,j,k + ψi,j−1,k − δy 2 5.3.4.1 Une petite contrari´ et´ e ψi,j,k+1 − 2ψi,j,k + ψi,j,k−1 − Malheureusement, on ne peut pas attaquer le probl`eme δz 2 +Vi,j,k ψi,j,k = E ψi,j,k avec des m´ethodes comme celle ´etudi´ee dans le paragraphe 5.2.2.4 : il n’existe pas au monde d’ordinateur assez puissant pour le faire ! Pour illustrer ce propos, revenons `a Le triplet (i, j, k) prend alors n3 valeurs5 , ainsi la mal’´equation de Schr¨odinger ind´ependante du temps `a une trice dont on cherche les valeurs propres est de dimension dimension et `a une particule dans un potentiel : c’est le n3 × n3 , soit 106 ×106 si n = 100 : le probl`eme s’est brutalecas le plus simple. La fonction d’onde ψ qui d´ecrit l’´etat du ment amplifi´e de fa¸con d´emesur´ee. . ., et nous n’en sommes a une seule particule ! Passons `a un probl`eme a syst`eme est une fonction ` a une variable, et l’on obtient4 : encore qu’` priori simple, l’atome d’hydrog`ene : un proton et un neu∂ 2 ψ(x) tron, soit deux particules en interaction, `a trois dimenHψ = Eψ ≡ − + V (x)ψ(x) = Eψ(x) sions, soit 6 variables. Le mˆeme raisonnement nous m`ene ∂x2 `a estimer l’ordre de grandeur du probl`eme `a 1012 × 1012 En discr´etisant le probl`eme de la fa¸con habituelle, (toujours avec 100 points par variable) : mˆeme avec un ordinateur tr`es puissant, c’est sans espoir ! xi = i δx, Vi = V (xi ), ψi = ψ(xi ) Conclusion : il ne suffit pas, pour r´esoudre un probl`eme, de « le mettre dans l’ordinateur » et d’attendre que la force l’´equation se re´ecrit : brute de la machine fasse son œuvre. Il faut donc faire des ψi+1 − 2ψi + ψi−1 approximations. + Vi ψi = Eψi − δx2 Il est ais´e de se convaincre que, chercher E et ψi , i ∈ [1, n], revient `a chercher les valeurs propres et les vecteurs propres d’une matrice (n × n) : si n est de l’ordre de 100, voire davantage, il n’y a rien de bien extraordinaire `a cela. Imaginons maintenant le mˆeme probl`eme ` a trois dimensions : la discr´etisation implique un triplet d’indices (i, j, k) xi = i δx,
yj = j δy,
zk = k δk
ψi,j,k = ψ(xi , yj , zk ) Vi,j,k = V (xi , yj , zk ) ¯2 4 en posant h = 1. 2m
5.3.4.2
L’approximation de Born-Oppenheimer
La premi`ere ´etape consiste `a d´ecoupler les mouvements des ´electrons de ceux des noyaux beaucoup plus lourds et beaucoup plus lents (c’est l’approximation de BornOppenheimer). Pour le mouvement des noyaux, on se contente en g´en´eral d’une dynamique classique. Cette dynamique est lente par rapport `a celle des ´electrons, ainsi, on fait l’hypoth`ese que le nuage ´electronique est toujours 5 en g´ en´ eral, on renum´ erote les sites pour n’avoir qu’un seul indice ℓ = i + n(j − 1) + n2 (k − 1) dont on v´ erifie ais´ ement qu’il varie de 1 a ` n3 .
113
Physique num´erique, Philippe Depondt
en ´equilibre, qu’il s’adapte instantan´ement ` a un changement de configuration des noyaux. D’un point de vue quantique, il ne reste plus qu’` a r´esoudre l’´equation de Schr¨odinger ´electronique : pour l’hydrog`ene, on revient `a un probl`eme `a une particule. Le probl`eme reste cependant entier d`es lors que l’on s’int´eresse ` a, ne serait-ce qu’un atome d’h´elium isol´e. Il faut donc encore aller quelques pas plus loin : il existe ` a ce titre plusieurs approches possibles.
C’est ce qu’on appelle la m´ethode de Hartree. Elle pr´esente un ´enorme d´efaut : a priori, les ´electrons sont des fermions et leur fonction d’onde devrait ˆetre antisym´etrique, c’est-`a-dire changer de signe par permutation de deux ´electrons : ψ(~r1 , . . . , ~ri , ~rj , . . . , ~rn ) = −ψ(~r1 , . . . , ~rj , ~ri , . . . , ~rn )
Si l’on choisit de remplacer cette fonction d’onde par un simple produit de fonctions mono-´electroniques, il est clair que cette propri´et´e ne sera pas remplie. Pour r´egler cette 5.3.4.3 Les m´ ethodes de Hartree et Hartree-Fock question, on remplace ce produit pas un d´eterminant, apImaginons d’abord, pour simplifier, une fonction `a deux pel´e d´eterminant de Slater : variables ψ(x1 , x2 ) : on peut en faire un d´eveloppement χ1 (~r1 ) χ2 (~r1 ) . . . χn (~r1 ) a un ordre quelconque par rapport ` ` a x2 , sur une base de χ1 (~r2 ) χ2 (~r2 ) . . . χn (~r2 ) ψ(~ r , ~ r , . . . , ~ r ) ∼ 1 2 n fonctions appropri´ees ϕℓ2 (x2 ) : ... ... ... . . . χ1 (~rn ) χ2 (~rn ) . . . χn (~rn ) X cℓ2 ϕℓ2 (x2 ) ψ(x1 , x2 ) = qui assure la propri´et´e d’antisym´etrie : si l’on permute ℓ2 deux ´electrons, cela revient `a permuter deux lignes et mais, ´evidemment, les coefficients du d´eveloppement cℓ2 donc `a changer le signe du d´eterminant. Ainsi corrig´ee, sont des fonctions de x1 , suscptibles d’un d´eveloppement la m´ethode s’appelle la m´ethode de Hartree-Fock : bien analogue : X qu’assez lourde et n´ecessitant un travail non-trivial de aℓ1 ,ℓ2 φℓ1 (x2 ) cℓ2 (x1 ) = mod´elisation des fonctions χℓ , elle est tr`es utilis´ee, noℓ1 tamment par les chimistes th´eoriciens, pour des calculs de et : fonctions d’onde mol´eculaires. X aℓ1 ,ℓ2 φℓ1 (x1 )ϕℓ2 (x2 ) ψ(x1 , x2 ) = ℓ1 ,ℓ2
5.3.4.4 Th´ eorie de la fonctionnelle densit´ e On peut, bien sˆ ur g´en´eraliser ce genre de raisonnement La th´eorie de la fonctionnelle densit´e (Density funca un nombre quelconque de variables. Maintenant, l’ap` tional theory ou DFT7 ) est, elle, une th´eorie, au d´epart, proximation est faite d’entr´ee de jeu et elle est massive : on remplace la fonction d’onde poly-´electronique par un exacte, mais dont la mise en œuvre pratique oblige `a des approximations. produit de fonctions d’onde mono-´electroniques, ce qui reL’id´ee qui sous-tend la m´ethode est que le d´etail des vient `a se limiter au premier ordre du d´eveloppement : fonctions d’onde de tous les ´electrons n’est pas ce dont on a r´eellement besoin : la densit´e ´electronique ρ(~r) suffit bien. ψ(~r1 , ~r2 , ~r3 . . . , ~rn ) ∼ ϕ1 (~r1 ) ϕ2 (~r2 ) ϕ3 (~r3 ) . . . ϕn (~rn ) Le r´esultat de cela, si c’´etait possible, serait de substituer `a On montre apr`es quelques calculs6 que le probl`eme s’´ecrit : une fonction compliqu´ee de 3n variables ψ(~r1 , ~r2 , . . . , ~rn ), une fonction de trois variables, ρ(~r) telle que N X X ∆ 1 Z Z i i − + |ϕj > ϕi (~ri ) < ϕj | ~ 2 |~ r − ~ r | ρ(~r) = n |ψ(~r, ~r2 , . . . , ~rn )|2 d~r2 . . . d~rn i j ri − RI | j I=1 |~ = εi ϕi (~ri ) ∀i
Il n’est pas ´evident a priori qu’une telle op´eration soit possible, car en consid´erant l’´equation de Schr¨odinger, si o` u ∆i est l’op´erateur laplacien relatif ` a l’´electron i : on essaye d’int´egrer, en multipliant `a gauche par ψ ∗ , sur ∂2 ∂2 ∂2 toutes les positions, sauf une, pour faire apparaˆıtre la den∆i = + 2+ 2 sit´e ´electronique, ∂x2i ∂yi ∂zi Z Z ∗ ~ I la position du noyau I, ~ri celle de l’´electron i R ψ Hψ d~r2 . . . d~rn = ψ ∗ Eψ d~r2 . . . d~rn = E ρ(~r) et εi l’´energie de l’´etat ϕi . On obtient un syst`eme d’´equations coupl´ees par l’interm´ediaire du terme d’in- le deuxi`eme membre ne pose pas de probl`eme parce que 1 |ϕj > qui E est un nombre scalaire, et la densit´e ´electronique vient teraction ´electron-´electron Ji,j =< ϕj | |~ri − ~rj | naturellement. En revanche, le premier membre comporte m´elange les termes li´es ` a i et j. On r´esout alors ce syst`eme un op´erateur (avec des d´eriv´ees, etc.) que l’on ne peut pas de mani`ere auto-coh´erente : on choisit d’abord un en- commuter avec la fonction d’onde8 . [0] semble de fonctions d’onde d’essai ϕi (~ri ) qui permettent Des th´eor`emes dˆ us `a Hohenberg et Kohn montrent que de calculer les termes Ji,j . Cela permet de r´esoudre le si, dans l’approximation de Born-Oppenheimer, on ´ecrit syst`eme d’´equations qui donne de nouvelles fonctions l’Hamiltonien comme [1] [1] ϕi (~ri ) et des valeurs des ´energies εi . De nouvelles vaH = Te + Vee + Vext leurs de Ji,j sont alors calcul´ees puis de nouvelles fonc[2] 7a a ce que les solutions tions ϕi (~ri ) et ainsi de suite jusqu’` ` ne pas confondre avec l’autre DFT, la discrete Fourier transform. trouv´ees n’´evoluent plus. 8 6 il
n’est pas question ici de d´ etailler ces m´ ethodes, mais seulement d’en donner a flavor, un parfum, comme disent les anglo-saxons.
Parce que l’op´ erateur d´ erivation, par exemple, s’applique a ` ce qui se trouve a ` sa droite et non a ` ce qui se trouve a ` sa gauche : ∂ ∂ ∂ f (x) 6= f ∗ (x)f (x) ∂x = |f (x)|2 ∂x . f ∗ (x) ∂x
114
Licence de physique L3 : Physique Fondamentale & PHYTEM,
o` u l’on a d´ecompos´e en ´energie cin´etique des ´electrons (Te ), ´energie potentielle d’interaction ´electron-´electron (Vee ) et interaction ´electrons-noyaux (Vext ), les deux premiers termes ne d´ependent que du nombre d’´electrons, ils sont pour ainsi dire universels. Le dernier terme d´epend des noyaux et donc du syst`eme ´etudi´e. L’´energie de l’´etat fondamental peut alors s’´ecrire comme une fonctionnelle9 de la densit´e ´electronique Z E(ρ) = F (ρ) + ρ(~r)Vext (~r)d~r
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
en tenant compte, par exemple, de la d´eformabilit´e des nuages ´electroniques en fonction des positions de noyaux. Leur gros d´efaut est que, mˆeme s’il existe des m´ethodes de calcul efficaces, ces m´ethodes sont terriblement voraces en temps de calcul ! Ainsi des ordres de grandeurs r´ealistes seraient : <
N ∼ 300 τ ≃ 1ps
Malgr´e ces d´efauts, elles ont leurs lettres de noblesse, par exemple, les phases `a haute pression de la glace (liaison hydrog`ene) ou la silice vitreuse. Ces m´ethodes font l’objet de programmes, soit commerciaux, soit libres, qui se r´epandent assez rapidement dans les laboratoires pour devenir des outils relativement standards. Cependant, comme on l’a vu, ces m´ethodes se limitent `a l’´etat ´electronique fondamental. . . lorsqu’on veut s’attaquer `a des ´etats excit´es, pour comparer les calculs avec des le nombre d’´electrons dans le syst`eme. La petite difficult´e qui subsiste et que l’expression de exp´eriences de spectroscopies diverses, il existe d’autres uteuses encore en resF (ρ), bien qu’universelle, est inconnue ! (c’est quelque m´ethodes plus complexes et plus coˆ sources de calcul ! Autant dire que c’est un domaine dans chose comme < ψ|Te + Vee |ψ > mais le but de l’op´eration lequel la recherche est active en ce d´ e but du XXIe si`ecle. . . ´etait justement d’ignorer les fonctions d’ondes). La m´ethode de Kohn et Sham10 consiste ` a r´ealiser que, puisque ce qui nous int´eresse est la densit´e ´electronique et non les fonctions d’onde, n’importe quel jeu de fonctions d’onde qui donne la mˆeme densit´e ´electronique est acceptable ! Ainsi, on remplace un syst`eme de N ´electrons en interaction par N autres particules fictives mais ind´ependantes ; chacune de ces particules fictives est soumise `a un potentiel effectif qui contient le potentiel ext´erieur Vext et l’effet des ´electrons. On en arrive `a une th´eorie similaire `a celle de Hartree-Fock, mais elle n’est pas le r´esultat d’une approximation, elle est, jusqu’` a ce point au moins, exacte. Z E(ρ) = Ts (ρ) + EH (ρ) + ρ(~r)V (~r)d~r + Exc (ρ) o` u F (ρ) regroupe les deux premiers termes universels et ρ est la densit´e ´electronique -que l’on cherche- de l’´etat fondamental. Pour obtenir ρ, il faut alors chercher la fonction ρ qui rend E(ρ) minimum avec, bien sˆ ur, la contrainte que Z ρ(~r)d~r = N
o` u Ts est l’´energie d’un syst`eme sans interaction, EH l’´energie de Hartree, Z Z 1 ρ(~r)ρ(~r′ ) EH (ρ) = d~r d~r′ 2 |~r − ~r′ |
Les trois premiers termes peuvent ˆetre calcul´es sans probl`eme particulier ; toutes les difficult´es r´esident dans le terme Exc , dit « d’´echange et corr´elation ». Si on l’oublie, ce sont les effets quantiques qui disparaissent de la th´eorie ! En effet, la densit´e ´electronique ne fait pas apparaˆıtre explicitement ces effets11 , il faut les introduire explicitement «` a la main » pour ainsi dire. . . C’est ici que se situent les approximations de cette th´eorie : les diff´erentes variantes (qui s’appellent pour les plus r´epandues LDA et GGA) partent en g´en´eral de l’approximation que ρ(~r) est essentiellement homog`ene, ou du moins, varie lentement. Les m´ethodes ab-initio ne sont donc pas des m´ethodes sans hypoth`ese mais elle permettent n´eanmoins d’atteindre les interactions interatomiques tr`es pr´ecis´ement 9 Une
fonctionnelle est une fonction dont la variable est une autre fonction, E est une fonction de ρ, elle-mˆ eme une fonction de ~ r. 10 Ces th´ eories datent des ann´ ees 1960. 11 comme le principe d’exclusion qui rend la fonction d’onde antisym´ etrique par permutation de deux atomes : cela n’apparaˆıt ´ evidemment pas explicitement dans la densit´ e´ electronique.
Chapitre 6
Optimisation de code. L’optimisation de code n’est certes pas un sujet tr`es exaltant, surtout que les calculs d´ecrits ci-dessus sont en g´en´eral rapidement ex´ecut´es mˆeme sur un PC de puissance m´ediocre. Il faut cependant ˆetre prudent : si l’on ne fait pas attention, on arrive facilement ` a fabriquer des probl`emes tr`es lourds ! Imaginons par exemple que l’on cherche, par Monte-Carlo-Metropolis, la structure d’un ensemble de quelques dizaines de milliers d’atomes (un tout petit ´echantillon) en interaction ` a diverses temp´erature afin d’obtenir un diagramme de phase : la figure 4.49, par exemple, repr´esente des journ´ees de calcul. . . Les m´ethodes ab-initio d´ecrites dans le paragraphe pr´ec´edent sont ´evidemment redoutablement voraces ! Il faut donc utiliser des m´ethodes de programmation efficaces afin d’en r´eduire autant que possible le coˆ ut en ressources informatiques. Par exemple, si l’on arrive ` a optimiser un calcul de telle fa¸con qu’au lieu de 24 heures, il n’en prenne que 15, non seulement le gain est app´eciable dans l’absolu, mais on peut esp´erer d´emarrer un calcul le soir avant de rentrer chez soi pour en r´ecuperer les r´esultats le lendemain matin : les ordinateurs sont des machines qui peuvent travailler la nuit sans inconv´enient, leurs utilisateurs des humains qui pr´ef`erent dormir. . . Une premi`ere pr´ecaution ` a prendre est d’utiliser les options d’optimisation du compilateur, par exemple avec g95 : g95 -O3 simul.f90 -o simul o` u l’option -O3 dit au compilateur de chercher ` a optimiser le code propos´e1. Le compilateur n´eanmoins, mˆeme s’il est parfois ´etonnament efficace, ne peut pas tout faire et il est prudent d’appliquer soi-mˆeme quelques r`egles simples.
! les constantes sont calculees hors de la boucle pi = acos(-1.0) iomega = 2*pi*freq*(0.,1.) ! nbr complexe do it = itmin, itmax x = exp(iomega*it*dt) enddo on imagine ais´ement que la seconde sera plus rapide !
6.2
Utiliser les sym´ etries.
Le deuxi`eme exemple est un peu plus ´elabor´e : on doit calculer, par exemple pour une simulation Monte-Carlo l’´energie potentielle d’un ensemble d’atomes en interaction : 1 X V = vij (rij ) 2 i,j,(j6=i)
soit sous forme de programme : v = 0. do i = 1, n do j = 1, n if ( i /= j ) then rij = sqrt( (x(i)-x(j))**2 + & (y(i)-y(j))**2 + (z(i)-z(j))**2 ) v = v + energie(rij) endif enddo enddo v = v/2
ce qui donne n(n − 1) calculs d’´energie `a faire. Or, on calcule ici la mˆeme ´energie deux fois : vij et vji , c’est inutile. ´ 6.1 Eviter les calculs inutiles n(n − 1) paires Si l’on s’y prend un peu mieux, il n’y a que 2 C’est une consigne qui paraˆıt stupide ` a premi`ere vue, (i, j) : en pratique, le programme ci-dessus fait deux fois cependant, si l’on compare les deux s´equences suivantes : trop de calculs ! Celui qui est donn´e ci-dessous est nettement meilleur : ! les constantes sont calculees dans la boucle do i = 1, n-1 do it = itmin, itmax do j = i+1, n t = i*dt ; pi = acos(-1.0) rij = sqrt( (x(i)-x(j))**2 + & omega = 2*pi*freq (y(i)-y(j))**2 + (z(i)-z(j))**2 ) x = exp((0.,1.)*omega*t) ! exp complexe v = v + energie(rij) enddo enddo enddo et 1 il y a en g´ en´ eral plusieurs degr´ es d’optimisation : -O1, -O2, -O3. Sur un PC avec un processeur Pentium, on peut tenter aussi : -mtune=pentium4. Chaque compilateur a ses propres options, plus ou moins adapt´ ees a ` tel ou tel processeur : c’est parfois un peu labyrinthique. . .
Ainsi donc, la simple ´etude pr´ealable de la sym´etrie d’un probl`eme permet parfois des gains consid´erables : point n’est besoin de refaire plusieurs fois un calcul qui donnera toujours, pour des raisons de sym´etrie, le mˆeme r´esultat.
115
116
6.3
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Stocker des r´ esultats interm´ e- 6.4 Utilisation des caches diaires. Dit ainsi, cela paraˆıt tr`es savant, toutefois l’id´ee sous-
jacente est tr`es simple. Un des goulets d’´etranglement Imaginons que nous devions faire le produit de trois principaux d’un ordinateur est l’´echange d’information matrices n × n : entre la m´emoire vive o` u est stock´ee l’information, proD=A·B·C gramme et donn´ees, et le processeur o` u s’effectuent les calculs. Sur certaines machines, cette communication est soit : X am´elior´ee grˆace `a du mat´eriel performant, mais ce sont di,j = ai,k bk,l cl,j des technologies coˆ uteuses. Sur la plupart des ordinateur k,l d’usage courant pour le calcul scientifique, les construcce qui se programme ais´ement : teurs pr´ef`erent utiliser une « m´emoire cache », c’est-`adire un espace m´emoire, de plus petite dimension que la do i = 1, n m´emoire vive, tr`es rapide et install´ee de fa¸con que le prodo j = 1, n cesseur n’ait pas besoin de passer par les moyens normaux d(i,j) = 0. de communication pour y acc´eder. Ainsi, pour optimiser do k = 1, n les transferts, au lieu de transmettre les donn´ees une `a do l = 1, n d(i,j) = d(i,j) + a(i,k)*b(k,l)*c(l,j) une, lorsque le processeur a besoin de quelque chose dans enddo la m´emoire vive, tout un bloc lui est transmis. De cette enddo fa¸con, les donn´ees contig¨ ues en m´emoire de celle qui est enddo requise sont ´egalement transmises au processeur. enddo La cons´equence en est que si, id´ealement, toutes les Cela repr´esente quatre boucles de n ´el´ements, soit n4 cal- donn´ees n´ecessaires `a l’ex´ecution du programme se trouculs `a faire. Si n vaut ne serait-ce que 100, on obtient vaient dans ce bloc, il n’y aurait plus besoin que d’une la bagatelle de 108 (cent millions) de calculs. . . On peut requˆete au d´ebut et une autre `a la fin du travail, r´esultant cependant pr´evoir un tableau interm´ediaire e(n,n) pour en une acc´el´eration consid´erable du calcul. Il est ´evidemment tr`es difficile de faire que toutes stocker le produit B · C. Le produit des trois matrices est les donn´ees n´ecessaires soient rang´ees dans la m´emoire alors d´ecompos´e en deux : cache, cependant, on peut retenir de ceci qu’il est bon que les donn´ees n´ecessaires soient contig¨ ues en m´emoire E = B·C vive : elle seront ainsi transf´er´ees par bloc au processeur D = A·E au lieu d’ˆetre transf´er´ees une `a une. Pour faire cela, il suffit de se rappeler que les ´el´ements des tableaux sont On obtient alors le morceau de programme suivant : rang´es l’un `a cˆ ot´e de l’autre en m´emoire et que donc do i = 1, n les transferts de tableaux sont plus efficaces que ceux do j = 1, n de scalaires : cependant il est tr`es rare que l’on ait `a e(i,j) = 0. transf´erer des scalaires en tr`es grand nombre et le gain do k = 1, n est faible : il n’est pas utile de fabriquer artificiellement e(i,j) = e(i,j) + b(i,k)*c(k,j) des tableaux pour regrouper des ´el´ements disparates. En enddo revanche, cela a une cons´equence tr`es importante pour les enddo tableaux multi-dimensionnels. Par exemple, en fortran, enddo un tableau bidimensionnel x(m,n) est stok´e comme suit : do i = 1, n x(1,1),x(2,1),...,x(m,1),x(1,2),x(2,2),..., do j = 1, n x(m,2),x(1,3),x(2,3),...,x(m,n) d(i,j) = 0. do k = 1, n c’est-`a-dire que « le premier indice va plus vite » (c’est le d(i,j) = d(i,j) + a(i,k)*e(k,j) contraire en langage C). Donc la s´equence : enddo enddo enddo
C’est un peu plus compliqu´e, c¸a prend plus de m´emoire, mais il n’y a plus que 2 × n3 op´erations ` a faire (soit, dans le cas de n = 100, 2 × 106 , deux millions d’op´erations, un gain d’un facteur 50 par rapport au cas pr´ec´edent !) Si l’on regarde d’un peu plus pr`es le premier calcul, on s’aper¸coit que le produit b(k,l)*c(l,j) ne d´epend pas de i : or on refait le mˆeme calcul pour toutes les valeurs de i, n fois trop souvent. . . En fait, la version qui utilise les tableaux globalement s’´ecrit beaucoup plus facilement :
do j = 1, n x(:,j) = ..... enddo sera sans doute plus rapide que : do i = 1, m x(i,:) = ..... enddo
puisque, dans le premier cas, le processeur va travailler sur les donn´ees dans l’ordre o` u elles sont rang´ees en m´emoire et le compilateur n’aura aucun mal `a optimiser les transferts de blocs. Exercice : dans le cas du produit de trois matrices cid = matmul(a,matmul(b,c)) dessus, constater que l’on ne peut pas appliquer directequi est transparent de ce point de vue, bien que compre- ment ce principe. Introduire un tableau suppl´ementaire nant le mˆeme nombre de calculs. s(k) qui permette de le faire (pour chaque i, copier
117
Physique num´erique, Philippe Depondt
b(i,k) dans s(k) et utiliser s dans le produit, puis faire la mˆeme chose pour a). ´ Evidemment, tout ceci suppose d’entrer un peu dans l’architecture de l’ordinateur que l’on utilise, mais l’essentiel des machines en service actuellement suit peu ou prou la mˆeme logique et un programme efficace sur un PC a de bonnes chances de l’ˆetre ´egalement sur d’autres machines (j’ai ´ecrit et optimis´e des programmes sur un PC 486 d´ej` a p´erim´e `a l’´epoque - sous DOS qui se sont r´ev´el´es tr`es efficaces sur. . . CRAY, une machine vectorielle de conception tr`es diff´erente : seulement l’une et l’autre travaillaient efficacement sur les tableaux de nombres contigus). Ce qui est vrai des donn´ees l’est aussi pour les instructions du programme. Les instructions qui se suivent dans un programme se suivent ´egalement en m´emoire, mais l’appel a` un sous-programme ou ` a une fonction brise souvent cette s´equence ce qui produit en g´en´eral un appel `a la m´emoire vive et donc un ralentissement. Afin de conserver l’avantage consid´erable de la programmation structur´ee permise par les sous-programmes et fonctions, les compilateurs permettent en g´en´eral ce que l’on appelle l’« inlining », c’est-`a-dire qu’ils recopient un sous-programme beaucoup utilis´e directement dans le programme appelant de fa¸con que les instructions se succ`edent en m´emoire. Donc, si l’on a ´ecrit une structure qui ressemble ` a:
6.6
Ne pas r´ einventer ce qui existe d´ ej` a
En g´en´eral, les biblioth`eques de calcul scientifique, quand il y en a, implant´ees sur un ordinateur donn´e sont optimis´ees pour l’architecture de cette machine. Donc, sauf cas particulier, il est souvent plus efficace en termes de temps de calcul (pour ne pas parler du temps de programmation) d’utiliser un sous-programme pris dans une bonne biblioth`eque install´ee par un professionnel que de chercher `a r´einventer la roue. . . De mˆeme, en dehors de toute consid´eration d’optimisation suivant une architecture donn´ee, il existe un bagage ´enorme d’algorithmes efficaces qu’il serait stupide de ne pas utiliser : ainsi la FFT est consid´erablement plus rapide que : do k = 1, n s(k) = (0.,0.) do l = 1, n s(k) = s(k) + f(l)*exp((2*pi*i*k*l)/n) enddo enddo
et un programme de tri suivant un algorithme ´eprouv´e sera vraisemblablement plus efficace, parfois de plusieurs ordres de grandeur, que ce que l’on aura pu inventer soi-mˆeme. Il est vrai qu’il faut alors enquˆeter pour savoir ce qui est do i = 1, beaucoup disponible sur une machine donn´ee, les syntaxes d’appel call machin(arg1,arg2,...) (nature, type des arguments, etc.). Il faut g´en´eralement enddo aussi indiquer lors de la compilation que l’on utilise telle il peut ˆetre habile de consulter le manuel du compilateur ou telle biblioth`eque : la plupart des compilateurs utilise l’option -lnom de la biblioth`eque. Par exemple, pour linutilis´e afin de chercher ` a invoquer l’in-lining. pack (qui contient des FFT entre autres) : g95 -O3 machin.f90 -llinpack -o machin
— En fin de compte, si malgr´e tous ses efforts, un programme prend `a l’ex´ecution un temps prohibitif, il reste Imaginons un calcul du champ magn´etique subi par un deux possibilit´es : 1o limiter ses ambitions ou 2o utiliser spin, dˆ u `a tous les autres spins : une machine plus puissante, ce qui signifie en g´en´eral X s’adresser `a un centre de calcul disposant d’ordinateurs ~i = ~ ij H H puissants et s’attaquer `a de la programmation parall`ele, j c’est-`a-dire utiliser plusieurs processeurs simultan´ement. j6=i
6.5
Eviter les interruptions
Il faut ´evidemment ´eviter le terme i = j qui donnerait l’infini. On peut imaginer une structure comme : do i = 1, n hij(:) = (expression) h(i) = sum(hij(1:i-1)) + sum(hij(i+1:n)) enddo
ou quelque chose avec where. Toutefois, il est souvent plus efficace d’´ecrire : do i = 1, n hij(:) = (expression) hij(i) = 0. h(i) = sum(hij) enddo
la somme des hij se fait sans interruption ce qui fait gagner plus de temps que n’en fait perdre l’introduction du terme nul inutile. Cela d´epend parfois du compilateur, du (ou des) processeur(s), de l’adaptation de l’un et de(s) l’autre(s) : il vaut parfois la peine de faire quelques essais.
118
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Chapitre 7
Calculs tr` es lourds : vectorisation et parall´ elisation High performance computing ! Calcul scientifique intensif ! Teraflops ! Petaflops ! Exaflops ! Ce sont des expressions-clefs que l’on voit apparaˆıtre de fa¸con r´ecurrente pour dire que l’on calcule toujours plus, sur des probl`emes toujours plus gros. . . Or, si les puissances de calcul des processeurs croissent ` a une vitesse qui donne le vertige, les besoins en calculs lourds croissent encore plus vite. De plus, bien des raisons portent ` a croire que la limite de ce que l’on peut faire en la mati`ere n’est pas tr`es loin : bien sˆ ur, ce genre de pr´ediction est vou´ee `a ˆetre d´ementie d’une fa¸con ou d’une autre, toutefois, l’´evolution des strat´egies d’´equipement des centres de calcul semble montrer que cette pr´eoccupation est partag´ee. Une option s´eduisante est alors d’associer plusieurs unit´es de calcul dans un mˆeme ordinateur ou de lier plusieurs ordinateurs pour qu’ils puissent joindre leurs forces sur un probl`eme donn´e. Par exemple, la plupart des processeurs comportent des unit´es distinctes sp´ecialis´ees dans les additions et multiplications de nombres r´eels. En g´en´eral, lorsqu’on soumet une instruction complexe associant additions et multiplications, ces unit´es peuvent travailler simultan´ement sur des morceaux diff´erents de l’instruction. On peut toutefois aller beaucoup plus loin.
7.1
L’architecture vectorielle
L’architecture dite « pipe-line » permet d’associer, pour ainsi dire « en tuyau » plusieurs processeurs ` a la suite les uns des autres qui travaillent en suivant le principe « je fais ma petite part de travail et je passe ` a mon voisin ». Un exemple ´el´ementaire est tout simplement l’existence de m´emoires-tampon : si l’on envoie un texte ou une image en impression sur une imprimante, celle-ci est tr`es lente par rapport au processeur de l’ordinateur ; donc en pratique, on envoie la tˆ ache d’impression dans une m´emoire dite « tampon »(ou buffer ) de telle fa¸con que le processeur puisse s’occuper d’autre chose pendant l’impression. Plus s´erieusement, lorsqu’on travaille dans une boucle avec des instructions composites sur des tableaux, chaque processeur fera quelque chose (une addition par exemple) sur un ´el´ement du tableau et passera le r´esultat ` a son voisin, et sans attendre que ledit voisin ait fini son travail, passera a l’´el´ement suivant du tableau. Ainsi, tous les processeurs ` travaillent en mˆeme temps sur des ´el´ements diff´erents du tableau. Par exemple, la boucle : do i = 1, n a(i) = b(i) + c(i) enddo
avec quatre processeurs en pipe-line, s’ex´ecutera de la fa¸con suivante : cycle 1 2 3 4 i -
proc 1 lit b(1) lit b(2) lit b(3) lit b(4) b(i) -
proc 2 . lit c(1) lit c(2) lit c(3) c(i-1) -
proc 3 . . b(1)+c(1) b(2)+c(2) b(i-2)+c(i-2) -
proc 4 . . . ´ecrit a(1) a(i-3) -
De cette mani`ere, au i-i`eme cycle, le premier processeur va chercher en m´emoire le i-i`eme ´el´ement de b, le deuxi`eme le i-1-i`eme ´el´em´ent de c, le troisi`eme fera l’addition des i-2-i`emes et le quatri`eme processeur ´ecrira en m´emoire le i-3-i`eme r´esultat : les quatre processeurs travaillent `a 100% ! On r´ealise ais´ement que le d´emarrage et la fin de ce processus ne seront pas optimum, ce qui fait que ceci n’a aucun int´erˆet sur des tableaux de, mettons, 3 ´el´ements. . . mais avec des tableaux de quelques milliers d’´el´ements, on a quasiment gagn´e un facteur 4. On appelle cela une machine « vectorielle ». Pour tirer partie efficacement d’une telle architecture, l’effort n’est pas ´enorme : il faut travailler sur des tableaux avec des logiques assez simples, pour ne pas interrompre le pipe-line. C’est assez similaire `a ce qui a ´et´e dit du bon usage des caches. L’exp´erience prouve qu’en g´en´eral, un code efficace sur une machine classique, donnera de bonnes perforances sur une machine vectorielle. La facilit´e de programmation de ces machines a fait leur succ`es : certains CRAY des ann´ees 1990 en particulier avaient des registres de tr`es grande taille capable de stocker un grand nombre d’´el´ements de tableau afin de tirer parti de la rapidit´e d’acc`es aux registres et l’on obtenait ais´ement ainsi de tr`es bonnes performances de calcul pour l’´epoque. Ce sont toutefois des technologies coˆ uteuses dont les limites sont assez vite apparues : on verra ce que l’avenir r´eserve, mais il ne semble plus que cette voie continue `a ˆetre activement explor´ee par les constructeurs, mˆeme si des ordinateurs comportent une part de vectorisation.
7.2
Parall` elisme
Le parall`elisme consiste `a tenter de r´epartir un calcul sur plusieurs processeurs diff´erents de fa¸con que les donn´ees sur lesquelles ils travaillent soient diff´erentes mais les instructions ex´ecut´ees peuvent ˆetre identiques (Single
119
120
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Instructions Multiple Data) ou diff´erentes (Multiple Instructions Multiple Data). En pratique, les probl`emes sont diff´erents selon que l’on travaille avec un petit nombre de processeurs (ou plutˆ ot de cœurs ; en gros 4 ou 8) qui partagent le mˆeme espace m´emoire (m´emoire partag´ee ou shared memory) ou un grand nombre de processeurs qui utilisent chacun un espace m´emoire propre (m´emoire distribu´ee ou distributed memory) : dans ce cas la communication entre processeurs se fait par un r´eseau qui est g´en´eralement optimis´e pour ralentir le moins possible les calculs.
7.2.1
M´ emoire partag´ ee
C’est une situation assez fr´equente et qui le devient de plus en plus : un ordinateur contient plusieurs processeurs, parfois multi-cœurs qui partagent le mˆeme espace m´emoire. On peut alors donner des directives de compilation, c’est-`a-dire des instructions au compilateur, du type « parall´elise-moi ce morceau de programme », et le compilateur, si on lui donne les bonnes options, parall´elise. . . presqu’automatiquement. En pratique on utilise g´en´eralement OpenMP (pour Open MultiProcessing) qui est librement distribu´e : en fortran cela apparaˆıt comme des commentaires du type : !$OMP PARALLEL ou !$OMP END PARALLEL de telle sorte qu’un compilateur « non averti » (c’est-` adire qui ne connait pas OpenMP ou auquel on n’a pas fourni l’option de compilation appropri´ee) puisse compiler le programme sans tenir compte de ces directives. Au contraire, le compilateur qui connait OpenMP va tenir compte de tout ce qui commence par !$OMP. On ´ecrira alors des choses comme : !$OMP PARALLEL do i = 1, n ... enddo !$OMP END PARALLEL
et le compilateur r´epartit la boucle sur les processeurs disponibles, chacun prenant sa part de donn´ees. Il faut cependant ˆetre assez prudent : tous les processeurs utilisent la mˆeme m´emoire, il y a donc le risque qu’ils ´ecrasent le travail de leurs voisins ! Certaines variables peuvent donc ˆetre d´eclar´ees comme priv´ees, c’est-` a-dire qu’elles sont dupliqu´ees en autant d’exemplaires qu’il y a de processeurs, afin qu’elles soient utilis´ees ind´ependamment par chacun : !$OMP PARALLEL PRIVATE(X, Y, Z) do i = 1, n ... enddo !$OMP END PARALLEL
Cette fa¸con de proc´eder a l’immense avantage d’ˆetre tr`es simple `a mettre en œuvre : tr`es souvent, il suffit de rep´erer les quelques boucles du programme qui prennent pratiquement tout le temps de calcul, mettre quelques directives au bon endroit, compiler. . . et on fait travailler huit processeurs au lieu d’un : division par huit du temps de restitution ! Malheureusement, le monde r´eel est parfois contrariant : certains algorithmes s’accomodent mal de ce genre de traitement et l’on peut avoir besoin de plus que 8 processeurs,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
d’autant que les centres de calculs se mettent `a en proposer des centaines, voire des milliers (on commence `a parler de calculs r´epartis sur des dizaines de milliers de processeurs).
7.2.2
M´ emoire distribu´ ee
Une autre solution consiste `a r´epartir explicitement le travail sur les processeurs, tel processeur devant faire tel morceau du programme sur telles donn´ees, tel autre processeur faisant autre chose sur d’autres donn´ees. En anglais, on appelle cela Multiple Instructions Multiple Data ou MIMD. Chaque processeur fait son travail sp´ecifique sur ses donn´ees. La difficult´e est la synchronisation de ce beau monde, car il arrive que ce que doit faire un processeur d´epende du r´esultat d’un calcul fait par un autre, sinon, il suffirait de prendre plusieurs ordinateurs ind´ependants qui feraient les calculs s´epar´ement. Il existe des biblioth`eques de programmes de passage de messages (comme MPI pour Message Passing Interface) qui permettent de faire communiquer les processeurs entre eux et les forcer `a s’attendre les uns les autres pour s’´echanger les donn´ees dont ils ont besoin. Ainsi, dans un programme, on appelle des sous-programmes de biblioth`eque, par exemple : call MPI_SEND(....) pour envoyer des donn´ees d’un processeur `a un autre. En effet, mettons que l’on soit en train de faire un calcul de type Monte-Carlo-Metropolis, il faut calculer toutes les interactions i-j, or il faut r´epartir les atomes entre les processeurs : un processeur donn´e doit donc disposer des positions de tous les atomes, et non seulement de ceux dont il a la charge. En fin de course, il faut additionner toutes les ´energies et donc concentrer sur un processeur toutes les ´energies partielles calcul´ees sur tous les processseurs : encore des communications entre processeurs. La gestion de ceci par l’utilisateur est plus difficile car il faut g´erer explicitement par programme tous ces ´echanges, et ´equilibrer les charges de travail des processeurs de fa¸con `a ne pas perdre trop de temps dans les attentes.
Chapitre 8
Quelques ´ el´ ements de C++ Le langage fortran est « LE » langage de programmation scientifique par excellence : il a ´et´e fait pour cela et il a constamment ´evolu´e depuis les ann´ees 1950 pour s’adapter. La version actuellement la plus utilis´ee a ´et´e d´efinie en 1990 et l´eg`erement modifi´ee en 1995. Les compilateurs correspondants sont progressivement apparus ` a la fin des ann´ees 1990. Une norme 2003 a ´et´e d´efinie et de nouveaux compilateurs devront voir le jour ´egalement dans quelques ann´ees (g95 commence ` a inclure des aspects 2003 en plus de la norme fortran95) : ainsi l’´evolution se poursuit. Toutefois, il y a une maxime importante qui est que : « le meilleur outil est celui que l’on maˆıtrise bien ». Pour des raisons diverses, le langage C est largement r´epandu et enseign´e : or tout ce qui est dit et fait dans le pr´esent polycopi´e peut ˆetre trait´e en C ; il faut bien sˆ ur lui reconnaˆıtre ses lettres de noblesse car le syst`eme Unix (et par cons´equent Linux) est ´ecrit en C et c’est un succ`es remarquable. Le C en tant que langage de programmation scientifique date des ann´ees soixante-dix et peut ˆetre consid´er´e comme largement obsol`ete : le C++ a pris la suite. Ce d´eveloppement ne r´epond cependant pas ou mal aux limitations du C pour ce qui est du calcul scientifique et fortran95 reste plus commode ` a l’usage1 , mais en vertu de la maxime ci-dessus, ceux qui ont une bonne maˆıtrise du C peuvent vouloir rester dans un monde fa´ ements de C++ (qui ne remmilier, d’o` u les pr´esents El´ placent pas un vrai cours). Ce langage ne manque pas de charme : il permet des exercices de voltige informatique admirables d’´el´egance quoique souvent. . . p´erilleux !
8.1
Avant mˆ eme de commencer
// inclure les fonctions math´ ematiques #include
Les symboles // indiquent les commentaires sur la fin de la ligne ; si on veut mettre un commentaire sur plusieurs lignes : /* ... */. Toujours dans le cadre du « je ne sais rien faire », C++ pr´evoit que l’on puisse avoir envie d’utiliser des noms g´en´eriques de fonctions pour des usages particuliers, d’o` u risque de conflit. On peut donc d´efinir un namespace (ou espace de noms) particulier pour ´eviter cela. Sinon (ce qui est le cas g´en´eral), on doit pr´eciser que l’on veut utiliser l’espace de noms standard : using namespace std ; (ne pas oublier le point-virgule). Avant donc le d´ebut du programme, de toute fonction, ou de d´eclarations, il faut ces directives et cet espace de noms. S’il n’y a pas de variables globales ou de fonctions, on peut alors attaquer le programme principal. Celui-ci s’appelle toujours main( ) et n’a pas de type ; en fait, on peut aussi le mettre en int (entier). Le d´ebut du programme est marqu´e par une accolade ouvrante et sa fin par une accolade fermante. On obtient donc quelque chose qui peut ressembler `a : #include #include #include #include
<string>
using namespace std ;
Il faut savoir qu’a priori C++ « ne sait rien faire » : c’est un choix explicite, il faut lui indiquer que l’on a besoin de choses aussi ´el´ementaires que les entr´ees-sorties, les chaˆınes de caract`eres et les fonctions math´ematiques standards ! En pratique, tout programme commence donc par des directives au pr´eprocesseur marqu´ees par un # (di`eze) : // Directives au pr´ eprocesseur // inclure les entr´ ees-sorties d’´ ecran #include // inclure les entr´ ees-sorties par fichiers #include 1 Lors
// inclure les cha^ ınes de caract` eres #include <string>
d’un colloque, quelqu’un qui simulait des probl` emes de combustion complexe dans des turbines a´ eronautiques, a ` qui on demandait si ses programmes ´ etaient en C++, r´ epondit non parce que : 1o « C++, c¸a rame ! » (je cite) et 2o on pouvait laisser un nouveau chercheur intervenir sur un code en fortran au bout de quelques semaines de formation, ce qui ´ etait totalement exclu en C++. . .
// espace de noms standard
// programme principal main( ) // accolade : debut du ’bloc’ du programme principal { cout << "Hello world" << endl ; } // accolade : fin du bloc du programme principal
On notera l’instruction cout d’´ecriture et sa syntaxe tr`es diff´erente de celle du langage C (pour ne pas parler du fortran. . .). endl signifie end of line (fin de ligne) : il s’agit de passer `a la ligne `a la fin de l’´ecriture, ce qui n’est pas le mode par d´efaut, il faut le pr´eciser. On notera que toutes les instructions se terminent par un point-virgule ; : C++ ignore les espaces et les sauts de lignes. Non seulement une mˆeme instruction peut ˆetre r´epartie sur plusieurs lignes, mais on peut mettre autant de sauts de ligne que l’on veut au milieu de l’instruction. . .
121
122
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Ceci se compile de fa¸con tr`es classique par la com- while(condition) {instructions. . .} et mande : do {instructions. . .} while(condition) c++ hello.cpp -o hello le suffixe cpp indiquant qu’il s’agit bien d’un programme en C++. 8.3.2 Conditions
8.2
D´ eclarations
Les variables doivent ˆetre d´eclar´ees : les types de base sont int (entier), float (r´eel), double (double pr´ecision), char (caract`ere) et bool (bool´een). En C++ comme en C, le type complexe n’existe pas. Les noms de variables ob´eissent aux r`egles habituelles, seulement, C++ distingue entre les lettres majuscules et minuscules (Resultat est diff´erent de resultat, les mots-clefs du langage ´etant en lettres minuscules : float et non FLOAT ou Float) En revanche les d´eclarations peuvent ˆetre faites n’importe o` u dans le programme ` a condition que ce soit 1o avant la premi`ere utilisation et 2o dans le mˆeme bloc. Ainsi, dans le programme suivant qui comporte une boucle faisant varier la variable enti`ere step de 1 ` a 100 : #include #include #include <string> #include using namespace std ; main( ) { /* d´ eclaration de 2 nombres r´ eels pour tout le programme */ float t, dt=0.1 ;
On a ´evidemment : if ( condition ) { instructions. . . } else { instructions. . . } Attention, pour les habitu´es du fortran, il n’y a pas de then. . . Il y a une variante : z = ( condition ) ? x : y ; qui ´equivaut `a if ( condition ) z = x ; else z = y ; Les conditions s’´ecrivent sans grande originalit´e : x >= y, y != z (diff´erent de), a == b ou a < b && y <= u o` u && signifie et, et ou s’´ecrit ||.
8.3.3
Sauvegardes
Si l’on veut ´ecrire des r´esultats dans un fichier, il faut l’ouvrir, ´ecrire, puis le fermer : ce n’est pas bien original, par exemple, // ouverture du fichier Calcul.res ofstream fichier("Calcul.res") ; for( int i = 0 ; i < i_max ; i++) fichier << i<< " " << x[i] << endl ; fichier.close()
8.4
// ´ ecriture // fermeture
Tableaux
8.4.1 Tableaux de taille fixe // boucle et d´ eclaration de step for ( int step = 1; step <= 100; step++ ) Il n’y a ici rien de tr`es original : { t = step*dt ; cout << t << endl ; } // fin de la boucle et fin du ’bloc’ o` u step est d´ efini #include #include /* si on met ici une r´ ef´ erence ` a step, #include <string> ca ne marchera pas ! */ ¸ #include // cout << step << endl ; // donc, NE PAS d´ ecommenter ! using namespace std ; } int main( ) la variable step n’est d´eclar´ee que pour la boucle qui /* la taille du tableau doit ^etre d´efinie constitue le bloc pour lequel elle est d´eclar´ee. Si on espar une constante enti` ere */ saie de compl´eter le programme en ajoutant la ligne { int const n=100 ; float x[n] ; // d´ eclaration du tableau cout << step << endl ; entre l’accolade qui termine la boucle et l’accolade finale, on obtiendra une erreur a la compilation. Le d´ebut et la fin de la boucle sont ` ´evidemment marqu´es par les accolades.
8.3 8.3.1
Structures de base diverses Boucles
On a d´ej` a vu : for ( int i = debut ; i < fin ; i++ ) {instructions. . .} o` u debut et fin sont des entiers. On peut aussi ´ecrire des choses comme for ( float x=x_min ; x<=x_max ; x=x+dx ) { instructions. . .} ou encore
for ( int step = 0; step < n; step++ ) { x[step] = step ; cout << x[step] << endl ; } }
On notera n´eanmoins quelques points importants : 1o on ne peut pas d´elimiter les tableaux comme on veut (par exemple x[-5:5] n’est pas permis), car on se borne `a donner le nombre d’´el´ements du tableau, et 2o le premier ´el´ement du tableau est l’´el´ement z´ero (les bornes de la boucle sont, dans l’exemple ci-dessus, 0 et 99, soit n-1). Les tableaux `a plusieurs dimensions existent, ce sont simplement des tableaux de tableaux (on omettra dor´enavent dans les exemples les pr´eliminaires #include et using) : int main( ) { int const n = 10, m = 5 ;
123
Physique num´erique, Philippe Depondt
float x[n][m]
;
// tableau de tableau
for ( int step = 0; step < n; step++ ) { for ( int i = 0 ; i < m ; i++ ) { x[step][i] = step+pow(i,3.2) ; cout << step << " " << i << " " << x[step][i] << endl ; } } }
Noter au passage 1o les deux boucles imbriqu´ees, 2o l’usage correspondant des accolades ainsi que 3o la fa¸con d’´eviter qu’` a l’´ecriture tous les chiffres soient accol´es, en ins´erant des espaces et enfin 4o que la mise `a la puissance du fortran (x**y) n’existe pas plus en C++ qu’en C : il faut utiliser la fonction pow. Finalement, C++ ne connait pas la manipulation globale de tableaux : toutes les boucles doivent ˆetre ´ecrites explicitement, et les fonctions intrins`eques du type sum, dot product ou matmul sont absentes.
8.4.2
Les pointeurs : premiers pas
Les pointeurs font le charme sulfureux du langage C : ils permettent d’´eblouissantes acrobaties et autorisent l’artiste `a donner libre cours ` a toute sa virtuosit´e. . . Ils sont ` maniaussi la source de bugs particuli`erement retors ! A puler avec une certaine prudence, donc. Dans le principe, cependant, c’est assez simple. Il faut savoir qu’un tableau -dans n’importe quel langage, y compris fortran- est un pointeur masqu´e. Un langage comme le fortran est fait de telle sorte que l’usage explicite de pointeurs est en g´en´eral inutile, dans le but ´evident de simplifier la vie de celui (ou celle) qui ´ecrit les programmes. En C et C++, au contraire, tout est fait pour que toutes les potentialit´es de ces objets puissent ˆetre utilis´ees. Les pointeurs, c’est une vieille histoire, du moins `a l’´echelle de l’histoire de l’informatique. En assembleur, il n’y a pas de tableau, or un tableau, c’est simplement un ensemble de cases dans la m´emoire vive, rang´ees les unes derri`ere les autres dans l’ordre. Ainsi, pour d´efinir un tableau, on doit fournir 1o l’adresse du premier ´el´ement, 2o le type de variable, c’est ` a dire en pratique le nombre d’octets occup´e par un ´el´ement (4, 8 voire 16) et 3o le nombre d’´el´ements. C’est ce que l’on fait quand on d´eclare un tableau. L’adresse du p-i`eme ´el´ement du tableau est donn´ee par : adresse du premier element+ (p − 1)(nombre d’octets par element) En assembleur, alors qu’on ne dispose pas de tableau, c’est exactement cela qu’on fait : on d´efinit une variable sp´eciale, appel´ee pointeur qui contient l’adresse du premier ´el´ement du tableau, variable que l’on incr´emente de la quantit´e voulue pour acc´eder aux ´el´ements du tableau. Quand c¸a marche, c¸a marche tr`es bien : j’en t´emoigne bien volontier ! Quand c¸a ne marche pas. . . c’est une autre histoire ! J’ai des souvenirs douloureux datant de l’´epoque
o` u, pour gagner de l’espace m´emoire, on programmait parfois en assembleur, des souvenirs d’´ecrans devenus soudainement tous noirs, ou d’ordinateurs qu’il fallait d´ebrancher du secteur pour les red´emarrer ensuite, tout simplement parce qu’un pointeur dans un de mes programmes ´etait all´e ´ecraser une adresse m´emoire r´eserv´ee au syst`eme d’exploitation. . . La chasse `a l’erreur, dans ces conditions, ´etait un exercice requ´erant une acuit´e intellectuelle sup´erieure et dans lequel la fameuse loupe de Sherlock Holmes ´etait un ustensile indispensable ! C’est `a ce genre de d´elices que C++ nous convie. . . Il est sans doute inutile de pr´eciser que, quand on a le choix entre utiliser un tableau comme ci-dessus, et un pointeur, on a tout int´erˆet `a utiliser le tableau. Il arrive toutefois bien souvent que l’on n’ait pas le choix. Concr´etement, imaginons que nous ayons d´eclar´e une variable, scalaire pour commencer, par exemple, par : float x ; Son adresse dans la m´emoire vive s’´ecrit alors : & x D´eclarons alors une variable de type pointeur `a l’aide de l’ast´erisque * : float * px ; // d´ eclaration d’un pointeur On note que le type de la variable vers laquelle on pointe2 est fourni, afin de donner le nombre d’octets qu’elle va occuper dans la m´emoire. On peut alors ´ecrire : px = & x ; L’adresse de x est stock´ee dans le pointeur px. Pour donner la valeur 1.414 `a x, il y a maintenant deux fa¸cons de proc´eder : x = 1.414 ; // m´ ethode classique ou alors on stocke 1.414 `a l’adresse point´ee par px *px = 1.414 ; ´ Evidemment, dans le cas simple montr´e ici, la premi`ere est de loin pr´ef´erable. Imaginons cependant la s´equence suivante : float x; float * px ;
// variable r´ eelle // pointeur vers une variable r´ eelle
px = & x ;
/* initialisation du pointeur sur l’adresse de x */ px = px + 1 ; /* incr´ ementation du pointeur de quatre octets : variable suivante */ *px = 1.414 ;
on a plac´e la valeur 1.414 dans une nouvelle case m´emoire situ´ee 4 octets (soit un r´eel) apr`es x : il vallait mieux ˆetre sˆ ur qu’il n’y avait l` a rien de vital ! On r´ealise alors que l’on peut, en quelque sorte, se promener en toute libert´e dans la m´emoire vive de son ordinateur et y faire toutes sortes de choses exaltantes. . .
8.4.3
Tableaux dynamiques
On a vu pr´ec´edemment que pour d´eclarer un tableau statique, il fallait que la taille du tableau soit une constante : cela signifie que cette valeur ne peut pas ˆetre modifi´ee `a l’ex´ecution du programme ; en fait elle doit pouvoir ˆetre ´etablie `a la compilation. Ainsi, mˆeme si la d´eclaration du tableau est faite au milieu des instructions ex´ecutables (c’est permis), sa taille est pr´ed´etermin´ee lors de l’´ecriture du programme, on ne peut pas, par exemple, l’entrer au clavier. En fortran, on r´epond `a cette question par des tableaux allocatable ; en C++, on utilise un pointeur-tableau : 2c ¸a,
c’est un progr` es sensible par rapport a ` l’assembleur. . .
124
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
int main( ) int main( ) { // variable qui doit contenir la taille du tableau { int n ; cout << machin(5) << endl ; // saisie de n } cout << " Entrer la taille du tableau : " ; cin >> n ; // d´ eclaration du tableau dynamique // d´ efinition de la fonction apr` es son appel float * x = new float[n] ; int machin(int i) for ( int i = 0; i < n; i++) { { return 3*i+1 ; x[i] = i*i ; cout << x[i] << endl ; } } }
8.5.3
Ici, la taille n du tableau est une vraie variable que l’on entre au clavier `a la demande (voir au passage la syntaxe de la saisie au clavier). Le tableau disparaˆıt d`es que l’on sort du bloc o` u il a ´et´e d´efini (dans cet exemple, c’est le programme principal, donc il ne disparaˆıt qu’au moment de la fin du programme).
8.5
Fonctions
C++ n’a pas le concept de subroutine, il faudra donc utiliser quelques astuces ; de plus, les fonctions doivent ˆetre d´efinies avant d’ˆetre utilis´ees sauf si l’on d´efinit un prototype.
8.5.1
Une fonction tr` es simple
Voici un exemple ´el´ementaire : #include #include #include <string> #include using namespace std ; /* d´ ebut de la fonction enti` ere machin avec un argument entier */ int machin(int i) { return 3*i+1 ; // calcul de la valeur de la fonction } // fin de la fonction int main( ) // programme principal { cout << machin(5) << endl ; // appel de la fonction }
Passage d’arguments par valeur
Imaginons que l’on tente de modifier la valeur de l’argument i dans la fonction : #include #include #include <string> #include using namespace std ; int machin(int) ; int main( ) { int j = 5 ; cout << j << " " << }
machin(j) << " " << j << endl ;
int machin(int i) { i = 3*i+1 ; // ici, la variable i est modifi´ ee return i ; }
ce programme r´epond : 5 16 5, autrement dit, la variable j du programme principal n’est pas modifi´ee par la fonction machin, alors que le calcul s’effectue bien dans la fonction. C’est que l’argument j est pass´e « par valeur » : la valeur de j est transmise `a la fonction, mais j n’est pas modifi´ee.
8.5.4
Passage d’arguments par r´ ef´ erence
Le passage par r´ef´erence consiste `a passer la variable comme une valeur de pointeur, c’est-`a-dire une adresse qu’on ne peut pas modifier, alors que la la valeur vers laquelle on pointe peut, elle, ˆetre modifi´ee : //prototype avec passage par r´ ef´ erence int machin( int &) ;
La fonction est d´efinie avant le programme principal qui l’appelle. int main( )
8.5.2
Prototype
Le prototype permet de ne d´efinir la fonction qu’apr`es son appel, il consiste simplement en une d´eclaration du type de la fonction et des types de ses arguments, ainsi : #include #include #include <string> #include using namespace std ;
{ int j = 5 ; cout << j << endl ; // ´ ecriture de j initial cout << machin(j) << endl ; /* ´ ecriture de la valeur de la fonction */ cout << j << endl ; } // ´ ecriture de j modifi´ e // fonction avec passage par r´ ef´ erence int machin(int & i) { i = 3*i+1 ; return i ; }
/* prototype de la fonction machin : Cet exemple r´epond elle est de type entier et a un argument entier */ 5 int machin(int) ;
125
Physique num´erique, Philippe Depondt
16 16
Babar : 120.32 C´ eleste : 180.25
La variable j a bien ´et´e modifi´ee. L’int´erˆet est bien sˆ ur de D´efinissons maintenant une fonction dans la classe : g´en´eraliser ceci `a plusieurs variables afin d’obtenir quelque class client chose qui ressemble ` a une subroutine : // prototype (type void) void machin( float &, float &, float &) ; int main( ) { float p = 5, cout << p << machin(p,q,r) cout << p << }
q =6, r ; " " << q << endl ; ; // p, q, et r sont modifi´ es " " << q << " " << r << endl ;
// fonction de type void (c’est-` a-dire, sans type) void machin(float & a, float & b, float & c) { a = a/2 ; b = 3*a- b ; c = a + b ; }
8.6
Les classes
{ public : string nom ; float montant ; void client_print() ; // fonction dans la classe } ; void client :: client_print() /* d´ efinition de la fonction : elle est de type void et se r´ ef` ere ` a la classe client. Noter le :: */ { cout << nom << " : " << montant << endl ; } ; //--------------------------------------int main() { client a, b ; a.nom = "Babar" ; a.montant = 120.32 ; b.nom = "C´ eleste" ; b.montant = 180.25 ;
C’est la grande nouveaut´e introduite par C++ par rap- // l’impression est devenue plus simple a.client_print() ; port `a C et c’est ce qui ouvre la voie vers la programmation b.client_print() ; // noter la syntaxe orient´ee objet. En pratique, l’id´ee est tr`es proche de celle des types d´eriv´es du fortran95, mais c’est con¸cu assez } diff´eremment. Les classes peuvent contenir des fonctions Puisque le type complex n’existe pas en C++, et des op´erateurs, ce qui les diff´erencient des structures fabriquons-le. Il faut `a la fois d´efinir le type (c’est un objet (struct) du C. Voici une classe ´el´ementaire : compos´e de deux nombres r´eels, les parties r´eelle et imaginaire), des fonctions sp´ecifiques (extraire la partie r´eelle #include ou la partie imaginaire, par exemple) et des op´erations #include (addition, produit, etc.). Pour commencer, quelque chose #include de simple : #include <string> using namespace std ; class client // d´ efinition de la classe { /* ces variables sont publiques et donc accessibles de l’ext´ erieur */ public : string nom ; float montant ; /* client comporte donc une chaine et un r´ eel */ } ; // attention, ici il y a un point-virgule //-------------------------------------------int main() { // d´ eclaration de deux variables de type client client a, b ; // initalisation du nom du client a a.nom = "Babar" ; /* initialisation du montant de la transaction pour le client a */ a.montant = 120.32 ; b.nom = "C´ eleste" ; // idem pour b b.montant = 180.25 ; cout << a.nom << " : " << a.montant << endl ; cout << b.nom << " : " << b.montant << endl ; }
Noter comment on acc`ede aux composantes des variables. Apr`es ex´ecution, ce programme r´epond :
class complex // Definition de la classe complex { public : // parties r´ eelles et imaginaires float RealPart, ImagPart ; void Zprint() ; // fonction } ; void complex :: Zprint() // fonction pour imprimer { cout << "(" << RealPart << "," << ImagPart << ")" ; } //-------------------------------------------------int main() { complex z1 ; z1.RealPart = 1. ; z1.ImagPart = 2. ; z1.Zprint(); cout << endl ; }
Il n’y a ici rien de nouveau. D’ailleurs c¸a r´epond : (1,2)
Maintenant, il faut d´efinir des op´erateurs d’addition et de multiplication : class complex { public : float RealPart, ImagPart ; void Zprint() ;
126
Licence de physique L3 : Physique Fondamentale & PHYTEM,
// D´ efinition des op´ erateurs complex operator + (const complex & a) // Addition { complex z ; z.RealPart = RealPart+a.RealPart ; z.ImagPart = ImagPart+a.ImagPart ; return z ;} complex operator * (const complex & a) // Multiplication { complex z ; z.RealPart = RealPart*a.RealPart-ImagPart*a.ImagPart; z.ImagPart = RealPart*a.ImagPart+ImagPart*a.RealPart; return z ;} } ; void complex :: Zprint() // fonction pour imprimer { cout << "(" << RealPart << "," << ImagPart << ")" ; } //--------------------------------------------------int main() { complex z1, z2, z3 ; z1.RealPart = 0. ; z1.ImagPart = 1 ; z2.RealPart = 0. ; z2.ImagPart = 2 ; z3 = z1+z2 ; // somme de deux complexes cout << "Somme : " ; z1.Zprint() ; cout << "+" ; z2.Zprint() ; cout << "=" ; z3.Zprint(); cout << endl ; z3 = z1*z2 ; // produit de deux complexes cout << "Produit : " ; z1.Zprint() ; cout << "*" ; z2.Zprint() ; cout << "=" ; z3.Zprint(); cout << endl ; }
C’est assez subtil : les op´erateurs (a priori binaires) ne prennent qu’un argument. Ainsi par exemple, quand on veut faire la somme des parties r´eelles, on fait la somme de RealPart qui est consid´er´e comme d´ej` a r´esident en m´emoire et de a.RealPart qui est la partie r´eelle de l’argument. C’est un peu comme en assembleur, quand on ´ecrit ADDA $10C3, soit « additionner le contenu du registre A (d´ej` a charg´e) avec le contenu de la m´emoire $10C3 ». C ¸ a r´epond : Somme : (0,1)+(0,2)=(0,3) Produit : (0,1)*(0,2)=(-2,0)
Il « ne reste plus qu’` a » d´efinir soustraction et division, et les fonctions complexes diverses (norme, conjugu´e, exponentielle, etc.) Le langage C++ est ´evidemment beaucoup plus riche que ce qui est indiqu´e ici : le but de ce chapitre n’est ´evidemment que de montrer la « philosophie » du langage. . .
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Chapitre 9
La question du calcul formel. Des logiciels comme Maple ou Mathematica sont des outils tr`es puissants permettant de faire du calcul formel a l’aide d’un ordinateur. Quelle place ces outils tiennent-ils ` par rapport au calcul num´erique tel qu’il a ´et´e d´evelopp´e dans ce cours ? La r´eponse ´evidente est que l’on entreprend un calcul num´erique lorsque le calcul formel ne donne pas les r´esultats escompt´es, cependant comme les d´emarches de l’un et de l’autre sont assez diff´erentes, il est bon de pr´eciser ce que l’on entend par l` a.
9.1
Calcul formel, calcul num´ erique : quelle diff´ erence ?
a*x+b=0 20 2 0 −2 −20
60 40 20 0 −20 −40 −60
4 2 −4
0
−2 a
0
2
−2 4
b
−4
Fig. 9.1 – R´esultat de la r´esolution num´erique de l’´equation ax + b = 0 par la m´ethode de la dichotomie.
Imaginons un exemple simpliste o` u l’on cherche `a r´esoudre l’´equation : ax + b = 0 N’importe quel ´el`eve de 4`eme sait il faut proc´eder : ax + b = ax + b − b =
ax + 0 = ax = a x =
la plus marquante du r´esultat. L’allure du graphe obtenu d´epend aussi fortement du pas de l’´echantillonnage choisi. Les points singuliers ne sont d’ailleurs pas rep´er´es expli(en principe) comment citement -on se demande comment- mais simplement sont entour´es de zones o` u x prend, en valeur absolue, des valeurs « grandes ». Le r´esultat formel montre sans am0 bigu¨ıt´e que la divergence est en 1/a ce qui n’a aucun ca−b ract`ere d’´evidence dans le cas des r´esultats num´eriques ; on peut toutefois avoir l’id´ee de tracer, non pas x(a, b) mais −b le produit a × x(a, b), qui donnerait une constante ce qui b − permet de dire, de mˆeme, que c¸a diverge comme 1/a1 . a b Ainsi, r´esolution formelle et r´esolution num´erique d’un − mˆeme probl`eme donnent des r´esultats assez diff´erents. . . a
Autrement dit, il faut faire quelques manipulations formelles de l’expression (retrancher b des deux cot´es du signe ´egal, diviser des deux cot´es par a, faire les simplifications qui s’imposent) pour obtenir la solution qui s’´ecrit : x = une expression. Les logiciels de calcul formel font cela : ils manipulent des symboles en appliquant les r`egles formelles de l’alg`ebre. La force de cette fa¸con de proc´eder est qu’elle est g´en´erale : la solution obtenue de la sorte est valable pour n’importe quel couple de nombres a et b. Si l’on cherche ` a r´esoudre la mˆeme ´equation num´eriquement, par la m´ethode de la dichotomie ou par la m´ethode de Newton, le r´esultat sera un tableau de valeurs de x pour un ´echantillonnage de valeurs prises par a et b, que l’on peut repr´esenter sur un graphe comme la figure 9.1. Mˆeme si le graphe a des vertus esth´etiques que n’a pas la formule, on retrouve toutes les difficult´es d´ej` a ´evoqu´ees au chapitre 4.4 : si l’intervalle de recherche choisi pour a et b n’est pas bien choisi, on risque de ne pas voir les points singuliers pour a = 0, ce qui est pourtant la caract´eristique
9.2 9.2.1
Quelques exemples ax + b = 0
Des logiciels de calculs formels comme Maple ou Mathematica sont souvent capables de faire les deux ; avec Maple par exemple : solve(a*x+b=0,x) ; b − a est la r´esolution formelle de l’´equation, alors que : f := (a,b)->fsolve(a*x+b=0,x) ; f := (a, b) → fsolve(a x + b = 0, x) plot3d(f,-5..5,-5..5) ; 1 La simplicit´ e de notre exemple est un peu trompeuse, car il faudrait supposer que l’on ne connait pas la solution analytique.
127
128
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Ce n’est pas tr`es digeste, alors essayons d’arranger un peu le r´esultat : expand(%) ; (1/3)
%1 4ab 4 a2 2a − + + (1/3) (1/3) 3RT 3 RT %1 3 R T %1 2 2 2 2 3 %1 := −36 a b R T + 27 a b R T + 8 a + r 24 a b + 81 b2 R2 T 2 3ab − RT
en est la r´esolution num´erique2. On notera au passage la on n’a pris que la derni`ere des trois solutions, et : diff´erence (subtile) entre les commandes solve et fsolve simplify(%) ; qui est illustr´ee ci-dessous : solve(cos(x)=0,x) ; %1(2/3) − 12 a b R T + 4 a2 + 2 a %1(1/3) 1 (1/3) π 3 R T %1 2 fsolve(cos(x)=0,x) ; %1 := a − 36 a b R T + 27 b2 R2 T 2 + 8 a2 + ! r 1.570796327 √ b (8 a − 27 b R T ) 2 2 3b 3 − R T RT dans le premier cas, Maple « sait » que la solution3 de l’´equation cos x = 0 est l’ensemble de symboles 12 π, alors mˆeme remarque. que dans le deuxi`eme, il calcule la valeur num´erique de la On a ici un pur produit du calcul formel automatique : solution : ce n’est pas du tout la mˆeme op´eration, car il le temps de calcul est tr`es rapide, et la r´esolution de est probable qu’alors (mˆeme si Maple n’explicite pas ses l’´ e quation de degr´e trois sans difficult´e, mais le plus d´elicat m´ethodes) une m´ethode du type dichotomie est utilis´ee. est d’obtenir des expressions utilisables par un humain ; dans notre cas particulier, on a du mal `a choisir parmi 9.2.2 Le gaz de Van der Waals les trois solutions, les deux qui donnent l’allure classique Un gaz de Van der Waals est d´efini par l’´equation d’´etat des isothermes de Van der Waals que l’on trouve dans tous les livres de thermodynamique. Si l’on veut travailler suivante a num´eriquement avec les expressions ci-dessus, Maple peut (p + 2 )(v − b) = RT v les traduire en fortran pour ˆetre introduites dans un Imaginons que l’on cherche les extrema de la pression en programme sans avoir `a tout recopier `a la main ! fonction du volume. On entre donc l’expression de la pression : 9.2.3 Mod` ele de Brillouin-Weiss p := R*T/(v-b)-a/v**2 ; Voyons maintenant un exemple plus sophistiqu´e : RT a p := − 2 on montre que l’aimantation d’une substance ferrov−b v magn´etique (dans l’approximation du mod`ele de Brillouinque l’on d´erive par rapport au volume : Weiss) est donn´ee par l’´equation : diff(p,v) ; Tc M M 2a RT tanh( )= + 3 − T M M 2 s s (v − b) v et l’on veut que cette d´eriv´ee soit nulle : solve(%,v) ; (1/3)
4 a (−3 b R T + a) 2a %1 + + , (1/3) 3RT 3 RT 3 R T %1 (1/3) 2a 2 a (−3 b R T + a) %1 + − + − (1/3) 6RT 3 RT 3 R T %1 ! (1/3) %1 1 √ 4 a (−3 b R T + a) , I 3 − (1/3) 2 3RT 3 R T %1 (1/3)
%1 2a 2 a (−3 b R T + a) + − (1/3) 6RT 3 RT! 3 R T %1 (1/3) √ %1 1 4 a (−3 b R T + a) − I 3 − 2 3RT 3 R T %1(1/3) %1r := a (−36 a b R T + 27 b2 R2 T 2 + 8 a2 + 3 b (8 a − 27 b R T ) 2 2 R T ) 3b − RT −
2 On a commenc´ e par d´ efinir une fonction de deux variables f (a, b), puis on a demand´ e un graphe tri-dimensionnel. 3 Au passage, on notera qu’il ne donne qu’une solution, alors qu’il y en a une infinit´ e. . .
o` u Ms est l’aimantation `a temp´erature nulle et Tc la temp´erature au-dessus de laquelle l’aimantation est nulle. On peut tenter de r´esoudre cette ´equation `a l’aide de Maple, afin d’obtenir une expression de l’aimantation M en fonction de la temp´erature T . Cela donne : solve(tanh(Tc/T*M/Ms)=M/Ms,M) 2 RootOf( Z T (e Z )2 + Z T −Tc (e Z )2 +Tc) Ms e −1 2 eRootOf( Z T (e Z )2 + Z T −Tc (e Z )2 +Tc) + 1
On n’est gu`ere plus avanc´e : « RootOf » signifie « racine de » autrement dit, Maple ne sait pas r´epondre `a la question. Tentons donc une r´esolution num´erique, en nous pla¸cant pour simplifier dans un syst`eme d’unit´es dans lequel Ms = 1 et Tc = 1 : f :=T->fsolve(tanh(M/T)=M,M) ; f := T → fsolve(tanh( plot(f,0..1) ;
M ) = M, M ) T
129
Physique num´erique, Philippe Depondt
9.2.4
1
0.5
0
0.2
0.4
0.6
0.8
1
Le projectile
Imaginons un projectile se d´epla¸cant dans l’air et soumis, outre `a son poids, `a une force de train´ee a´erodynamique proportionnelle `a v 2 : f~traine = −Kv 2 vˆ = −Kv~v
–0.5
o` u vˆ est le vecteur unitaire parall`ele `a ~v . Les ´equations du mouvement s’´ecrivent : On obtient la solution nulle. . . C’est exactement comme m¨ x = −Kvvx lorsqu’on cherche `a r´esoudre un probl`eme ` a l’aide de la m¨ z = −mg − Kvvz m´ethode de la dichotomie ou Newton ! Reformulons alors le probl`eme pour ´eliminer cette solution nulle : soit : K p g :=T->fsolve(tanh(M/T)/M=1,M) ; x¨ = − x˙ x˙ 2 + z˙ 2 m K p z¨ = −g − z˙ x˙ 2 + z˙ 2 M tanh( ) m T = 1, M g := T → fsolve M 9.2.4.1 Maple –1
Ceci se traduit en Maple par : eq1 := diff(x(t),t$2)=-k/m*diff(x(t),t) sqrt(diff(x(t),t)**2+diff(z(t),t)**2) ; q ∂ ∂ ∂ k ( ∂t x(t)) ( ∂t x(t))2 + ( ∂t z(t))2 ∂2 eq1 := 2 x(t) = − ∂t m
plot(g,0..1) ; –0.2
–0.4
–0.6
–0.8
–1 0
0.2
0.4
0.6
0.8
1
eq2 := diff(z(t),t$2)=-g-k/m*diff(z(t),t) sqrt(diff(x(t),t)**2+diff(z(t),t)**2) ; q ∂ ∂ ∂ k ( ∂t z(t)) ( ∂t x(t))2 + ( ∂t z(t))2 ∂2 eq2 := 2 z(t) = −g − ∂t m
C’est mieux, mais on pr´ef`ererait une solution positive ; imposons alors le domaine de recherche des solutions (entre dsolve({eq1,eq2},{x(t),z(t)}) ; 0 et 1) : h :=T->fsolve(tanh(M/T)/M=1,M,0..1) ; Z Z Z M tanh( ) T = 1, M, 0..1 h := T → fsolve M
z(t) =
Z
Z
1/RootOf
x(t) = 0.8
x(t) =
− f m
2
c 3 (5 m2 g c 2 − f 4 g k2 + m2 g3 + 4 m2 g2 c + 2 m2 c 3 )
− C1 Z 2
1
0.4
t−
f m2 (3 m2 c 3 + 9 m2 g c 2 − 2 f 4 g k2 + 2 m2 g3 + 8 m2 g2 c)
−
plot(h,0..1) ;
0.6
RootOf
Z p
d f + C2
!
dt + C3
,
(m g + %1 − k ( ∂ z(t))2 ) (m g + %1 + k ( ∂ z(t))2 ) ∂t ∂t
Z
−
p
( ∂ z(t)) k ∂t
dt + C1 ,
(m g + %1 − k ( ∂ z(t))2 ) (m g + %1 + k ( ∂ z(t))2 ) ∂t ∂t ( ∂ z(t)) k ∂t 2 %1 := m ( ∂ z(t)) ∂t2
d c Z2
(
dt + C1
)
C’est plutˆ ot indigeste (mˆeme r´eduit), mais on retrouve le c´el`ebre « RootOf » qui signifie que Maple ne sait pas r´esoudre le probl`eme ! Essayons num´eriquement : Cela a bien l’allure attendue de l’aimantation en fonction g :=9.81 ; de la temp´erature avec la transition de phase pour T = Tc . g := 9.81 En revanche, on constate deux choses : 1o Maple ne sait r´esoudre formellement que les probl`emes qui ont une solu- k := 1 ; tion analytique, 2o le calcul num´erique effectu´e par le logik := 1 ciel n’est pas magique : la proc´edure suivie et les difficult´es rencontr´ees sont les mˆemes que lors du calcul num´erique m := 1 ; m := 1 fait avec un programme personnel, Maple apporte simplement le fait qu’il n’est pas besoin de programmer soi-mˆeme inc :={x(t),z(t)} ; la recherche de z´ero, ainsi que la convivialit´e de l’interface inc := {x(t), z(t)} graphique incorpor´ee. 0.2
0
0.2
0.4
0.6
0.8
1
130
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
0.9
condini :=x(0)=0,z(0)=0,D(x)(0)=10,D(z)(0)=10 ;
0.8
condini := x(0) = 0, z(0) = 0, D(x)(0) = 10, D(z)(0) = 10
0.6 0.5 z
s :=dsolve({eq1,eq2,condini },inc,type= numeric) ;
0.7
0.4
s := proc(rkf45 x ) . . . end
0.3 0.2
fx := u->subs(s(u),x(t)) ;
0.1
fx := u → subs(s(u), x(t))
0
0
0.1
0.2
fy := u->subs(s(u),z(t)) ;
0.3
0.4 x
0.5
0.6
0.7
0.8
Fig. 9.2 – Trajectoire du projectile z(x).
fy := u → subs(s(u), z(t)) plot(’[fx(t),fy(t),t=0..10]’,x=0..2,y=-0.01..1) ;
est le pas de temps utilis´e, 3o la syntaxe (les subs en particulier) n’est pas particuli`erement limpide. On admettra sans grande difficult´e que pour un probl`eme simple comme celui-ci, ces d´efauts ne sont sans doute pas r´edhibitoires.
1
0.8
0.6
y
9.2.4.3
0.4
Octave
On notera que l’on n’a utilis´e finalement que les capacit´es num´eriques de Maple et non les propri´et´es de calcul symbolique. Ainsi, un logiciel comme Octave (sensiblement moins coˆ uteux, puisque gratuit. . . voir http ://www.octave.org) ferait parfaitement l’affaire. On obtient sans surprise que le projectile n’a pas une Les commandes (plac´ees dans un fichier de commandes trajectoire parabolique (qui serait sym´etrique par rapport ex´ecutable) ci-dessous permettent de r´esoudre le mˆeme a l’apog´ee). ` probl`eme : 0.2
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
x
9.2.4.2
Fortran
#! /usr/bin/octave -qf Il est ais´e de v´erifier ` a l’aide de quelques lignes de profunction proj = f(x,t) gramme que l’on obtient la mˆeme chose par les moyens k = 1 ; m = 1 ; g = 9.81 ; habituels : proj(1)=x(3); # 2 eqs du 2nd ordre program projecti proj(2)=x(4); # donnent 4 eqs du 1er implicit none proj(3)=-k/m*x(3)*sqrt(x(3)**2+x(4)**2); real :: t, dt, vx, vz, x, z, w, c, gdt proj(4)=-k/m*x(4)*sqrt(x(3)**2+x(4)**2)-g; real :: k = 1., m = 1., g = 9.81 ! parametres endfunction integer :: step, nstep x0=[0;0;10;10]; # conditions initiales dt = 0.001 ! pas de temps t = linspace(0,2,200);# intervalle de temps nstep = 10./dt ! nombre de pas # et nbr de pas c = k/m*dt ; gdt = g*dt ! constantes x=lsode("f",x0,t); # resolution x=0.; z=0.; vx = 10.; vz = 10.; t = 0. ! cond. init. gset nokey; # commandes gnuplot open(1,file=’project.res’) gset yrange[0:1]; gset xrange[0:2]; write(1,*) t, x, z, vx, vz gset xlabel ’x’; gset ylabel ’z’; do step = 1, nstep ! verlet t = step*dt gset title ’fait avec Octave’ w = 1.-c*sqrt(vx*vx+vz*vz) plot(x(:,1),x(:,2)); vx = vx*w ; vz = vz*w-gdt pause ; x = x + vx*dt ; z = z + vz*dt gset term post color ; # fichier postscript write(1,*) t, x, z, vx, vz gset output ’projectile_oct.ps’ ; if ( z < 0. ) exit replot ; enddo close(1) end
On obtient, ´evidemment, une fois de plus la mˆeme figure (fig. 9.3). Ce qui donne la figure 9.2. En termes de convivialit´e, Maple s’en sort plutˆ ot bien Les commentaires en termes d’absence de choix de l’algrˆ ace au graphisme int´egr´e. Il a toutefois des d´efauts de gorithme seraient les mˆemes qu’avec Maple. L’avantage plusieurs ordres : 1o on n’a pas la maˆıtrise de l’algorithme par rapport au programme fortran est la possibilit´e d’inutilis´e (probablement Runge-Kutta), 2o on ne sait pas quel clure dans la liste des commandes graphiques.
131
Physique num´erique, Philippe Depondt fait avec Octave 1
0.8
z
0.6
0.4
0.2
0
0
0.5
1 x
1.5
2
Fig. 9.3 – Trajectoire du projectile z(x) obtenu `a l’aide d’Octave.
9.2.5
Une « grosse » simulation : les anneaux de Saturne.
Les sondes interplan´etaires am´ericaines Voyager (http://voyager.jpl.nasa.gov/) ont pris des photos magnifiques des anneaux de Saturne montrant des structurations complexes qui ont plong´e les astronomes (et les non-astronomes aussi) dans l’´emerveillement (voir, par exemple http://pds.jpl.nasa.gov/planets/ welcome/saturn.htm ). Le probl` eme physique sous-jacent est, du moins dans le principe, d’une simplicit´e biblique ! Il y a n ast´ero¨ıdes en interaction gravitationnelle avec Saturne et entre eux. En supposant que Saturne est beaucoup plus lourd que les ast´ero¨ıdes, les ´equations du mouvement s’´ecrivent sans complication majeure : mi~r¨i = −
X Gmi mj Gms mi rˆi − rˆij , i, j ∈ [1, n] 2 2 ri rij j (j6=i)
avec des notations banales4 , et o` u l’on n’a introduit que des interactions gravitationnelles. Ce syst`eme n’est ´evidemment pas ais´e ` a r´esoudre analytiquement : il s’agit de 3n ´equations diff´erentielles du second ordre, nonlin´eaires, coupl´ees. . . mais l’algorithme de Verlet peut traiter ce genre de probl`eme sans difficult´e. 9.2.5.1
Un programme de simulation.
Dans l’exemple de programme qui suit (´ecrit en fortran77) on a consid´er´e 500 ast´ero¨ıdes dans le champ de gravitation de Saturne (consid´er´e comme beaucoup plus lourd que les ast´ero¨ıdes et immobile). Les conditions initiales sont fix´ees dans un fichier dit « de configuration initiale » produit par un autre programme d’initialisation ; on a d’ailleurs pr´evu de tester l’existence de ce fichier (instruction inquire). De mˆeme, un fichier de param`etres de simulation (nombre de pas d’int´egration, intervalle d’´ecriture des r´esultats, valeurs du pas d’int´egration) est ´egalement lu : on n’a aucune information ` a fournir au clavier ; pour un programme susceptible de tourner plusieurs heures d’affil´ee, voire plusieurs jours, il n’est pas inutile de conserver sous forme de fichiers, une m´emoire des param`etres de la simulation. program saturn ! 4 la
notation rˆ d´ esigne le vecteur unitaire parall` ele a `~ r.
! programme pour calculer les trajectoires de n ! asteroides qui tournent autour d’une planete, ! par exemple, Saturne ! implicit none integer :: n, i, j, step, nstep, iprint parameter( n = 500 ) ! nombre d’asteroides ! positions, vitesses & masses double precision :: r(n,3), vr(n,3), m(n) logical :: ok ! variable logique multi-usage double precision :: xij, yij, zij, rijsq, fijr, & fijx, fijy, fijz, f(n,3), fij, g, v, k, ms, dt, rij ! parameter( g = 1.0, ms = 1.0 ) ! constante de ! gravitation & masse de la planete ! ! initialisations ! ! verifier le fichier de config inquire(file=’saturn.cnf’,exist=ok) if( .not. ok ) stop & ’Il faut d’’abord creer le fichier de configuration’ ! ! lire la configuration initiale open(1,file=’saturn.cnf’) read(1,*) r, vr, m close(1) ! ! verifier le fichier de parametres inquire(file=’saturn.inp’,exist=ok) if( .not. ok ) stop & ’Il faut d’’abord creer le fichier de parametres’ ! ! lire les parametres de simulation open(1,file=’saturn.inp’) ! nombre de pas, intervalle d’impression read(1,*) nstep, iprint read(1,*) dt ! pas de temps close(1)
Il faut ensuite pr´evoir des fichiers pour stocker les r´esultats de la simulation : un fichier de positions o` u seront inscrits les ~ri (t), la liste des positions des ast´ero¨ıdes au cours du temps ; c’est a priori un fichier qui risque de se r´ev´eler assez volumineux, donc pour gagner du temps il sera binaire5 . Un autre fichier sert `a garder l’´energie : celle-ci ´etant un invariant du mouvement, il sera prudent de v´erifier apr`es coup qu’il en est bien ainsi ! ! ! fichier de positions (binaire) open(1,file=’saturn.pos’,form=’unformatted’) ! open(2,file=’saturn.ener’) ! fichier d’energie
puis on d´emarre la simulation `a proprement parler. Il y a une boucle sur le temps, ´evidemment, et `a chaque pas de temps, on doit calculer les forces qui s’appliquent `a chaque ast´ero¨ıde : d’abord la force exerc´ee par Saturne, puis les forces exerc´ees par tous les autres ast´ero¨ıdes, compte tenu, bien sˆ ur, du principe de l’action et de la r´eaction ! On notera au passage, l’introduction d’une interaction r´epulsive en r−12 `a tr`es courte port´ee destin´ee `a tenir compte tr`es approximativement des collisions entre ast´ero¨ıdes : ces collisions sont consid´er´ees comme ´elastiques dans ce cas, ce qui est d’un r´ealisme douteux, mais on pourrait choisir autre chose. 5 cela fait gagner le temps de conversion binaire (en machine) vers ASCII et r´ eciproquement a ` la lecture.
132
Licence de physique L3 : Physique Fondamentale & PHYTEM,
! ! simulation ! ! la grande boucle commence ici do step = 1, nstep ! forces & energie potentielle ! v = 0. ! initialisation de l’energie potentielle ! ! d’abord s’occuper de Saturne do i = 1, n xij = r(i,1); yij = r(i,2) ; zij = r(i,3) rijsq = xij*xij + yij*yij + zij*zij ! fijr est fij/rij fijr = -g*m(i)*ms/(rijsq*sqrt(rijsq)) f(i,1) = fijr*xij f(i,2) = fijr*yij f(i,3) = fijr*zij v = v + fijr*rijsq enddo ! ! calculer les forces inter-asteroide et sommer ! les bornes des boucles tiennent compte de ce ! que fji = -fij (action et reaction), donc ! on ne prend que les j > i do i = 1, n-1 do j = i+1, n xij = r(i,1)-r(j,1) yij = r(i,2)-r(j,2) zij = r(i,3)-r(j,3) rijsq = xij*xij + yij*yij + zij*zij rij = sqrt(rijsq) ! forces gravitationnelles & terme repulsif fij = -g*m(i)*m(j)/rijsq + 1.e-30*rij**-13 fijr = fij/rij fijx = fijr*xij fijy = fijr*yij fijz = fijr*zij ! f(i,1) = f(i,1) + fijx f(i,2) = f(i,2) + fijy f(i,3) = f(i,3) + fijz ! le principe d’action et de reaction s’applique f(j,1) = f(j,1) - fijx ! ici f(j,2) = f(j,2) - fijy f(j,3) = f(j,3) - fijz ! energie potentielle v = v - g*m(i)*m(j)/rij & + 0.083333333333333d-30*rij**-12 enddo enddo ! ! fin du calcul des forces et ! de l’energie potentielle ! ! verlet commence ici do j = 1, 3 do i = 1, n vr(i,j) = vr(i,j) + f(i,j)*dt/m(i) r(i,j) = r(i,j) + vr(i,j)*dt enddo enddo ! verlet finit ici k = 0. ! energie cinetique do i = 1, n k = k + & m(i)*(vr(i,1)**2 + vr(i,2)**2 + vr(i,3)**2) enddo k = 0.5*k
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
! !
ecrire tous les IPRINT pas les positions et l’energie du systeme if (mod(step,iprint) == 0 ) then write(1) r ! pour pouvoir verifier l’invariance de l’energie write(2,*) step*dt, v, k, v+k endif enddo ! la grande boucle s’arrete ici ! close(1); close(2) end
Il n’y a rien de bien exotique dans ce programme. . . et l’on notera qu’il suffit de changer une instruction pour augmenter ou diminuer le nombres d’ast´ero¨ıdes concern´es : c¸a ne changera gu`ere que le temps d’ex´ecution et le volume occup´e par les fichiers de r´esultats ! Comme il s’agit d’un programme tr`es simple, il n’est pas divis´e en sousprogrammes : l’usage en la mati`ere est plutˆ ot d’isoler la partie « Verlet » dans un sous-programme, le calcul des forces et de l’´energie potentielle dans un autre, etc. 9.2.5.2
La conservation de l’´ energie.
La figure 9.4 montre l’int´erˆet qu’il peut y avoir `a surveiller l’´energie du syst`eme. . . qui ne se conserve pas, contrairement `a ce que voudraient les lois de la m´ecanique newtonienne !
Fig. 9.4 – Energies potentielle (en rouge), cin´etique (en vert) et totale (en bleu) dans la simulation des anneaux de Saturne. Les unit´es de temps et d’´energie de cette figure sont des unit´es « r´eduites » donn´ees par le choix de G et de la masse de Saturne, l’un et l’autre fix´es `a un. Dans ce syst`eme d’unit´es, le pas d’int´egration temporel est de δt = 10−4 , et il y a 10000 pas pour ce « run » d’essai. La dur´ee d’ex´ecution d´epend ´evidemment de la puissance de l’ordinateur utilis´e : sur un PC `a 500MHz, il a fallu 15mn, or le syst`eme n’a gu`ere eu le temps, dans ses unit´es de temps `a lui, d’´evoluer sensiblement (on le voit par la faible variation de l’´energie potentielle), il faudra faire des simulations beaucoup plus longues. . . (voir la table 9.1). Il faut toutefois d’abord r´egler cette question de la (non)conservation de l’´energie : une simulation qui viole ainsi un principe fondamental de la physique doit obligatoirement avoir une raison valable pour le faire ! La premi`ere hypoth`ese qui vient `a l’esprit est que le pas
Physique num´erique, Philippe Depondt
133
verge pour r → 0 et que donc, lorsque deux objets s’apTab. 9.1 – Comment faire tourner des programmes qui prochent de tr`es pr`es, on peut s’attendre `a une brusque durent longtemps ? acc´el´eration de leur mouvement n´ecessitant alors un pas — d’int´egration sensiblement plus court. On a d´ej` a parLorsqu’on fait de grosses simulations, il peut ˆetre gˆenant de mo- tiellement trait´ e cette difficult´e en ajoutant un potenbiliser un ordinateur plusieurs heures, voire plusieurs jours d’af- tiel r´ epulsif en r112 qui repr´esente le « cœur dur » des fil´ee : on peut avoir envie de consulter son courier ´electronique, ast´ero¨ıdes (figure 9.5). Reste donc `a traiter de la mˆeme ´editer un texte, tracer une courbe. . . Le syst`eme Unix/Linux fa¸con les interactions entre la plan`ete Saturne elle-mˆeme permet de faire tourner des programmes longs en tˆ ache de fond, ero¨ıdes, compte tenu du fait que la plan`ete est sans gˆene pour les autres activit´es. Il s’agit de lancer une tˆ ache et les ast´ beaucoup plus grosse. avec une faible priorit´e tout en « gardant la main » pour faire autre chose en mˆeme temps ; or Unix est un syst`eme d’exploitation multitˆ ache, c’est-` a-dire que le temps du processeur est hˆ ach´e en petites s´equences tr`es courtes et les diff´erents programmes en cours d’ex´ecution se partagent ce temps. Ainsi, par exemple, lorsqu’un programme mouline tranquillement des nombres en tˆ ache de fond, si on appuie sur une touche du clavier, le programme est interrompu afin que le processeur puisse traiter ce nouvel ´ev´enement, puis red´emarre ensuite. Il y a plusieurs fa¸cons de d’y prendre : 1. mogroprog & o` u le symbole & rend la main sur la fenˆetre concern´ee. C’est exactement comme lorsqu’on tape une instruction comme emacs machin.f &, la fenˆetre n’est pas monopolis´ee par emacs. 2. nohup mogroprog & donne le mˆeme r´esultat sinon que nohup (no hang up) empˆeche l’arrˆet de l’ex´ecution du programme si l’on se d´eloggue. Ainsi, on peut lancer le programme, puis clore la session, rentrer chez soi et revenir le lendemain pour voir ce que le programme a fait pendant ce temps. . . Un autre utilisateur qui aurait ouvert une autre session entre-temps peut tr`es bien ne pas s’apercevoir qu’il y a quelque chose qui tourne en mˆeme temps que ses propres applications !
Fig. 9.5 – Energie potentielle gravitationnelle en − r1 (en −30 rouge), et celle en − 1r + 10r12 (en vert). Il est ais´e de calculer qu’avec 500 ast´ero¨ıdes et un rayon d’orbite moyen r = 1, la distance moyenne entre deux ast´ero¨ıdes est un peu plus grande que la distance `a laquelle le terme r´epulsif commence `a intervenir : les ast´ero¨ıdes sont donc « presque » au contact, du moins au d´ebut de la simulation si on les place sur un cercle.
3. at 2 mongroprog ^D c’est l’ex´ecution diff´er´ee : dans l’exemple ci-dessus, le programme mongroprog d´emarrera ` a 2 heures du matin. Le On obtient ainsi un r´esultat assez satisfaisant (figure symbole ^D repr´esente la touche contrˆ ole (Ctrl) mainte9.6) : les ´energies potentielles et cin´etiques varient en sens nue enfonc´ee en mˆeme temps que la touche d : cela permet es, la somme restant constante. Il faudrait ensuite de marquer la fin de la s´equence d’instructions concern´ees oppos´ bien sˆ ur optimiser le pas d’int´egration afin de conserver la par le lancement diff´er´e.
constance de l’´energie totale tout en r´eduisant autant que 4. batch possible le nombre de pas d’int´egration n´ecessaire pour mongroprog obtenir les ´ev´enements recherch´es. ^D le r´esultat est similaire ` a nohup, mais c’est plus commode si l’on veut faire faire plusieurs choses ` a la suite : batch mongroprog traite result rm -f temp junk file* grocalcul ^D
d’int´egration choisi est trop grand : il faudrait donc le r´eduire. Cependant, r´eduire le pas d’int´egration est coˆ uteux en temps de calcul (puisque, plus le pas est petit, plus il faut faire de pas pour une mˆeme longueur de simulation) et les variations de l’´energie n’interviennent que de temps en temps : quelques ´ev´enements rares perturbent le d´eroulement de la simulation et il paraˆıt dom´ Fig. 9.6 – Evolution temporelle des ´energies apr`es intromage d’augmenter sensiblement le temps de calcul pour duction du terme r´epulsif. quelques ´ev´enements indisciplin´es. Il faut se rappeler que l’interaction gravitationnelle di-
134 9.2.5.3
Licence de physique L3 : Physique Fondamentale & PHYTEM,
Utilisation des r´ esultats.
Lorsqu’on a fait une simulation comme celle-ci et que l’on a v´erifi´e qu’elle se comportait de telle fa¸con que l’on puisse ˆetre raisonnablement convaincu que « c¸a marche », le plus gros travail reste ` a faire. Il faut en effet commencer a` faire de la physique avec l’outil que l’on a fabriqu´e : la premi`ere id´ee est de faire un film, repr´esenter `a l’aide d’outils graphiques appropri´es l’´evolution temporelle du syst`eme, les trajectoires des particules au cours du temps. Mais comment suivre 500 trajectoires (ou plus) simultan´ement ? Il y a alors un travail de r´eflexion th´eorique `a faire du type « dans ce probl`eme quelles sont les grandeurs physiques pertinentes ? ». Ici, on peut, par exemple, calculer la distribution des distances des ast´ero¨ıdes ` a Saturne, ceci en fonction du temps. Si des anneaux se forment, cette distribution doit pr´esenter des pics marqu´es pour les rayons des anneaux. De fait, dans la simulation pr´esent´ee ici, cette distribution devient tr`es rapidement continue sans asp´erit´e remarquable : pas d’anneaux, donc. Que faudrait-il faire pour en obtenir ? Il semblerait qu’` a ce jour (chercher le motclef saturn sur internet ou voir J. Burns, D. Hamilton et M. Showalter, Pour la science, Avril 2002, p. 78) la dynamique des anneaux reste encore un peu myst´erieuse : on invoque l’effet des satellites plus massifs de Saturne ou celui des chocs in´elastiques entre ast´ero¨ıdes et encore le champ magn´etique de la plan`ete. . . Il y a donc l` a des d´ecouvertes `a faire !
9.3
Que peut-on en conclure ?
La diversit´e des probl`emes que l’on peut traiter par des moyens num´eriques est ´enorme, il n’y a donc pas de r´eponse unique `a cette question. En outre les habitudes des chercheurs sont tr`es variables : deux personnes diff´erentes attaqueront sans doute le mˆeme probl`eme diff´eremment, sans que l’on puisse toujours dire a priori lequel a raison. Le meilleur outil est d’abord celui que l’on maˆıtrise et dans bien des cas, fortran, C, Maple ou Octave sont interchangeables, autant utiliser alors le plus simple. Les cas extrˆemes sont d’une part le calcul qui a une solution analytique : le logiciel de calcul formel est alors irrempla¸cable ; de l’autre, la grosse simulation du type « anneaux de Saturne » lourdement consommatrice de temps de calcul : les logiciels sophistiqu´es (et gourmands en ressources, CPU et m´emoire) ne feront que rendre le probl`eme infaisable, alors qu’un langage de programmation simple permet de limiter les d´egˆats. Entre les deux, r`egne un continuum : ` a chacun de tenter de s’y retrouver ! — Le but du pr´esent cours est donc de donner quelques points de rep`eres pour tenter de permettre ` a chacun de faire des choix inform´es : joyeuses computations a` tous. . .
Universit´e Pierre et Marie Curie Paris-6 & ENS-Cachan
Chapitre 10
Bibliographie. 1. J. Bass, Cours de math´ematiques, Masson (1956) 2. B. P. Demidovich, I. A. Maron, Computational Mathematics, MIR (1973), trad. angl. G. Yankovsky, MIR (1987) 3. W. H. Press, S. A. Teukolsky, W. T. Vetterling, B. P. Flannery, Numerical Recipes in Fortran Cambridge University Press (1986, 1992, . . .) 4. D. Taupin, Probabilities data reduction and error analysis in the physical sciences, les Editions de Physique (1988) 5. M.P. Allen, D.J. Tildesley, Computer simulation of liquids Oxford (1990) 6. J. F. Kerrigan, Migrating to Fortran90, O’Reilly (1993) 7. J. R. Shewchuk, An Introduction to the conjugate gradient method without the agonizing pain, www.cs.cmu.edu/~jrs/jrspapers.html (1994) 8. L. Sainsaulieu, Calcul scientifique Masson (1996) 9. T. Pang, An introduction to Computational Physics, Cambridge University Press (1997) 10. B. W. Kernighan, D. M. Ritchie, Le langage C, Masson (1997) 11. Ph. Depondt, Physique num´erique, Vuibert (1998) 12. J. M. Thijssen, Computational Physics, Cambridge University Press (1999) 13. Ch. Guilpin, Manuel de calcul num´erique appliqu´e, EDP Sciences (1999) 14. Y. Epelboin, Cours de m´ethodes num´eriques pour la physique, http://physp6www.cicrp.jussieu.fr (2001) 15. J.-J. Chattot, Computational Aerodynamics and Fluid Dynamics, Springer (2002) 16. K. Protassov, Analyse statistique des donn´ees exp´erimentales, EDP Sciences (2002) 17. I. Danaila, F. Hecht, O. Pironneau, Simulation num´erique en C++, Dunod (2003) 18. M. Metcalf, J. Reid, M. Cohen, Fortran 95/2003 explained, Oxford University Press (2004) 19. J.-P. Demailly, Analyse num´erique et ´equations diff´erentielles, EDP Sciences (2006) 20. Collectif, Dossier Pour la Science La mod´elisation informatique, exploration du r´eel, (juillet/septembre 2006), voir ´egalement http://interstices.fr 21. W. Krauth Statistical mechanics : Algorithms and Computations, Oxford University Press (2006) 135