Académique Documents
Professionnel Documents
Culture Documents
de la
PHYSIQUE NUMÉRIQUE
Licence de physique L3 PHYTEM
Master de physique et applications M1 PF
Université Pierre et Marie Curie Paris-6 — ENS-Cachan
Ph. Depondt 1
Année 2014-2015
0.0025
0.0025
0.002
0.002
0.0015
0.0015
0.001
0.001
0.0005
0.0005
01
0
0.9
0.8
0.7
0.6
X2 0.5
0.4
0.3
0.2
0.1
0 0.4 0.5 0.6 0.7 0.8 0.9 1
0 0.1 0.2 0.3
X1
1. INSP (Institut des NanoSciences de Paris), CNRS UMR 7588 & Université P. et M. Curie Paris-6. Con-
tact : depondt@insp.jussieu.fr
2 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
Table des matières
1 Introduction 7
1.1 Des méthodes numériques, pour quoi faire ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.1.1 Quelques jalons. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.1.2 . . . et quelques exemples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2 Plan succinct. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3
4 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
2.14.5 Récursivité. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3 Un prototype de TP 41
3.1 Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2 La lentille demi-boule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2.1 Préliminaires analytiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2.2 Écriture d’un programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2.3 Premiers résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2.4 Tracé des rayons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2.5 Au-delà de la réflexion totale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4 Méthodes numériques. 45
4.1 Recherche des zéros d’une fonction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.1 Méthode de la dichotomie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.2 Méthode de Newton. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.1.3 Comment s’y prendre ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.2 Représentation des nombres dans un ordinateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.2.1 Les nombres entiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.2.2 Les nombres réels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2.3 Conséquence. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.3 Suites et séries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.3.1 Généralités et premières difficultés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.3.2 Calcul des intégrales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.4 Échantillonnages, interpolation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.4.1 Interpolation linéaire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.4.2 Approximation parabolique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.4.3 Polynômes de Lagrange. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.4.4 Dérivées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.5 Algèbre linéaire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.5.1 Un exemple : la diffusion de la chaleur à une dimension. . . . . . . . . . . . . . . . . . . . . . . 55
4.5.2 Systèmes d’équations linéaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.5.3 Une généralisation de la méthode de Newton à plusieurs dimensions. . . . . . . . . . . . . . . . 58
4.5.4 Problèmes de vecteurs propres et de valeurs propres ou eigenproblems. . . . . . . . . . . . . . . 59
4.6 Problèmes autocohérents. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.6.1 Qu’est-ce donc ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.6.2 Formulation générale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.6.3 Est-ce que ça converge ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.7 Recherche des minima d’une fonction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.7.1 Du mouvement des amibes (méthode du simplex). . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.7.2 Méthode de Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.7.3 Recherche à une dimension : interpolation parabolique. . . . . . . . . . . . . . . . . . . . . . . 63
4.7.4 Méthode du gradient conjugué. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.7.5 Minimisation avec contrainte : les multiplicateurs de Lagrange. . . . . . . . . . . . . . . . . . . 65
4.8 Modélisation de données expérimentales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.8.1 Données et moindres carrés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.8.2 Ajustement d’une fonction linéaire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.8.3 Ajustement d’un polynôme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.8.4 Dérivée locale d’une courbe expérimentale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.8.5 Lissage : a dirty trick ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.8.6 Ajustement non-linéaire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.9 Systèmes d’équations différentielles ordinaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.9.1 Un exemple : les lignes de champ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.9.2 La méthode d’Euler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.9.3 La méthode d’Euler ≪ améliorée ≫ ou méthode de Heun. . . . . . . . . . . . . . . . . . . . . . 72
4.9.4 La méthode de Runge-Kutta d’ordre 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.9.5 La méthode de Cranck et Nicholson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.9.6 Équations d’ordre supérieur à 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.9.7 Méthode de Verlet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.9.8 Le problème du pas d’intégration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.9.9 Quelle méthode choisir ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.10 Transformées de Fourier rapides. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.10.1 La transformée de Fourier en physique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.10.2 La transformée de Fourier discrète. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Physique numérique, Philippe Depondt 5
10 Bibliographie. 135
Chapitre 1
Introduction
≪ Si vous pensez que le calcul numérique, c’est l’af- tion d’irradiation de matériaux divers ou régulation
faire des autres, c’est qu’il est temps de vous recycler ≫ : de la distribution d’électricité ; les fabriquants de tur-
cette affirmation péremptoire, et volontairement provoca- bines qui cherchent à optimiser leur fonctionnement
trice 1 , est à comprendre dans un contexte où le CEA, simulent les phénomènes très complexes liés aux in-
le CNRS, la Communauté Européene et les grands in- stabilités dans les chambres de combustion.
dustriels s’équipent résolument de moyens de calcul tou- Il n’y a guère de domaine qui échappe : même la finance
jours plus considérables. Le sigle HPC (High Performance recrute des scientifiques capables de modéliser sur ordina-
Computing) jaillit un peu partout. . . On parle volon- teur ! Un(e) physicien(e) de formation, que ce soit dans un
tier, et le plus sérieusement du monde, de PetaFlops 2 environnement recherche ou industriel peut difficilement
(sans forcément toujours très bien comprendre de quoi il ignorer ce domaine dont l’importance est de plus en plus
s’agit. . .). C’est sans doute que l’enjeu en paraı̂t important massive, même si il/elle n’est pas directement impliqué(e)
aux décideurs (et aux payeurs) à la fois pour la recherche dans des calculs légers ou lourds.
scientifique et pour la recherche et développement (R L’évolution fulgurante de la capacité de calcul
& D) industriel. Les demandeurs de ce genre de calculs disponible ne peut toutefois être utile et profitable que s’il
lourds voire très lourds sont divers ; par exemple et dans y a des personnes compétentes pour s’en servir de façon
le désordre : pertinente et donc convenablement formées : il s’agit là
– La météorologie est l’un des utilisateurs civils les d’une double compétence à la fois scientifique dans la disci-
plus importants : les prévisions au quotidien bien pline d’origine (physique, chimie, mathématiques, science
sûr, mais aussi les recherches sur le réchauffement de la vie, etc.) et de simulation : ≪ Some jog along with the
climatique, essayer d’en prévoir les conséquences, technology while others lag behind 3 . . . ≫. Ce monde évolue
voire trouver des remèdes requièrent des simulations rapidement et le but de ce cours est de fournir les bases et
très élaborées des mouvements atmosphériques et des les démarches permettant de s’y repérer.
échanges chimiques et énergétiques.
– La matière condensée, les matériaux et les L’expérience tend à montrer que ce cours de Physique
nanosciences en physique et en chimie offrent numérique surprend parfois un peu ceux à qui il s’adresse.
une variété incroyable de problèmes mettant en jeu Il commence, en effet, par de la programmation et quelques
un grand nombre (entre quelques dizaines et le nom- notions d’Unix : serait-ce alors un ≪ cours d’info ≫, comme
bre d’Avogadro !) d’atomes : des calculs classiques ou on l’entend souvent appeler ? Très rapidement toutefois,
quantiques, parfois assez simples, parfois très lourds, après quelques semaines, on ne parle plus, ou presque
sont mis en œuvre pour tenter de comprendre ou de plus, d’informatique ou de programmation : c’est sup-
prédire leurs propriétés. posé acquis ; on parle de physique principalement, parfois
– Les sciences de la vie se préoccupent, au niveau micro- ornée d’un peu de mathématiques appliquées. En outre,
scopique, de molécules énormes, extraordinairement cette physique ne paraı̂t, parfois, guère familière à des
complexes. Des efforts considérables sont faits pour étudiants habitués à résoudre des problèmes dont la so-
tenter de modéliser ces objets, avec des enjeux impor- lution analytique est connue : c’est qu’ici, justement, l’ob-
tants : repliement de proteines, conséquences pour la jectif est de résoudre des problèmes pour lesquels il n’y
maladie d’Alzheimer ou celle de Parkinson, drug de- a pas de solution analytique, c’est-à-dire l’immense ma-
sign, etc. La génomique, de son côté, doit utiliser des jorité. . . L’informatique est alors pour nous un outil - qu’il
bases de données colossales en utilisant des méthodes faut bien sûr maı̂triser - pour s’attaquer à des problèmes
qui doivent être efficaces et n’ont rien de trivial. de physiques variés. Le charme de cet enseignement, pour
– Les sciences de l’ingénieur sont aussi très deman- les enseignants mais aussi souhaitons-le pour ceux qui le
deuses. Les simulations aérodynamiques permettent reçoivent, une fois - répétons-le - l’outil acquis, est qu’il ne
de prévoir et d’optimiser les caractèristiques d’un se cantonne pas à tel ou tel domaine de la physique, mais
avion avant même son premier vol ; un industriel qu’il pioche ses exemples dans des champs aussi variés que
comme EDF développe des calculs souvent très lourds possible, dans des questions souvent très contemporaines,
dans des domaines d’une grande diversité : simula- avec des approches parfois inattendues.
1. faite par un professeur de mathématiques à l’UPMC en intro- Le présent polycopié déborde assez largement le strict
duction à un colloque intitulé Penser PetaFlops en mai 2008. minimum nécessaire à la réussite à l’examen. . . c’est volon-
2. 1015 floating point operations per second. La première machine
≪ pétaflopique ≫ a fonctionné au printemps 2008. L’étape suivante 3. ≪ Certains accompagnent le peloton tandis que d’autres
est l’ExaFlops : 1018 flops. . . traı̂nent derrière. ≫
7
8 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
taire : à chacun de sélectionner ce qui lui paraı̂t utile, les Un autre exemple, moins célèbre sans doute, est l’ensem-
séances de travaux dirigés et de travaux pratiques étant ble des opérations qui, pendant la Révolution Française,
de bons guides en la matière 4 . ont abouti à la définition du mètre, en remplacement
du maquis d’unités de l’Ancien Régime, par un système
uniforme et rationnel. On voulait que le mètre fût uni-
1.1 Des méthodes numériques, versel (on aurait certes put choisir comme référence les
unités en vigueur à Paris, mais l’idéal universaliste des
pour quoi faire ? révolutionnaires l’interdisait) et l’on choisit ainsi une
référence qui pût être commune à toute l’humanité : la dix-
À titre de provocation, on pourrait dire que l’objet de ce
millionième partie du quart du méridien 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ôt d’utiliser les ressources fournies par les ordi-
mathématiciens-astronomes réputés pour leur précision
nateurs pour tenter de traiter des problèmes de physique
et le soin avec lequel ils menaient leurs observations
aussi variés que possible, afin, soit de se simplifier la vie
(Jean-Baptiste-Joseph Delambre (1749-1822) et Pierre-
et gagner du temps en faisant faire par un ordinateur des
François-André Méchain (1744-1804)) équipés des instru-
calculs fastidieux que l’on pourrait sans doute faire soi-
ments de visée les plus élaborés, mesurer entre Dunkerque
même, soit au contraire de s’attaquer à des questions que
et Barcelone la longueur de l’arc de méridien de Paris : en
l’on ne pourrait en aucun cas traiter avec une feuille de
déterminant très précisément la latitude des deux villes
papier et un crayon. . . Nous chercherons ainsi dans divers
(à partir de la hauteur de l’Étoile Polaire et de quelques
domaines de la physique des problèmes, de préférence peu
autres) on en déduirait aisément la longueur du méridien
susceptibles d’une solution analytique, afin de les traiter
complet.
numériquement à l’aide d’un calcul sur ordinateur, l’ob-
jectif étant d’apprendre comment aborder une question de Il fallait donc établir un réseau de triangles qui recou-
façon qu’un calcul permette d’y répondre de manière sat- vre complétement l’arc de méridien compris entre les deux
isfaisante, quitte à la reformuler au passage pour la faire villes, mesurer avec une précision méticuleuse les angles
entrer dans un cadre propice à ce genre de traitement. aux sommets de tous ces triangles afin d’en calculer la
longueur des côtés, puis par trigonométrie, la longueur
de l’arc. Cette épopée (racontée par Ken Alder dans The
1.1.1 Quelques jalons. . . measure of all things, Free Press (2002)) dura sept ans
(1792-1799) dans une France en proie à toutes sortes de
Il ne faut cependant pas croire que les calculs numé- violences (les invasions, les guerres révolutionnaires, la
riques aient attendu l’invention de l’ordinateur pour voir Terreur, Thermidor. . .) : dans les jours qui suivirent la
le jour. Au XVIIe siècle déjà, l’invention des logarithmes fuite de Louis XVI à Varennes, Delambre avec son at-
par John Napier (1550-1616) fut une révolution (Miri- tirail de longue-vues et d’instruments, et, pire encore,
fici logarithmorum canoni descriptio, Edimbourg (1614)) : son ordre de mission signé par le roi fugitif, fut arrêté
une multiplication se transformait en addition -beaucoup à plusieurs reprises comme ≪ espion ≫ ; un peu plus
plus aisée-, une extraction de racine carrée en division tard, Méchain resta bloqué en Catalogne quand l’Espagne
par deux ! L’astronome Johannes Kepler (1571-1630) qui bourbonnienne et la France républicaine se trouvèrent en
découvrit l’ellipticité des orbes planétaires, se livra à des guerre ; Méchain dut aussi lutter en permanence contre
calculs numériques vertigineux dans, par exemple, son œu- un état psychologique dépressif lié à son inquiétude quant
vre principale, l’Astronomie Nouvelle (Astronomia Nova, à la qualité de ses mesures. Les deux hommes revinrent
(1609) ). Ainsi, par exemple, pour évaluer les positions au enfin à Paris en 1799 pour présenter leurs résultats :
cours du temps d’une planète alors qu’elle parcourt ce qui une conférence internationale de mathématiciens devait :
n’est encore qu’un ≪ ovoı̈de ≫ avec une vitesse variable 5 , 1o vérifier et valider la cohérence de leurs observations, et
il divise la trajectoire en 360 petits segments et additionne 2o en déduire la longueur du mètre.
les résultats obtenus pour chaque segment : c’est ce que
l’on appelle maintenant une discrétisation. Kepler, lui, ap- Il fallait donc, pour la deuxième partie de ce tra-
pelait cela un ≪ morcellement numérique ≫ et se plaig- vail, faire des calculs de trigonométrie sur une surface
nait de ce que ce calcul fût ≪ mécanique et ennuyeux ≫ : sphérique. On savait cependant qu’outre les montagnes
comme son employeur, l’empereur Rudolf II., ne payait dont il fallait bien sûr tenir compte, la Terre n’était pas
son salaire qu’occasionnellement, il n’avait pas les moyens une sphère parfaite mais plutôt un ellipsoı̈de de révolution
d’employer lui-même un assistant pour l’aider. . . Il con- légèrement applati aux pôles : toutefois, le choix d’un arc
naissait d’ailleurs les tables de logarithmes de Napier et de méridien situé à des latitudes intermédiaires (le 45˚par-
en établit lui-même dans ses Tables Rodolphines (Tabulæ allèle passe à Bordeaux et donc coupe l’arc Dunkerque-
Rudolphinæ, (1627) ). Barcelone non loin de son milieu) permettait d’espérer
obtenir une valeur moyenne qui pût servir de référence.
4. Le chapitre 5, en particulier doit être considéré comme la suite On fit alors une découverte complétement inattendue :
logique du cours, mais n’en fait à proprement parler partie. le géoı̈de n’était pas régulier mais recouvert de bosses
5. Jusqu’alors, on croyait, Copernic, Tycho Brahe et Galilée y
et de creux. La valeur du rayon de courbure de la sur-
compris, que les mouvements planétaires étaient des mouvements
circulaires uniformes, ou des combinaisons de mouvements circulaires face terrestre dépendait de l’endroit où il était mesuré,
uniformes, ce qui permettait un calcul facile des positions planétaires or la précision magnifique des observations de Delambre
futures. Kepler, comme on le sait, introduisit, à cause d’un désaccord et Méchain, le soin méticuleux -voire obsessionnel dans
de 8 minutes d’angle dans la position de Mars, les orbes, d’abord
ovoı̈des puis elliptiques, parcourues à vitesse variable ; les prédictions
le cas de Méchain- avec lequel elles avaient été réalisées
en devenaient beaucoup plus difficiles : il fallut attendre Newton pour ne permettaient pas de mettre ce résultat sur le compte
voir la résolution de ce problème. d’erreurs ou d’imprécisions de mesure. Après de longues
Physique numérique, Philippe Depondt 9
Curseur transparent
Réglette
a b
Graduations logarithmiques
a.b
Figure 1.1 – La règle à calcul, héritière des tables de logarithmes de John Napier, en usage jusqu’à la fin des années
1970. La réglette pouvait coulisser dans une gorge aménagée dans la règle 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éplaçait la réglette
de telle façon que son origine se trouve en face de la graduation a de la règle, puis on déplaçait le curseur jusqu’à la
graduation b de la réglette pour lire le résultat : comme les graduations étaient logarithmiques, on additionnait ainsi
deux logarithmes pour obtenir le produit de leurs arguments.
tergiversations, on finit néanmoins par fixer la valeur du culs en tâches élémentaires avec une calculatrice du type
mètre à 443,296 lignes (une unité en vigueur à Paris alors) de celle de Pascal et un système de cartes perforées issu
et l’on fondit le fameux mètre-étalon en platine irridié du des métiers à tisser Jacquard. Malheureusement, malgré
pavillon de Breteuil. un financement public conséquent, et une ≪ communica-
Au-delà de l’histoire plus ou moins anecdotique, on tion ≫ - comme on dirait maintenant - efficace assurée
devine en arrière-plan les prodigieux calculs numériques par Ada Byron 6 , les réalisations pratiques ne donnèrent
que les mathématiciens de la conférence ont dû faire jamais satisfaction, à cause semble-t-il des frottements ex-
(outre les travaux de dégrossissage réalisés par Delambre cessifs des mécanismes.
et Méchain : corrections pour l’altitude, la réfraction atmo- La première réalisation pratique de calculs massifs au-
sphèrique, la température, etc.) armés d’une plume pour tomatisés est due à Herman Hollerith qui inventa une ma-
écrire et d’une table de logarithmes. Il ne se répartirent chine pour traiter les données du recensement américain
même pas la tâche, car pour plus de sûreté, chaque par- de 1890 à l’aide de cartes perforées. Le résultat (62 622
ticipant devait faire indépendamment l’intégralité des cal- 250 habitants) fut obtenu en six semaines au lieu de sept
culs en utilisant ses propres méthodes ! On reste pantois ans pour le recensement précédent. Fort de ce succès, Hol-
devant la dextérité et l’acharnement calculatoires que cela lerith fonda en 1896 la Tabulating Machine Company qui
représente. . . changea de nom en 1924 pour devenir International Busi-
Un peu plus tard, au XIXe siècle, Urbain Le Verrier ness Machines : ibm. . . spécialisée dans la fabrication de
étudia les perturbations observées dans l’orbite d’Uranus calculatrices mécaniques de bureau, parfois mûes par des
et postula l’existence d’une autre planète jusqu’alors in- moteurs électriques, ou utilisant des cartes perforées.
connue. Il calcula la position de cette planète et le di- Un effort de recherche important sur le calcul automa-
recteur de l’observatoire de Berlin, Johann Galle, vit tique fut mené aux États-Unis pendant la deuxième guerre
à l’endroit indiqué, le 23 septembre 1846, la nouvelle mondiale poussé en grande partie par le Ballistic Research
planète, Neptune : un triomphe pour le valeureux cal- Laboratory. Il fallait calculer les trajectoires des projectiles
culateur ! On imagine sans peine cependant l’énorme tirés par divers armements afin de fournir des tables de
labeur que représentèrent, pour Le Verrier, ces calculs, pointage aux artilleurs. Pour chaque nouvelle munition, il
entièrement faits à la main. . . fallait produire une nouvelle table. Une armée d’employés,
Cependant, l’idée d’automatiser des calculs ennuyeux dotés de calculatrices mécaniques de bureau, faisait ces
est ancienne. Le baron Gaspard de Prony était chargé calculs, mais à la fin de la guerre, était littéralement sub-
pendant le Premier Empire d’établir des tables pour le mergée par l’afflux de munitions de tous types et de tous
calcul de l’impôt foncier : pour cela, il divisa le tra- calibres produits par une industrie de guerre en plein ef-
vail en trois grands blocs. La première partie, la plus fort. . . La première calculatrice électronique, l’ENIAC en
noble, était confiée à des mathématiciens : il s’agis- 1945, était un monstre de 30 tonnes comportant 17 468
sait de décomposer tous les calculs nécessaires en séries tubes à vide 7 et consommant 150 kW. La panne d’un seul
d’opérations élémentaires. La deuxième tâche consistait à tube arrêtait la machine qui occupait un bâtiment à elle
organiser le travail et à compiler les résultats. La troisième, toute seule et nécessitait un système de refroidissement
faire les calculs réduits à des opérations très simples, fut puissant pour évacuer la chaleur produite ! Les premiers
confiée à une armée de calculateurs humains dont la seule ordinateurs virent le jour à la fin des années 1940, trop
qualification était d’être capable de faire des additions. tard pour participer à l’effort de guerre.
L’étape suivante fut franchie par Charles Babbage, un 6. la fille du poète.
gentleman philosopher britannique du début du XIXe 7. il n’y avait pas encore de transistors et encore moins de circuits
siècle qui eut l’idée d’associer cette décomposition des cal- intégrés.
10 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
Rapidement, les banques, les compagnies d’assurance 8 dispensable à leur dextérité calculatoire. . . les calculettes
et toutes les entreprises astreintes à une comptabilité électroniques n’ayant détrôné l’invention de Napier qu’à
lourde comprirent l’usage qu’elles pouvaient faire de ces la fin de la décennie. Un livre de ≪ mathématiques com-
nouvelles machines et constituèrent un marché important putationelles 9 ≫ régulièrement réédité jusqu’à la fin des
pour les constructeurs. Cependant, la demande de calculs années 80 explique, dans un chapitre d’introduction inti-
toujours plus importants venant des scientifiques, physi- tulé ≪ General rules of computation work ≫, que si l’on
ciens et astronomes en tête, n’a jamais cessé d’être pres- veut construire une table des valeurs de la fonction :
sante, toujours de quelques ordres de grandeur au-delà ex + cos x p
de ce que pouvaient fournir les ordinateurs les plus puis- y= + 1 + sin2 x
1 + x2
sants du moment : cette histoire se poursuit actuellement,
certains calculs quantiques, par exemple, se chargeant, il faut faire sur une feuille de papier un tableau à 12
par leurs exigences en termes de puissance de calcul, de colonnes donnant, pour la première la liste des valeurs
ramener à une saine modestie les fabriquants des pro- de x, la deuxième celles de x2 , la troisième ex , etc., la
cesseurs les plus éblouissants ! douzième donnant enfin la liste des valeurs de y (voir la
table 1.1) : il n’est pas inutile de réaliser que tous les cal-
culs scientifiques étaient réalisés de la sorte jusqu’à un
passé somme toute récent à l’échelle d’une vie humaine 10 .
Figure 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ème ligne pour 126
et enfin la colonne 3 : on y trouve 10140. La même opération pour 1817 donne 25935. La somme de ces deux nombres
est 36075. En cherchant dans la table, on trouve que 39078 correspond à 2295, reste à décaler la virgule convenablement
pour obtenir le résultat. Si l’on veut avoir 5 chiffres significatifs, il faut utiliser les tables de multiplication fournies
dans la marge pour faire des interpolations linéaires. Avec un peu d’habitude, ça va assez vite, plus vite en tous cas
que la multiplication à la main !
sur ordinateur, car le calcul analytique est insuffisant : centaines voire des milliers, destinée à soigner telle ou telle
d’ailleurs maintenant, la météorologie nationale est un des maladie. Survient alors une tâche assez difficile, la ≪ modé-
plus gros consomateurs civils de calcul sur les ordinateurs lisation de données d’expérience ≫ qui consiste à ajuster
les plus puissants. un modèle théorique aux données expérimentales con-
Dans un autre domaine, les expériences faites par ex- nues, en tenant compte des barres d’erreur expérimentales.
emple à l’aide du rayonnement synchrotron produit dans Il s’agit en général de minimiser autant que possible
des laboratoires tels que SOLEIL à Orsay et l’ESRF l’écart entre les données empiriques et les prédictions du
à Grenoble, produisent une grande quantité de données modèle théorique : cette minimisation, une optimisation
numériques qui ne se traduisent pas immédiatement par du modèle si l’on préfère, est établie en ajustant un nom-
des informations de type physique : par exemple, les po- bre souvent élevé de paramètres (les positions atomiques,
sitions des atomes d’une protéine, qui en comporte des la caractérisation de l’agitation thermique) et ne peut pra-
12 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
1 2 3 4 5 6 7 8 9 10 p 11 12
ex +cos x
x x2 ex sin x cos x x
e + cos x 1 + x2 sin2 x 1 + sin2 x 1 + sin2 x y
1+x2 p
(1)2 (3) + (5) 1 + (2) (6)/(7) (4)2 1 + (9) (10) (8) + (11)
0
0.1
0.2
0.3
0.4
...
ex + cos x p
Table 1.1 – Feuille de calcul pour la fonction y = + 1 + sin2 x, à remplir, colonne par colonne, à l’aide
1 + x2
d’une machine à calculer mécanique ou électro-mécanique. . .
Table 1.2 – Un article du journal Le Monde en 1957, les où C est la constante de force entre deux atomes. Main-
derniers progrès de la prévision météorologique, il y a un tenant, si la chaı̂ne comporte des impuretés de masse
demi-siècle : m′ réparties aléatoirement, le problème devient beaucoup
Une machine à prédire le temps plus difficile à résoudre. On montre cependant sans grande
Quel temps fera-t-il demain ? Vieille question à laquelle les of- difficulté que la solution est donnée par la recherche des
fices météorologiques s’efforcent de répondre. Mais voici que la valeurs propres et vecteurs propres d’une énorme matrice
machine électronique vient à leur secours. On connaı̂t les ap- n × n, appelée ≪ matrice dynamique ≫ où n est le nom-
titudes extraordinaires de ces ordinateurs, véritables cerveaux bre d’atomes de la chaı̂ne. Le problème est très facile à
de remplacement, doués de raisonnement et d’une fabuleuse résoudre numériquement à l’aide d’un sous-programme de
mémoire, qui peuvent aujourd’hui répondre en quelques sec- bibliothèque, alors que le désespoir guette quiconque ten-
ondes à des questions qui embarasseraient plus d’un auditoire
terait de le résoudre à la main. . .
savant.
C’est à des machines semblables que le Bureau météorologique
américain demande de travailler pour lui, au moins pour un cer- On pourrait objecter à ce qui précède qu’un problème
tain nombre de calculs. Ce bureau centralise des milliers d’ob- de physique qui nécessite plus qu’une règle de trois pour
servations qu’une armée de savants, de ballons-sondes, toute être résolu est un problème mal posé. L’art du physicien
une flotille de bateaux, tout un réseau de postes et de sta- théoricien n’est-il pas justement de faire des approxima-
tions disséminés aux quatre coins du monde, glanent quoti- tions adroites de façon à rendre résolubles ces problèmes
diennement et à chaque instant sur terre, sur mer et dans le tout en isolant les principes importants ? L’intérêt n’est-il
ciel. pas plutôt dans les concepts que dans les techniques de
Rien n’a changé dans le système, si ce n’est qu’une grande par-
calcul plus ou moins laborieuses ?
tie des opérations mathématiques, la plus dure, la plus longue,
est confiée à l’ordinateur. A chaque instant on introduit dans Cette objection est parfaitement recevable et c’est tou-
la machine, sous forme de bandes magnétiques, de nouvelles jours une bonne démarche que de tenter de réfléchir à
observations, de nouveaux chiffres, qui sont la nourriture de une question avant de se lancer dans des calculs effrénés.
ce cerveau surhumain, et les savants n’ont plus qu’à tirer leurs Il y a cependant des limites qui souvent arrivent très
conclusions. Ils peuvent ainsi annoncer, avec une plus grande vite : imaginons un pendule simple qui subit un frotte-
sûreté de diagnostic, l’évolution du temps pour des périodes de ment aérodynamique. Il pend verticalement et on le lance
vingt-quatre, quarante-huit et même soixante-douze heures.
avec une vitesse initiale donnée, suffisamment fort pour
(Le Monde, le 25 juillet 1957, reproduit le 25/07/2007).
qu’il passe à la verticale au dessus de son point d’équilibre
pour retomber de l’autre coté. Combien de tours fera-t-
il autour de son axe avant de se mettre à osciller ? Il est
tiquement se faire qu’à l’aide d’un ordinateur.
clair qu’on est fort loin des conditions où l’on peut faire
L’étude des systèmes désordonnés est aussi grosse con- les approximations usuelles (angle petit). En attendant de
sommatrice de moyens de calcul. Par exemple, une chaı̂ne trouver le concept adéquat, il n’est peut-être pas stupide
linéaire harmonique d’atomes, tous de masse m, est par- de faire une petite simulation numérique sur un ordina-
courue de vibrations de type onde plane xℓ = u ei(ωt−kℓa) , teur : cela ne représente guère plus que quelques dizaines
où xℓ est le dépacement de l’atome ℓ par rapport à sa po- de lignes de programme et quelques secondes de simulation
sition d’équilibre et a est la distance interatomique. Un sur une machine même de puissance médiocre. . .
calcul classique 13 à partir des équations du mouvement :
Il ne faut pas croire non plus que le calcul numérique
m ẍℓ = C(xℓ+1 − 2xℓ + xℓ−1 ) sur ordinateur se limite à la physique : les prévisions
météorologiques (voir la table 1.2) sont évidemment un
donne la pulsation ω en fonction du vecteur d’onde k, c’est- cas bien connu, mais aussi les simulateurs de vol permet-
à-dire la relation de dispersion : tent à des pilotes d’essais de tester le comportement d’un
nouvel avion sans risquer leurs vies et des simulateurs
r
C ka d’opérations permettent à des chirurgiens de s’entraı̂ner
ω(k) = 2 sin sans risquer celles de leurs patients ! Le dossier de la revue
m 2
Pour la Science (voir la bibliographie, ref. (20)) consacré
13. Voir, par exemple : Charles Kittel, Introduction to Solid à la modélisation informatique parcourt quelques thèmes
StatePhysics, New York : Wiley, (1986). ≪ à la mode ≫. . .
Physique numérique, Philippe Depondt 13
Les notes ci-dessous ont pour but de donner rapide- la mémoire est aussi désigné par une adresse binaire.
ment au lecteur la capacité d’écrire des programmes ; elles C’est ce qu’on appelle le langage machine. Réaliser un
ne remplacent pas, bien sûr, un cours systématique 1 . Il programme consiste donc à fournir à l’ordinateur une
s’agit ici d’un outil dont la maı̂trise est un préalable in- séquence d’instructions de ce type pour qu’il la place
dispensable à tout travail de calcul numérique : il n’est dans sa mémoire pour exécution ; or il est rapidement
pas utile de connaı̂tre toutes les subtilités du Fortran95, fastidieux d’aligner des listes fort longues de 1 et de 0,
sans compter les risques d’erreurs que cela comporte ! Un
mais il faut impérativement être capable d’écrire rapi-
premier progrès fut de remplacer le code binaire d’une
dement des programmes simples ≪ qui marchent ≫ car, instruction par un mot-clef, par exemple load (pour
sinon, les séances de travaux pratiques destinées à faire charger en mémoire), et d’écrire les adresses en décimal
de la physique que l’on espère intéressante avec cet outil, (ou en hexadécimal) plutôt qu’en binaire. Cela donne
en deviendraient suprêmement ennuyeuses pour tous, en- quelque chose qui peut ressembler à :
seignants compris. . . load 150 aller chercher un nombre à l’adresse 150
add 200 additionner avec le contenu de l’adr. 200
2.1 Qu’est-ce qu’un langage de store 220 ranger le résultat a l’adresse 220
C’est nettement plus lisible que :
programmation ?
0011010100101100011111100100001001110101...
Un ordinateur, lorsqu’il exécute un programme, lit
l’une après l’autre dans sa mémoire des instructions Un programme spécial, en général fourni avec l’ordinateur
élémentaires, par exemple : ≪ aller chercher un nombre et appelé assembleur traduit alors toutes ces instructions
à tel emplacement dans la mémoire ≫ ou ≪ multiplier tel en binaire ou langage machine, puis on peut faire exécuter
nombre par tel autre ≫. Ce schéma correspond à la célèbre le programme (voir les tables 2.1 et 2.2).
≪ machine de Turing ≫ qui sert de modèle théorique à L’assembleur permet de faire beaucoup de choses,
l’immense majorité des ordinateurs (figure 2.1) : instruc- presque tout, à vrai dire : à une époque (les années
tions et données sont inscrites sur un même support ap- 80) où les mémoires disponibles n’étaient pas ce qu’elles
pelé mémoire 2 . La mémoire est constituée d’emplacements sont devenues, la programmation en assembleur permet-
correspondant chacun à une adresse et contenant chacun tait d’écrire des programmes efficaces et peu encombrants,
une instruction ou une donnée : on peut se représenter au détriment évidemment de la facilité et du temps passé
cette mémoire comme une espèce de long ruban divisé en à la programmation, car tout cela reste très ≪ proche de
cases, chacune d’entre elles ayant un numéro, comme les la machine ≫ et certainement assez peu convivial 4 .
maisons le long d’une rue, chaque numéro constituant une L’étape suivante fut donc de créer des langages dits
≪ évolués ≫ avec lesquels on puisse faire aisément des
≪ adresse ≫.
instructions beaucoup plus compliquées comme, par ex-
La ≪ machine ≫ lit dans la mémoire les instructions
emple :
et les exécute l’une après l’autre séquentiellement 3 . Une
instruction peut être l’ordre d’aller lire une donnée à x = a*exp(i*(omega*t+phi))
l’adresse en mémoire indiquée par cette instruction, ou
de modifier une donnée ou encore d’inscrire une donnée à qui ressemble beaucoup à l’expression mathématique :
une autre adresse dans la mémoire : on peut donc modifier
le contenu de la mémoire. x = a ei(ωt+ϕ)
Chaque instruction est désignée par un code binaire
constitué de 0 et de 1, et chaque emplacement dans et où x et i sont des nombres complexes, les autres vari-
ables étant réelles, exp désignant évidemment l’exponen-
1. voir par exemple J. F. Kerrigan, réf. [6] dans la bibliographie,
tielle et * la multiplication. Un autre programme ap-
ou, plus récent et plus complet M. Metcalf et al., réf. [18].
2. Le terme mémoire date des années 1940, lorsque John Von pelé compilateur doit alors décomposer ces instructions
Neumann s’est préoccupé de réalisations pratiques de la machine évoluées en instructions élémentaires, les coder en bi-
de Turing qui dans son esprit devaient être des cerveaux artificiels. naire et affecter des adresses en mémoire à toutes les
Avant, on parlait, plus prosaı̈quement, de storage en anglais, soit
stockage. 4. J’ai, personnellement, quelques souvenirs cuisants à ce titre :
3. d’où l’expression ≪ machine séquentielle ≫ que l’on retrouve à la suite -entre autres- d’une erreur dans le calcul d’une adresse,
fréquemment : il s’agit simplement d’une machine qui exécute les un programme pouvait très bien écrire une donnée à un emplace-
instructions l’une après l’autre, par opposition aux machines dites ment réservé à une fonctionalité de base du système, ce qui était
≪ parallèles ≫. évidemment plutôt catastrophique !
15
16 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
16
58
4
41
14
64
150 200 220 en 10 en 1
1.
3.
2.
Figure 2.1 – La machine théorique de Turing. Le curseur lit les instructions les unes après les autres et la machine les
exécute. Par exemple : aller lire une donnée à un emplacement de la mémoire vive, ou sauter à une autre instruction,
etc.
6. il existe des environnements intégrés, en particulier sous Win- Le résultat de la compilation est donc, quand tout s’est
dows, dans lesquels ces étapes sont plus ou moins automatiques et bien passé, un programme exécutable qu’il reste à faire
donc quasiment invisibles.
7. Il y eut aussi l’étape ruban perforé qui permettait, avant les 10. certains compilateurs fortran90 exigent que le nom du fichier
bandes, disquettes et autres supports magnétiques, d’enregistrer des source se termine par .f. Pour d’autres, la terminaison .f signifie
données : cet engin était -justement- surnommé ≪ la mitrailleuse ≫ ! ≪ format fixe ≫ et la terminaison .f90, ≪ format libre ≫
8. Les programmes écrits en fortran77 peuvent être compilés 11. On peut fabriquer une commande personnelle de compilation,
avec un compilateur fortran95. par exemple en créant un fichier appelé gf95 dans lequel on met
9. Le compilateur g95 est aisément téléchargeable sur la ligne : gfortran $1.f90 -o $1. Ce fichier peut alors être rendu
http://g95.org/. Le compilateur gnu (Le mot anglais gnu exécutable par la commande : chmod +x gf95. Pour compiler un pro-
désigne le gnou, une espèce de buffle, et le sigle gnu signifie : GNU’s gramme, il suffira dorénavant de taper : gf95 monboprog. Selon les
Not Unix, un exemple d’autoréférence typique d’un certain humour besoins, gf95 peut être modifié ensuite pour inclure d’autres options
informatique) gfortran est disponible comme faisant partie des de compilation comme -O3 (optimisation) ou des bibliothèques de
distributions Linux (Debian, Ubuntu, Fedora) et, convenablement calcul.
installé, il paraı̂t raisonnablement efficace à condition d’utiliser 12. compilateur commercial de Portland Group.
l’option d’optimisation -O3. 13. compilateur ibm.
18 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
2.2.2 Déclarations.
Tout ceci suppose cependant que l’on ait déjà ≪ dit ≫ à
l’ordinateur que a, b et c sont des emplacements de la
mémoire destinés à contenir des nombres, par exemple des
Ceci n’est pas un = nombres réels : c’est ce qu’on appelle une déclaration. Ainsi
la déclaration :
real :: a, b, c
Figure 2.3 – Le signe = dans une instruction n’est pas
une égalité mathématique ! déclare que l’on va occuper trois emplacements mémoire
dorénavant appelés a, b et c et que l’on mettra des nom-
Il ne faut surtout pas s’imaginer que le signe = ci-dessus bres réels dedans 14 . Comme on peut changer la valeur
soit une égalité mathématique ! Il s’agit d’une instruction, du contenu de ces emplacements, on les appelle vari-
d’un ordre que l’on donne à l’ordinateur : on lui ≪ dit ≫ de ables. Un nom de variable peut être simplement une lettre
calculer la valeur numérique de ce qui se trouve à droite comme a ou x, ou alors une combinaison de lettres et de
du signe égal et de le placer dans l’emplacement de la chiffres à condition de commencer par une lettre, par ex-
mémoire désigné par le symbole qui se trouve à sa gauche.
emple : agecpt, y2, zmax, mais pas : 2pi ou s*3 (* est
On peut considérer le signe égal comme une affectation ou
une flèche : un caractère spécial désignant la multiplication). Le car-
actère “ ” ≪ blanc souligné ≫ ou underscore est également
a = b autorisé : pere ubu ou nbr pas. La longueur peut aller
peut être compris comme jusqu’à 31 caractères : age du capitaine. Il ne faut pas
utiliser les lettres accentuées, cédilles, trémas, et autres
a ← b signes diacritiques. Enfin, fortran ne fait pas la distinc-
on met b dans a. Cela a quelques conséquences pratiques, tion entre lettres majuscules et minuscules (Zmin est iden-
ainsi tique à zmin) alors que le système d’exploitation unix le
a = b fait (les fichiers resultats et Resultats sont distincts).
On peut déclarer des nombres entiers, par exemple :
(mettre b dans a) et
integer :: i, m, nbrpas
b = a
ou des nombres complexes :
(mettre a dans b) ne signifient pas la même chose et les
deux instructions : complex :: z, s
a = b
b = c
Table 2.6 – Liste des types de variables :
ne signifient pas que les trois nombres a, b et c soient déclaration type des variables
égaux ! Cela signifie : ≪ prendre le contenu de l’emplace- integer entier
ment désigné par la lettre b et le mettre dans a, puis mod- real réel
ifer le contenu de b en y mettant le contenu de c ≫. Donc, double precision réel en double précision
après coup, a et b peuvent être différents. De même, l’or- complex complexe
dre des instructions a une importance : mettons que l’on double complex complexe en double précision
ait affecté les valeurs, respectivement, 1, 2 et 3 à a, b et c.
character chaı̂ne de caractères
Les deux instructions ci-dessus aboutiront à avoir 2 dans
a et 3 dans b et c. Mais si l’on intervertit les instructions : logical variable logique
≪ exécutables ≫. Une instruction du type a = 3*b - c L’instruction end marque la fin du programme. L’in-
avec laquelle on ≪ dit ≫ à l’ordinateur de faire quelque struction program donne un nom au programme qui peut
chose est exécutable, une déclaration où l’on réserve de être distinct du nom du fichier-source qui le contient.
l’espace pour des variables ne l’est pas.
En fortran, il existe ce que l’on appelle des
déclarations implicites, survivance des anciennes versions Table 2.7 – Liste des opérations sur les nombres :
de ce langage de programmation, qu’il est formellement
déconseillé d’utiliser 15 . Pour les rendre inopérantes, on L’addition s’écrit : + e.g. : a + b
utilise l’instruction : La soustraction s’écrit : - e.g. : 3. - x
La multiplication s’écrit : * e.g. : a*b
implicit none
La division s’écrit : / e.g. : p/q
La mise à la puissance s’écrit : ** e.g. : x**p
2.2.3 Opérations élémentaires sur les
nombres.
On peut mélanger les types integer, real, double
Un programme élémentaire pourrait donc être : precision, complex et double complex au sein de la
program addition ! DEBUT DU PROGRAMME même expression. Ainsi :
implicit none ! PAS DE DECLARATIONS IMPLICITES
real :: a, b, c ! DECLARATION DE 3 VARIABLES REELLES complex :: z, t
! DEBUT DES INSTRUCTIONS EXECUTABLES integer :: k = 392
b = 1.414 ! PLACER LA VALEUR 1.414 DANS b real :: x = 1.03 , y = 0.707
c = 1.732 ! PLACER LA VALEUR 1.732 DANS c z = (3.7,9.03)
a = b + c ! SOMMER & PLACER LE RESULTAT DANS a t = x**2 + (k-1)/z**y
write(*,*) a ! IMPRIMER LE CONTENU DE a
end ! FIN DU PROGRAMME calcule x2 + k −y 1 . Le résultat est un nombre complexe.
z
Noter qu’un nombre complexe s’écrit en donnant parties
qui calcule la somme de 1,414 et 1,732 et imprime le
résultat (instruction write). Il faut noter que le passage réelle et imaginaire entre parenthèses et séparées par une
à la ligne signifie la fin d’une instruction, à la différence virgule.
d’autres langages comme pascal ou C. On peut cepen-
dant écrire plusieurs instructions par ligne en les séparant
par un point-virgule, ainsi : 2.3 Premières boucles.
program addition
implicit none 2.3.1 Pour quoi faire ?
real :: a, b, c L’une des grandes qualités des ordinateurs est leur ca-
b = 1.414 ; c = 1.732 ; a = b + c pacité à effectuer des calculs répétitifs avec des valeurs
write(*,*) a numériques différentes. Imaginons par exemple que l’on
end veuille calculer x3 pour x variant de -10 à +10 par pas de
La décimale des constantes réelles est marquée par un 0,1. On pourrait bien sûr écrire :
point et non une virgule (1.414 et non 1,414). Une con- implicit none
stante réelle doit comporter un point : 1. est une con- real :: x = -10.0, y
stante réelle, mais 1 est une constante entière, 2./3. est y = x**3
une constante réelle qui vaut 0,666667, alors que 2/3 est x = x + 0.1 ; y = x**3
une constante entière, résultat de la division du nombre x = x + 0.1 ; y = x**3
entier 2 par le nombre entier 3, elle vaut donc zéro ! x = x + 0.1 ; y = x**3
On peut aussi utiliser la notation dite ≪ scien- x = x + 0.1 ; y = x**3
tifique ≫ (comme avec une calculette) pour les nombres x = x + 0.1 ; y = x**3
réels, 1, 6 10−19 s’écrit : 1.6e-19, c’est plus économique ...
qu’aligner de nombreux zéros. . . La lettre e ne désigne pas
etc. L’instruction x = x + 0.1 prend la valeur de x en
ici une variable mais indique l’exposant 16 . mémoire, lui rajoute 0,1 et écrit le résultat dans le même
L’affectation de valeurs initiales à certaines variables emplacement : le contenu de x est donc augmenté de 0,1.
peut être faite directement dans la déclaration : Donc, x commence par valoir -10, puis −10 + 0, 1 = −9, 9
program addition et l’on calcule y, puis 9,8 avec un nouveau calcul de y, etc.
implicit none On remarque cependant que la séquence :
real :: a, b = 1.414, c = 1.732
a = b + c x = x + 0.1 ; y = x**3
write(*,*) a
end doit être répétée autant de fois que l’on veut faire le calcul
(ici, 201 fois).
15. 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’ordi-
nateur créera simplement une nouvelle variable, avec des résultats. . .
imprévisibles ! Si l’on rend obligatoire la déclarations de toutes les 2.3.2 Pratiquement. . .
variables, alors le compilateur détectera en principe une variable
non-déclarée et produira un message d’erreur approprié. Une façon plus élégante de procéder consiste à utiliser
16. on peut parfaitement écrire une instruction du type : e = une boucle afin de répéter un grand nombre de fois le même
1.6e-19, il n’y a aucune confusion possible. calcul en faisant varier un paramètre, ainsi :
Physique numérique, Philippe Depondt 21
enddo font partie du même ensemble qui doit être exécuté ainsi, la boucle interne sur x s’exécutera pour chaque
pour chaque valeur de i. valeur de k et les instructions qu’elle comporte se
Il faut remarquer au passage qu’à chaque tour de la répéteront donc (kmax-kmin+1)*(ixmax-ixmin+1) fois :
boucle la variable y est modifiée et que donc les anciennes cela peut faire beaucoup. Par exemple, si kmax=1000,
valeurs sont oubliées : à la fin, seule la dernière valeur kmin=1, ixmax=10000, ixmin=1, la boucle interne
calculée reste. Il faut donc penser à faire quelque chose s’exécutera 107 fois, et si elle prend 10−3 seconde à
des valeurs intermédiaires si on en a besoin : les écrire par l’exécution, le programme, lui, prendra 104 s soit 2h45mn !
exemple. Ainsi, Si maintenant, la boucle externe est elle-même imbriquée
dans une autre boucle, on obtient très facilement un pro-
implicit none gramme très lourd. . .
complex :: z, zim=(0.0,1.0)
integer :: i
real :: omega = 6.283185, t
do i = 0, 1000 2.3.4 Boucles munies d’un nom
t = 0.1*i
z = exp(zim*omega*t) ; write(*,*) t, z Quand plusieurs boucles sont imbriquées, il est parfois
enddo utile de leur donner un nom afin de clarifier le début et la
fin de chacune :
va calculer z = eiωt pour t variant de 0 à 100, par pas de
0, 1 et écrire les résultats sur l’écran. Noter la déclaration
boucle1 : do k = kmin, kmax
du nombre imaginaire i dans la variable zim, dont la partie
...
réelle est nulle et la partie imaginaire égale à 1. ...
Un autre exemple : boucle2 : do i = imin, imax
...
implicit none
...
integer :: k, s2 = 0
enddo boucle2
do k = 1, 10
...
s2 = s2 + k**2
...
enddo
enddo boucle1
calcule la somme des 10 premiers carrés.
Le pas de la boucle est implicitement égal à 1, mais on
peut le choisir explicitement :
2.4 Conditions.
do k = 1, 10, 2
s2 = s2 + k**2 Il arrive que l’on veuille que certaines instructions ne
enddo s’exécutent que dans certaines conditions. Par exemple, si
l’on a calculé une quantité y, on peut en vouloir la racine
calcule la somme 12 + 32 + 52 + 72 + 92 , et : carrée uniquement si y est positif :
do k = 10, 1, -1
... if( y > 0.0 ) then
enddo z = sqrt(y)
endif
descend de 10 à 1.
Note ≪ esthétique ≫ : les instructions du bloc compris La fonction sqrt qui calcule la racine carrée (square root)
dans la boucle sont décalées d’une ou plusieurs colonnes, est dite ≪ intrinsèque ≫ parce qu’elle fait partie des fonc-
c’est l’indentation. Cela ne présente aucun caractère obli- tions que tout compilateur fortran doit fournir.
gatoire et ne fait pas partie des règles du langage, mais L’expression y > 0.0 est du type logique, cela signifie
c’est une bonne habitude qui rend la lecture des pro- qu’elle ne peut prendre que deux valeurs : .TRUE. (vrai)
grammes nettement plus facile. si y > 0 et .FALSE. (faux) si y ≤ 0.
17. On note au passage que l’expression 0.1*i mélange une con- Deux écritures sont possibles pour les opérateurs
stante réelle et un entier : le résultat est réel. logiques, première et deuxième colonnes ci-dessous :
22 Licence de physique L3: PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
> .gt. > (greater than) if( y < 0.0 ) write(*,*) ’y est negatif !’
< .lt. < (less than) z = sqrt(y)
>= .ge. ≥ (greater or equal )
<= .le. ≤ (less or equal ) Ici, on se borne à mettre un message d’avertissement, mais
== .eq. = (equal ) l’instruction suivante s’exécutera de toutes façons et le
/= .ne. 6 = (not equal ) programme donnera la valeur NaN (Not a Number ) à z.
.and. et On peut aligner autant de else if que l’on souhaite 18 .
Cependant si l’on a une série de possibilités à envisager,
.or. ou
l’instruction select case 19 peut être plus commode. Par
.not. contraire d’une expression logique exemple :
Ne pas oublier les points de part et d’autre des implicit none
opérateurs logiques de la deuxième colonne. L’opérateur integer :: a
logique == qui est une comparaison, est distinct du signe write(*,*) ’entrer un nombre’; read(*,*) a
≪ d’égalité ≫ = qui signifie en fait ≪ mettre quelque chose
select case( a )
dans une variable ≫. L’expression : case( : 1 )
write(*,*) ’a est plus petit ou egal a 1’
a == b
case( 10 : )
est une expression logique qui prend une valeur, soit vraie write(*,*) ’a est plus grand ou egal a 10’
soit fausse, et case (2 : 3 )
write(*,*) ’a est entre 2 et 3’
a = b case default
write(*,*) ’a est entre 4 et 9’
est une instruction qui place la valeur de b dans a. . ., ainsi, end select
end
integer :: a, b
logical :: ok Un autre exemple, pour convertir des unités anglo-
ok = a == b saxonnes en unités métriques :
signifie que la variable logique ok prend la valeur .TRUE. program metre
si a et b sont égaux et .FALSE. sinon. implicit none
On peut aussi utiliser des variables logiques de façon real, parameter :: c = 0.3048, kt = 1.852, &
plus compliquée : mph = 1.609, &
gallon = 3.7854118, lbs = 0.45455
logical :: ok real :: l
real :: x, y character(len=10) :: unit
...
... ! le premier argument de la ligne de commande est la
ok = y > 0.0 .and. x <= y ! quantite, le deuxieme l’unite.
if (.not. ok ) then ! s’il n’y a pas deux arguments, poser la question
write(*,*) ’Il y a un probleme quelque part’ ! explicitement
stop if ( command_argument_count() >= 2 ) then
endif call get_command_argument(1,unit)
read(unit,*) l ! convertir la chaine de caracteres
L’instruction stop arrête l’exécution du programme.
! en reel (cf ’chaines de caracteres’)
On peut prévoir une alternative : si une condition est call get_command_argument(2,unit)
vérifiée, on fait une chose, sinon on fait autre chose : else
if( y >= 0.0 ) then write(*,’("Entrer la longueur et l’’unite ",$)’)
z = sqrt(y) read(*,*) l, unit
else endif
write(*,*) ’y est negatif’ select case(trim(unit))
stop case (’ft’,’feet’,’foot’,’pieds’,’pied’)
endif write(*,*) l*c,’ metres’
case (’in’,’inch’,’inches’,’pouces’,’pouce’)
Le deuxième volet de l’alternative peut être lui-même write(*,*) 1000.*l*c/12.,’ mm’
soumis à condition :
18. Pour bien apprécier le confort (et la sécurité) qu’apporte la
if( y >= 0.0 ) then structure if(...) then, il faut rappeler le fonctionnement du if
arithmétique en usage dans les premières version du langage for-
z = sqrt(y) tran :
else if ( y > -0.0001 ) then if(k) 100,101,102
write(*,*) ’y est compris entre -0.0001 et 0.0 :’ 100 ....
write(*,*) ’on le considere comme presque nul’ go to 103
z = 0. 101 ....
else go to 103
102 ...
write(*,*) ’y est franchement negatif’
103 ...
stop ce qui signifie que si k est négatif, l’on va à l’étiquette 100, si k est
endif nul, alors on va en 101 et sinon en 102, après quoi, l’instruction située
en 103 est exécutée. Bien évidemment, rien n’empêche, par exemple,
Si l’on n’a qu’une instruction à exécuter dans le if, on un go to 101 n’importe où ailleurs dans le programme. . .
peut la fusionner dans l’instruction if : 19. héritière du go to calculé d’antan.
Physique numérique, Philippe Depondt 23
à chaque fois que l’on tape un nombre négatif, l’on obtien- 2.7.3 Boucles implicites.
dra la requête d’un nombre positif sans que le calcul de la
Plutôt qu’écrire :
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
nul (strictement : on verra un peu plus loin ce que cela write(1,*) x(i)
signifie) on sort de la boucle. enddo
Autre exemple : vérifier qu’un fichier existe déjà avant
de tenter de l’ouvrir en lecture, on peut écrire :
l1 : do 2.8.1 Déclaration
...
La déclaration d’un tableau est faite en indiquant les
l2 : do
valeurs extrêmes des indices de chacune des dimensions
...
du tableau, par exemple :
if ( age_du_capitaine < 0 ) exit l1
... real, dimension(1:100) :: x
if ( ok ) cycle l2
... déclare un tableau à un seul indice qui va de 1 à 100, c’est-
enddo l2 à-dire un tableau unidimensionnel de réels à 100 éléments
... ou un vecteur à 100 coordonnées si l’on préfère. Le i-ème
enddo l1 élément est désigné par x(i) ; i est bien entendu un entier.
Par exemple :
Le exit l1 fait sortir de la boucle l1, la plus externe, alors
que l’instruction se trouve dans la boucle la plus interne : real, dimension(0:100) :: x
ça permet de sauter par dessus un niveau d’imbrication. real :: pi = acos(-1.0)
integer :: i
23. L’intérêt de ces structures est réel, toutefois pour relativiser,
notons qu’en fortranIV, on pouvait très bien fabriquer des logiques do i = 0, 100
similaires à ce que permettent exit et cycle, l’esprit était simple-
x(i) = cos(i*pi/100.)
ment moins orienté ≪ programmation par bloc ≫ et il fallait s’as-
treindre à un minimum de discipline, par exemple : enddo
do 100 i = 1, 1000000
... remplit un tableau de 101 éléments avec les valeurs prises
c ici l’equivalent d’un ‘‘cycle’’ par cos θ avec θ ∈ [0, π] par pas de π/100.
if ( x .gt. y ) go to 100 On peut faire des déclarations du genre :
...
c ici l’equivalent d’un ‘‘exit’’ real, dimension(-100:100) :: x
if ( z .le. 0. ) go to 200
...
100 continue
ce qui donne dans ce cas un tableau à 201 éléments dont
200 ... l’indice varie de -100 à 100, et alors, on peut accéder à des
Il était prudent d’éviter de placer l’étiquette 200 à l’autre bout éléments comme par exemple x(-20).
du programme, du moins si l’on avait l’ambition d’écrire un code
≪ maintenable ≫. . . 24. voir les tableaux dans la section suivante.
Physique numérique, Philippe Depondt 27
La déclaration real, dimension(100) :: x est correspondant et toutes les boucles s’adaptent automa-
équivalente à real, dimension(1:100) :: x 25 . tiquement.
Pour les tableaux à plusieurs dimensions, il faut spécifier Finalement, il est possible d’initialiser un tableau dans
les valeurs extrêmes de chacun des indices : la déclaration, comme un scalaire :
integer, dimension(1:25,-2:2) :: a real, dimension(-2:2) :: x=(/-4,-2,0,2,4/)
ici, x(-2) = -4, x(-1) = -2, etc. Une boucle implicite
déclare un tableau à deux dimensions d’entiers de 25 × 5. peut aussi être utilisée pour le même résultat :
Le premier indice va de 1 à 25, le deuxième de -2 à 2.
integer :: i
Un élément est donc désigné, par exemple, par a(i,j) ou real, dimension(-2:2) :: x=(/ (2*i, i=-2,2) /)
a(12,-1).
L’exemple suivant :
2.8.2 Manipulation globale de tableaux
integer :: i
complex, dimension(200) :: s 2.8.2.1 n d’un coup ! (mieux que le petit tailleur)
complex :: im = (0.,1.)
On peut faire des calculs en manipulant les éléments de
real :: omega, t
tableaux un à un dans des boucles comme dans les exem-
omega = 2*acos(-1.0)
do i = 1, 200 ples ci-dessus ; c’est d’ailleurs ce que l’on faisait jusqu’à
t = (i-1)*0.005 ; s(i) = exp(im*omega*t) l’apparition de fortran90 26 . La manipulation globale
enddo de tableaux est sans doute l’apport le plus important de
fortran90 par rapport aux langages qui l’ont précédé ;
déclare un tableau complexe de 200 éléments et le remplit. c’est aussi un ingrédient qui facilite beaucoup les calculs
Il peut être commode de remplacer une dimen- numériques dès qu’ils deviennent un peu lourds.
sion explicitement fixée à une certaine valeur, du type Admettons que les éléments du tableau c doivent être
dimension(100), par dimension(n) où n est un nombre la somme des éléments correspondants des tableaux a et
entier. Il faut alors déclarer n comme un paramètre, c’est-
b:
à-dire un nombre dont on ne peut pas changer la valeur
en cours d’exécution du programme. Ainsi : integer, parameter :: n = 1000
integer :: i
integer, parameter :: l = 20, m = 100, n = 30 real, dimension(n) :: a, b, c
real, dimension(l,m) :: x !....
real, dimension(m,n) :: y ! il faudrait lire les elements de a et b
real, dimension(l,n) :: z ! dans un fichier par exemple.
integer :: i, j, k do i = 1, n
c(i) = a(i) + b(i)
open(10,file=’fichier.x’) ! lecture x enddo
do j = 1, m
do i = 1, l En fortran90, la boucle peut se résumer en une seule
read(10,*) x(i,j) instruction :
enddo c = a + b ! ici on fait n additions.
enddo
close(10)
le compilateur se chargeant de vérifier que tous les
open(10,file=’fichier.y’) ! lecture y
tableaux concernés ont bien la même dimension. . . On
do j = 1, n
peut donner explicitement les bornes :
do i = 1, m c(1:n) = a(1:n) + b(1:n)
read(10,*) y(i,j) ce qui a le même résultat que ci-dessus : ça n’a au-
enddo cun intérêt dans cet exemple, mais imaginons que l’on
enddo veuille additionner la première moitié du tableau a avec la
close(10) deuxième moitié du tableau b et inversement, la deuxième
do j = 1, n ! produit matriciel moitié de a avec la première de b :
do i = 1, l
z(i,j) = 0. c(1:n/2) = a(1:n/2) + b(n/2+1:n)
do k = 1, m c(n/2+1:n) = a(n/2+1:n) + b(1:n/2)
z(i,j) = z(i,j) + x(i,k)*y(k,j) ou bien que l’on ne s’intéresse qu’aux éléments impairs :
enddo
c = 0. ! initialisation de c
enddo
c(1:n:2) = a(1:n:2) + b(1:n:2)
enddo
le dernier indice étant le pas, comme pour une boucle do 27 .
déclare 3 tableaux de 20 × 100, 100 × 30 et 20 × 30, lit les
26. Plus précisément, certains constructeurs d’ordinateurs à ca-
valeurs des éléments de x et y dans des fichiers et fait le pacité vectorielle avaient commencé à produire dans les années 1980
produit des deux matrices dans z (attention à la différence des compilateurs fortran8X spécifiques à leurs machines : for-
entre le chiffre 1 et la lettre l). tran90 est l’héritier de ces innovations.
Malgré son apparente complexité, l’avantage de cette 27. Il faut toutefois faire un peu attention car la norme ne garan-
tit pas que les opérations effectuées dans un traitement global de
façon de déclarer les tableaux est que si l’on veut, dans une tableau se fassent dans l’ordre des indices de sorte que si un calcul
nouvelle version du programme, changer une dimension dépend d’un résultat obtenu précédemment sur un élément d’indice
d’un tableau, il suffit de changer la valeur du paramètre inférieur, il faut écrire explicitement une boucle. En revanche, cer-
tains ordinateurs sont optimisés pour ce genre de calcul et un traite-
25. à la différence du langage C pour lequel les tableaux commen- ment global, quand il est possible, peut se traduire par un gain de
cent avec l’élément 0. temps sensible.
28 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
2.8.2.2 where c’est, encore une fois, l’équivalent d’une boucle car x et y
ne sont pas des scalaires mais des tableaux de nombres et,
Finalement, les conditions s’expriment à l’aide de where
avec une syntaxe très proche du if, sauf qu’évidemment en une ligne, est concentré un calcul de 5000 sinus. . .
il s’agit maintenant de tableaux pris globalement : fortran90 offre en outre une panoplie de fonctions
intrinsèques spécialement destinées aux opérations sur
integer, parameter :: n = 5000 les tableaux, par exemple, pour obtenir la somme des
real, dimension(n) :: x, y éléments d’un tableau :
! ....
where ( x >= 0.) integer, parameter :: n = 2048
y = sqrt(x) real, dimension(n) :: x
else where real :: y
y = 0. ! ....
end where y = sum(x)
on calcule donc les racines carrées de tous les éléments ou de façon plus sophistiquée, la somme des éléments posi-
positifs du tableau x, et l’on annule y pour les éléments tifs d’un tableau :
négatifs de x : c’est l’équivalent de la boucle :
integer, parameter :: n = 6723
integer, parameter :: n = 5000
real, dimension(n) :: x
real, dimension(n) :: x, y
real :: y
integer :: i
! ....
! ....
y = sum(x, mask = x >= 0.)
do i = 1, n
if ( x(i) >= 0.) then ce qui suit mask devant être un tableau logique de la bonne
y(i) = sqrt(x(i)) dimension. La moyenne des racines carrées donnerait :
else
y(i) = 0. y = sum(sqrt(x), mask = x >= 0.)/count(x >= 0.)
endif
enddo La fonction intrinsèque count compte le nombre de fois
où la condition est vraie.
2.8.2.3 forall Si le tableau est multidimensionnel, on spécifie la di-
mension sur laquelle la somme doit être faite :
Imaginons toutefois que l’on veuille, par exemple, créer
la matrice identité d’ordre n : integer, parameter :: n = 237, m = 53
real, dimension(n,m) :: x
1 0 0 ... 0 0 real, dimension(m) :: y
0 1 0 ... 0 0 ! ....
0 0 1 ... 0 0 y = sum(x, dim = 1, mask = x >= 0.)
I= . . . .
.. .. .. . . ... ..
. n
X
0 0 0 ... 1 0 donne : yj = xi,j , ∀j ∈ [1, m], le résultat est donc
0 0 0 ... 0 1 i=1
xi,j ≥ 0
il faut pouvoir accéder aux termes diagonaux de la ma- évidemment un tableau. On peut écrire de façon plus suc-
trice : une boucle do peut faire l’affaire, mais celle- cinte :
ci impose que les opérations demandées soient ef-
fectuées séquentiellement dans l’ordre indiqué par l’indice ; y = sum(x, 1, x >= 0.)
sur certains ordinateurs cela peut sensiblement ralentir
l’exécution. L’instruction forall est très similaire à do La fonction product, d’usage similaire, fait le produit
mais lève cette contrainte, ainsi : des éléments d’un tableau.
Xn
real, dimension(n,n) :: id ! matrice identite Le produit scalaire z = xi yi s’obtient avec
... i=1
id = 0. ! mise a zero des n*n termes dot product :
forall ( i = 1:n ) id(i,i) = 1.0 ! n termes diagonaux
integer, parameter :: n = 8000
Noter que la syntaxe est un peu différente que celle de do. real, dimension(n) :: x, y
On a aussi : real :: z
! ....
forall ( i = 1:n ) z = dot_product(x,y)
...
end forall m
X
et le produit de deux matrices ci,j = ai,k bk,j avec
k=1
2.8.3 Fonctions intrinsèques et tableaux matmul :
Les fonctions intrinsèques du fortran s’accommodent
integer, parameter :: n = 100, m = 50, p = 32
très bien de tableaux, par exemple :
real, dimension(n,m) :: a ! attention au
integer, parameter :: n = 5000 real, dimension(m,p) :: b ! dimensionnement
real, dimension(n) :: x, y real, dimension(n,p) :: c ! des tableaux
! .... ! ....
y = sin(x) c = matmul(a,b)
Physique numérique, Philippe Depondt 29
Noter que le résultat fourni par cette fonction est lui-même lesquelles on aimerait pouvoir modifier la taille d’un
une matrice. tableau en cours d’exécution : par exemple, si l’on a
Un résumé (non exhaustif) de quelques fonctions que écrit un programme qui calcule la moyenne des éléments
l’on est amené à utiliser assez souvent est donné dans la d’un tableau de nombres de longueur quelconque, il serait
table 2.8 28 . agréable de pouvoir entrer la taille du tableau, puis le di-
mensionner, puis faire le calcul sans avoir à recompiler le
programme à chaque fois que le nombre de nombres dont
2.8.4 Allocation dynamique de mémoire on veut la moyenne a changé !
Une déclaration est, comme on l’a déjà vu, une L’allocation dynamique de mémoire permet de déclarer
un tableau sans en donner la taille, puis de lui donner
réservation d’espace dans la mémoire vive de l’ordinateur.
une taille en cours d’exécution, de le supprimer puis de lui
Ainsi, real :: x déclare une variable réelle x et, de ce donner une autre taille, etc. Par exemple :
fait, réserve 4 octets (ou 32 bits) en mémoire, parce que
c’est la place qu’occupe un réel en simple précision 29 : ces ! declaration d’un tableau unidimensionnel
4 octets sont donc affectés à cette variable et ne peuvent ! sans taille fixe
pas être utilisés à autre chose. De même, lorsqu’on déclare real, dimension(:), allocatable :: x
un tableau, par exemple real, dimension(n) :: x, on integer :: n
réserve n fois 4 octets. On comprend donc que cette !...
réservation doive être faite avant l’exécution 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 à modifier la taille de l’espace qu’il occupe en
allocate(x(n))
mémoire ; il faut arrêter l’exécution du programme, mod- !... ici on fait des calculs
ifier le code source, recompiler et relancer l’exécution 30 . deallocate(x) ! desaffectation
Il existe cependant des quantités de situations dans ! on recommence avec un tableau plus petit
! qui commence en zero au lieu de un
28. NE PAS apprendre ce tableau par cœur ! allocate(x(0:n/2-1))
29. pour la plupart des ordinateurs courants. L’usage de mots de
64 bits commence toutefois à se répandre assez rapidement.
!...
30. ou alors, en fortran77, en l’absence d’allocation dynamique deallocate(x)
de mémoire, on prévoyait large : on réservait par exemple 1 000 000
d’emplacements pour n’en utiliser finalement que quelques uns. On gère ainsi la mémoire occupée pour ainsi dire ≪ au
30 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
Rien n’oblige à écrire tous les calculs que l’on veut faire La première partie est ce qu’on appelle le ≪ programme
dans un même programme : c’est même assez déconseillé ! principal ≫, la seconde, la fonction 32 . L’appel de la fonc-
Pour des raisons, ne serait-ce que de lisibilité, on a très tion dans le programme principal est fait normalement, ici
souvent intérêt à découper un gros problème en plusieurs dans une instruction
petits pour lesquels les possibilités de se tromper sont plus write(*,*) bsom(x,n)
faibles 31 . De plus, si le même type de calcul doit être
mais cela pourrait être dans une expression comme
répété à plusieurs endroits du programme (par exemple
un calcul d’intégrale), ce n’est pas la peine de le repro- r = sqrt(2.0)*bsom(x,n) - k
grammer plusieurs fois. Si, enfin, on a déjà écrit (et testé)
un programme qui sait faire un certain type de calcul (par l’usage d’une fonction est donc très similaire à celle des
exemple, calculer une intégrale numérique ou résoudre un fonctions intrinsèques du fortran, comme sin, exp, etc.
système linéaire d’équations), il est utile de pouvoir le Dans la définition de la fonction, on doit écrire explicite-
récupérer et l’insérer dans le programme que l’on est en ment l’expression donnant la valeur de la fonction : si
train de faire sans avoir à le reécrire. Il existe en outre, et l’on oublie l’instruction bsom = s/sum(z), il n’y aura pas
l’on verra dans ce cours un certain nombre d’exemples de d’erreur détectée, le calcul sera fait normalement, mais le
leur utilisation, des bibliothèques de sous-programmes et résultat ne sera pas transmis au programme appelant. La
de fonctions extrêmement riches, telles linpack, lapack, fonction doit se terminer par l’instruction end qui en mar-
nag, imsl. . ., dans lesquelles on peut puiser sans vergogne que la fin, comme le programme principal.
et ainsi éviter de réinventer la roue.
Fonctions et sous-programmes sont donc des ingrédients 2.9.1.2 Les arguments et les variables d’une
essentiels ! function.
Dans cet exemple, la fonction réelle bsom calcule le
2.9.1 Les function. barycentre des éléments de z. Le tableau z est un argu-
ment de la fonction ( function bsom(z,m) ). Dans l’appel
2.9.1.1 Définir une function. de bsom, le premier argument est le tableau x qui doit avoir
On peut écrire ses propres fonctions en plus des fonc- le même type et le même nombre d’éléments que z dans la
tions intrinsèques. On les utilise de la même façon que définition de la fonction : la correspondance entre les vari-
les fonctions intrinsèques mais évidemment, il faut aussi ables du programme principal et celles de la fonction est
les définir, alors que les fonctions intrinsèques sont bien donnée par l’ordre dans lequel elles apparaissent dans l’ap-
sûr prédéfinies. Pour cela, on place les instructions corre- pel et la définition de la fonction. En effet x est la première
spondantes, par exemple dans le même fichier-source que variable qui apparaı̂t dans l’appel de bsom(x,n) dans le
le programme lui-même, mais en dehors de celui-ci (avant programme principal et z est la première dans la définition
program ou après end. Par exemple, supposons que l’on
real function bsom(z,m). Ainsi, x dans le programme
veuille calculer le barycentre, à une dimension, d’un en-
semble de nombres lus dans un fichier : principal et z dans la fonction désignent la même variable ;
de même pour n et m.
program calcul ! debut du programme principal
implicit none 1er, 2e argument
integer, parameter :: n = 100 write(*,*) bsom( x, n) appel, dans p. princ.
real, dimension (1:n) :: x
real :: bsom
ll
← correspondance
real function bsom( z, m) définition
open (1, file=’machin’)
read(1,*) x Attention ! Ce n’est pas parce qu’une variable a le même
close(1) nom dans une fonction qu’une autre dans le programme
write(*,*) ’Le barycentre des elements de X est : ’ principal qu’il s’agit de la même chose ; au contraire, ces
write(*,*) bsom(x,n) ! appel de bsom deux variables même si elles ont le même nom n’ont au-
end ! fin du programme principal cun rapport ! En revanche, une variable du programme
principal représente strictement la même chose qu’une
real function bsom(z,m) ! debut de la function bsom autre, même de nom différent, dans la fonction à condi-
implicit none tion d’avoir été transmise comme argument dans l’appel
integer :: i, m et la définition de la fonction comme dans l’exemple ci-
real, dimension(1:m) :: z
dessus 33 .
31. c’est ce que l’on appelle avec quelque pédanterie ≪ l’analyse Ainsi, la variable x du programme principal est iden-
descendante ≫, c’est-à-dire que l’on divise un problème P a priori tique à la variable z de la fonction, mais la variable s de
compliqué en plusieurs sous-problèmes P1 , P2 , . . ., puis chaque sous-
problème est redivisé en P1,1 , P1,2 , . . . , P2,1 , . . ., etc. On arrête quand 32. ou plus précisèment la définition de la function.
tous les sous-sous-sous-. . .-problèmes sont tellement élémentaires 33. La seule chose qui soit transmise est l’adresse du premier
qu’il n’y a plus de problème ! élément du tableau x. C’est en fait un pointeur masqué !
Physique numérique, Philippe Depondt 31
ces grandeurs dans chaque programme et sous-programme, par le programme principal. Si l’on ne veut pas modifier A
on peut commencer par faire un module, placé au début (si c’est un programme compliqué surtout si on ne l’a pas
du fichier source : écrit soi-même, c’est toujours un peu dangereux), il suffit
de faire un module pour mettre ces variables en commun
module trig_consts
! definition de constantes trigonometriques entre le programme principal et B : on saute, pour ainsi
implicit none dire, par-dessus A !
real, parameter :: pi = acos(-1.0)
real, parameter :: deg_rad = pi/180. 2.9.5 Mettre un nom de sous-programme
real, parameter :: rad_deg = 180./pi
end
comme argument.
Admettons que l’on ait écrit une fonction somdef qui
il s’agit simplement de déclarations (ici de paramètres, sache calculer une intégrale définie : il faut lui transmet-
mais ce n’est pas obligatoire) et, le cas échéant, d’affecta- tre comme argument, outre les bornes xmin et xmax de
tions de valeurs. Dans un programme ou sous-programme l’intégrale et la précision eps souhaitée, le nom de la fonc-
dans lequel on veut utiliser ces variables, il faut spécifier tion à intégrer. Par exemple :
au début des déclarations
xmin = 0. ; xmax = acos(-1.0)
use trig_consts write(*,*) somdef( xmin, xmax, eps, sin )
et les variables pi, deg rad et rad deg sont utilisables sanssi l’on veut calculer l’intégrale de 0 à π de sin x. Cepen-
autre forme de procès ; ainsi, si theta est un angle donné dant, si l’on procède sans précaution, le compilateur di-
en degrés : agnostiquera que la variable sin n’est pas déclarée, et
sin_theta = sin(deg_rad*theta)
dira quelque chose qui peut ressembler à : Error: Symbol
’sin’ at (1) has no IMPLICIT type, ce qui est ab-
est correct même si deg rad n’a pas été déclaré dans le surde puisqu’il s’agit d’une fonction intrinsèque. . . C’est
programme. Quand on fait cela, il faut faire un peu atten- que dans ce contexte là, il ne reconnait pas sin comme
tion, puisque si l’on a une autre variable pi dans un des une fonction : il faut donc le préciser dans les déclarations
programmes qui utilisent ce module, il y aura un conflit avec intrinsic.
détecté par le compilateur. Cependant, comme il faut faire
real :: xmin, xmax, eps, somdef
appel explicitement par use aux modules dont on a be-
intrinsic :: sin
soin dans chaque sous-programme qui l’utilise, les dégats
34 ...
potentiels restent limités : on peut très bien imaginer
xmin = 0. ; xmax = acos(-1.0)
des structures comme :
write(*,*) somdef( xmin, xmax, eps, sin )
module blabla
De même, s’il s’agit d’une fonction mafct que l’on a écrite
! acceleration de la pesanteur terrestre
soi-même, il faut la déclarer par external
real, parameter :: g=9.81
end real :: xmin, xmax, eps, somdef
external :: mafct
program truc ...
use blabla ! rappel du module blabla xmin = .. ; xmax = ..
implicit none write(*,*) somdef( xmin, xmax, eps, mafct )
real :: p, m = 75
p = m*g Les mêmes règles s’appliquent pour les sous-
write(*,*)’Poids =’,p programmes 35 .
call machin(p) Ce sont là les seuls cas d’utilisation de intrinsic et
end external : quand on ne transmet pas comme argument le
nom d’un sous-programme ou d’une fonction à un autre
subroutine machin(poids)
sous-programme ou fonction, il est complètement inutile
implicit none ! ici pas de module blabla
real, intent(in) :: poids d’utiliser ces déclarations 36 .
real :: g= 2.
write(*,*) ’Poids a’,g ,’ g =’, poids*g 2.9.6 Les bibliothèques.
end
2.9.6.1 Pour quoi faire ?
La variable g de machin n’a rien à voir avec celle du mod-
ule et du programme principal, puisque machin n’utilise Imaginons que l’on ait écrit une série de sous-
pas le module blabla (il n’y a pas use blabla). programmes, par exemple des calculs d’intégrale, dont le
Outre la définition de constantes, un des usages les plus code-source, c’est-à-dire écrit en Fortran, est placé pour
courants des modules est quand un programme principal chaque sous-programme dans un fichier dont le nom se ter-
appelle un sous-programme A qui lui-même en appelle un mine par .f90. Pour réutiliser ces sous-programmes dans
autre B. A priori, les seules variables connues du sous- d’autres programmes, on peut bien sûr simplement inclure
programme B sont celles que lui a transmises A, or il se 35. Certains compilateurs plus anciens n’acceptent que l’ancienne
peut très bien qu’il ait besoin d’autres grandeurs utilisées syntaxe external mafct (sans les :).
36. Cette affirmation est en fait un peu péremptoire. . ., on peut
34. De ce point de vue, on reste assez loin des variables globales imaginer des situations où cela peut être nécessaire, par exemple
du C dont les auteurs du langage disent eux-mêmes que ce n’est pas si l’on a écrit soi-même un sous-programme dot product qui risque
ce qu’ils ont fait de mieux ! (B. W. Kernighan, D. M. Ritchie, Le d’entrer en conflit avec la fonction intrinsèque de même nom ; la
langage C, Masson (1997), p. 33.) déclaration external résout alors le problème.
Physique numérique, Philippe Depondt 33
les fichiers correspondants à l’aide de directives include linéaire, il y a par exemple lapack qu’en général, il suffit
’nom de fichier.f90’, c’est d’ailleurs ce que l’on fait d’invoquer à la compilation par :
souvent. g95 mon big prog.f90 -llapack -o mon big prog
Toutefois, il arrive que ces sous-programmes aient eux- Cela suppose évidemment que l’on ait la documentation
même besoin d’autres sous-programmes pour fonction- qui va avec, mais c’est généralement facile à obtenir via
ner. Par exemple, les programmes de calcul de tran- Internet. C’est très souvent ainsi que l’on travaille dans
formée de Fourier vont tous utiliser le même algorithme, ≪ le monde réel de la simulation ≫ : pour résoudre un
mais vont différer selon que l’on veut une transformée problème, on identifie une méthode de résolution dont
directe ou inverse : ainsi le programme que l’on ap- le noyau réside dans un algorithme connu (inversion de
pelle ne fait qu’appeler un autre programme en modifi- matrice, transformée de Fourier, valeurs propres, . . .) et
ant éventuellement un signe ; il faudrait alors inclure ex- l’on trouve le programme de bibliothèque convenable, on
plicitement les deux sous-programmes, ce qui suppose que l’appelle et on compile l’ensemble avec l’invocaton de la
l’on connaisse spécifiquement comment tout cela est orga- bibliothèque idoine : un appréciable gain de temps !
nisé : autant dire que c’est rarement le cas quelques années
après l’écriture initiale. Une bonne solution est alors de
constituer une bibliothèque (library en anglais 37 ). 2.10 Les commentaires.
Une bibliothèque est un fichier dans lequel sont re-
On peut, et c’est même conseillé, commenter ses pro-
groupés un ensemble se sous-programmes déjà compilés grammes, d’ailleurs les exemples donnés ci-dessus compor-
et dans lequel le compilateur peut aller pêcher ce dont il a tent des commentaires. Pour cela, il suffit d’utiliser le sym-
besoin, par exemple un sous-programme de calcul de trans- bole ! qui marque le début d’un commentaire qui ne sera
formée de Fourier et tous les sous-programmes auxquels donc pas interprété comme une instruction à exécuter :
celui-ci fait appel : dans le programme principal, il suffira
de faire un call du sous-programme voulu. ! ceci est un commentaire, mais la ligne
! qui suit est une instruction
read(*,*) x
2.9.6.2 Créer une bibliothèque personnelle.
C’est très utile quand on veut pouvoir s’y retrouver dans
On a donc écrit un certain nombre de sous-programmes un programme écrit quelques temps avant, par exemple :
et de fonction (dûment testés, bien sûr. . .) placés dans des
fichiers machin 01.f90, machin 02.f90, truc real.f90, !-----------------------------------------------
truc dbl prec.f90, etc. Si on compile tout cela par g95 ! Ceci est un programme ecrit le 06-11-98
! par Tycho Brahe
*.f90, le compilateur refusera de la faire parce qu’il n’y a
! Il comporte trois boucles imbriquees
pas de programme principal : il faut donc inhiber l’éditeur !
de lien 38 avec l’option -c et pendant qu’on y est, on peut ! Mise a jour (adaptation free form) le 18-12-01
demander une optimisation du code avec l’option -O3. ! par Johannes Kepler
Cela donne : !-----------------------------------------------
g95 -c -O3 *.f90 ....
on obtiendra alors une série de fichiers machin 01.o, ! debut de la grande boucle
machin 02.o, truc real.o, truc dbl prec.o, etc. Ces do i = 1, n
fichiers doivent alors être inclus dans un fichier d’archive : ......
ar rv libmabib.a *.o ......
Le fichier libmabib.a contient la bibliothèque mabib. On ! debut de la moyenne boucle
do j = 1, m
peut alors supprimer tous les fichiers intermédiaires :
........
rm -f *.o ........
Pour utiliser cela, il suffit de compiler normalement ! debut de la petite boucle
son programme principal, dans lequel il y a des call do k = 1, l
machin 01(arg1, arg2), avec la commande : ......
g95 big prog.f90 -Lrepertoire de mabib -lmabib ......
-o big prog ......
où repertoire de mabib est le répertoire où se trouve enddo
le fichier libmabib.a. Si l’on peut placer le fichier ! fin de la petite boucle
libmabib.a dans le répertoire /usr/local/lib 39 , ......
l’option -L n’est plus nécessaire. ......
enddo
! fin de la moyenne boucle
2.9.6.3 Utiliser une bibliothèque existante. .....
.....
Il est toutefois assez rare que l’on ait à créer une enddo
bibliothèque de toutes pièces : l’essentiel des algorithmes ! fin de la grande boucle
courants a déjà été programmé, compilé, testé, etc., il
est inutile -voire nocif- de les refaire ! Pour l’algèbre Si chaque série de points (.....) représente plusieurs cen-
taines d’instructions, les commentaires qui en marquent le
37. attention aux faux amis : en anglais, library signifie bib-
liothèque (l’endroit où l’on emprunte des livres) alors que librairie
début et la fin ne sont pas de trop. . .
(l’endroit où l’on achète des livres) se dit bookstore. . . Le point d’exclamation placé ailleurs qu’en colonne 1,
38. c’est ce qui fait le lien entre programmes et sous-programmes. transforme la fin de la ligne en commentaire, sans en af-
39. il faut pour cela les droits de super-utilisateur. fecter le début :
34 Licence de physique L3: PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
éventuellement des commentaires : le compilateur peut ! definition du type rationnel dans un module pour
ainsi vérifer au passage la cohérence des appels de sous- ! eviter d’avoir a le refaire dans tous les
programmes et signaler d’éventuelles erreurs. ! sous-programmes
L’interface ne sert cependant pas uniquement à se rap- type rationnel
peler la syntaxe d’appel d’un sous-programme, elle permet integer :: n, d
de résoudre un certain nombre de problèmes de déclaration end type rationnel
de variables. Admettons que l’on cherche à faire une fonc- ! le type rationnel est compose de deux nombres
tion qui fasse un produit vectoriel ~a ∧ ~b. Le résultat est ! entiers : n = numerateur et d = denominateur
un vecteur à trois éléments : comment déclarer une telle end module rat
fonction ? La réponse est de faire une interface, ainsi :
program ratio ! programme principal
program prod_test use rat
implicit none implicit none
q3%n = q1%n*q2%d + q2%n*q1%d doute les scientifiques eux-mêmes qui sont frappés d’obso-
q3%d = q1%d*q2%d lescence ! En attendant, l’un des reproches essentiels que
call simplify(q3) l’on fai(sai)t au fortran est l’absence de pointeurs.
end function ratadd Un pointeur est une variable qui contient l’adresse d’une
variable : si l’on modifie un pointeur, on ne modifie pas la
subroutine simplify(q)
valeur de la variable, mais on ≪ pointe ≫ vers une autre
use rat
adresse et donc une autre variable. A priori, un pointeur
implicit none
type(rationnel) :: q est donc juste une variable entière qui contient une adresse
integer :: i, m et l’on peut faire les opérations que l’on veut sur cette
adresse, aux risques et périls de l’utilisateur. C’est ainsi
! si a la fois numerateur et denominateur sont en assembleur et en langage C qui est très proche de la
! divisibles par le meme nombre, le faire : machine. En assembleur en particulier, il n’y a pas de
! c’est pedestre, mais ca marche... tableaux, mais on peut accéder à des grandeurs stockées
m = min(abs(q%n),abs(q%d)) à la suite les unes des autres en mémoire simplement
l1 : do i = 2, m en incrémentant un pointeur, ce qui revient au même,
l2 : do ! il faut parfois recommencer si ce n’est que c’est d’un maniement sensiblement plus
if (mod(q%n,i) == 0 .and. mod(q%d,i) == 0 ) then
délicat. . .
q%n = q%n/i
Les pointeurs sont importants en informatique parce
q%d = q%d/i
else que c’est le point de départ de l’allocation dynamique
exit l2 de mémoire, puisqu’on accède ainsi librement à toute la
endif mémoire sans en réserver des morceaux à telle ou telle vari-
enddo l2 able. fortran90 gère l’allocation dynamique de mémoire
enddo l1 autrement, comme on l’a vu, et -opinion qui n’engage que
end subroutine simplify son auteur- de façon nettement plus prudente.
Autant dire que pour l’essentiel du calcul scientifique,
Ça donne par exemple :
la capacité à utiliser des tableaux efficacement est beau-
$ ratio coup plus importante. Toutefois, fortran90 introduit les
Num, denom 1: 5 2 pointeurs avec un certain nombre de garde-fous.
Num, denom 2: 4 5 Un pointeur doit être déclaré avec le type de la variable
produit 2 1 vers lequel il pointe : un pointeur donné ne peut pas avoir
somme 33 10 pour cible un entier à un moment et un réel un peu plus
tard :
5 4 20 2 5 4
ce qui est correct : × = = et + = ! declaration d’un pointeur vers un entier
2 5 10 1 2 5
5×5+2×4 33 integer, pointer :: a
= .
2×5 10 ! declaration d’un pointeur vers un tableau reel
On peut, sans difficulté majeure, ajouter à cela les deux real, dimension(:), pointer :: b
autres opérations et l’on aura créé un type nouveau et les
Il faut aussi déclarer explicitement des variables comme
opérations associées. Les types dérivés et les opérations
cible (target en anglais) :
associées constituent un pas important du fortran en
direction de la programmation orientée ≪ objet ≫ au integer, target :: n, m
détriment, sans doute, de la simplicité originelle du lan- real, dimension(150), target :: x, y
gage : la norme fortran2003 la développe d’ailleurs en- Si l’on veut que a pointe vers m et b vers x, cela donne :
core davantage.
-Exercice : définir un type temps composé d’heures, min- a => m
utes, secondes et une addition et une soustraction permet- b => x
tant de calculer en sexagécimal (par exemple : 1h32mn24s Quel intérêt ? On peut, par exemple, faire pointer un poin-
+ 2h42mn39s = 4h15mn3s). teur vers un morceau de tableau
-Exercice : définir un type triangle défini par les co-
ordonnées de ses trois sommets et une opération * d’ho- b => x(100:150)
mothétie permettant de le dilater d’un facteur réel sans ce qui permet d’optimiser des transferts de données d’un
déplacer son centre de gravité. morceau de tableau à un autre : dans certains cas on
économise ainsi de l’espace mémoire.
2.14.4 Pointeurs.
≪ Le fortran est un langage dépassé, vieillot, ob- 2.14.5 Récursivité.
solète. . . ≫ : ce sont des propos que l’on entend depuis fortran90 l’autorise. . . c’est parfois commode,
plus de vingt ans 41 , or le fortran continue à être large- rarement efficace, du moins pour le calcul scientifique pur
ment employé en calcul scientifique ; ce sont donc sans et dur. L’exemple que l’on donne toujours est le calcul de
41. Dans les années 1980, il advint un jour que le laboratoire où
factorielles : la définition de n! est,
je travaillais dut acquérir une station de travail ; les représentants
d’un des fournisseurs pressentis vinrent vanter les mérites de leurs n! = n(n − 1)!
productions et demandèrent quel langage on utilisait afin d’inclure
le compilateur dans leur devis. Quand la réponse fut : ≪ fortran ≫, Cela se programme sans difficulté à condition de spécifier
nous eûmes droit à des regards pour le moins. . . incrédules ! que la function est récursive :
Physique numérique, Philippe Depondt 39
Un prototype de TP
3.1 Introduction.
I M r
La physique numérique requiert sans doute quelques
R
connaissances dont le présent cours a pour but de fournir d
l’essentiel. Il s’agit toutefois d’une activité essentiellement i r−i
pratique : il faut écrire des programmes qui, non seule- O H S F
ment ≪ marchent ≫, mais aussi répondent aux questions
posées de sorte que la physique du problème soit traitée
de façon satisfaisante ; il faut pour cela un minimum d’-
expérience pour, bien sûr, maı̂triser le langage, mais en
outre avoir une familiarité suffisante avec l’environnement Figure 3.1 – Lentille demi-boule
et les méthodes afin que ceux-ci deviennent l’aide puis-
sante qu’ils doivent être et non plus la gêne. . . qu’ils con-
stituent sans conteste au début ! C’est la raison pour laque- Prenons une lentille demi-boule (figure 3.1) de rayon R,
lle cet enseignement comporte une part importante de et nous voulons calculer la distance OF en fonction de d,
travaux pratiques. la distance du rayon incident IM à l’axe optique, ce rayon
Chacune de ces séances de TP est consacrée à un est considéré comme parallèle au dit axe optique. Un peu
problème de physique qui illustre l’usage que l’on peut de géométrie élémentaire, additionnée de la loi de Snell-
faire de telle ou telle méthode. Elle est précédée d’une Descartes, nous dit que :
séance de travaux dirigés au cours de laquelle on présente
d
le problème, éventuellement on montre les limites du cal- sin i =
R
cul analytique et on décrit les méthodes numériques qui
OH = R cos i
seront utilisées pour le traiter. Si le problème présente des
difficultés particulières de programmation, celles-ci seront n sin i = sin r
également abordées. d
tan(r − i) =
Il est attendu des étudiants qu’ils arrivent en séance de HF
TP en ayant 1o pris connaissance du problème et 2o avec et ainsi la focale f s’écrit :
une bonne idée de comment le résoudre et qu’ils en par-
tent en rendant un compte-rendu qui compte pour la d
f = OF = R cos i +
note de contrôle continu. tan(r − i)
La question est évidemment : ≪ que doit-il y avoir dans
On peut vérifier que dans les conditions de Gauss, on
un compte-rendu de TP ? ≫ Comme il s’agit d’un exer-
retrouve la formule habituelle :
cice un peu particulier, on traite ci-dessous, à titre d’ex-
emple, la question de de la lentille demi-boule ≪ à la cos i ≈ 1
manière ≫ d’un TP. . .
sin i ≈ i
sin r ≈ r
3.2 La lentille demi-boule tan(r − i) ≈ r−i
41
42 Licence de physique L3: PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
2.8
En gros, il s’agit de recopier la formule de la focale :
f = rayon*cos(i) + d/tan(r-i) 2.6
avec la précaution que comme le langage fortran ne dis-
tingue pas entre les lettres majuscules et minuscules, il 2.4
f
encore, faire une boucle pour faire varier d de zéro à sa 2
1 1
0.5 0.5
0 0
-0.5 -0.5
-1 -1
-1 -0.5 0 0.5 1 1.5 2 2.5 3 -1 -0.5 0 0.5 1 1.5 2 2.5 3
Figure 3.3 – Trajet des rayons Figure 3.4 – Trajet des rayons, avec réflexion totale.
write(10,*) d, f open(10,file=’lentille.res’)
write(20,*) -rayon, d open(20,file=’lentille.ray’)
write(20,*) rayon*cos(i), d do l = 1, l_max-1
write(20,*) f, 0. d = l*rayon/l_max
write(20,*) ! ca, c’est juste pour i = asin(d/rayon) ! arcsinus
! sauter une ligne dans le fichier resultat if ( d < d_max ) then
enddo r = asin(n*d/rayon)
close(10) ; close(20) f = rayon*cos(i) + d/tan(r-i)
end program lentille write(10,*) d, f
write(20,*) -rayon, d
Le résultat est donné sur la figure 3.3. Pour obtenir write(20,*) rayon*cos(i), d
l’arc de cercle, on a simplement ajouté au programme write(20,*) f, 0.
une autre boucle pour tracer les points de coordonnées else
(R cos i, R sin i), i ∈ [−π/2, π/2]. Pour obtenir un rapport write(20,*) -rayon, d
write(20,*) rayon*cos(i), d
d’aspect convenable entre les axes x et y (ce sont des
alpha = pi -2*i
distances, a priori, dans la même unité) on a spécifié à
beta = i
gnuplot : set size ratio -1 do
Avec cette figure, on visualise directement l’aberration beta = beta - alpha
géométrique : les rayons proches de l’axe optique conver- if ( beta < -pi/2 ) exit
gent bien tous vers la focale ≪ officielle ≫, alors que les write(20,*) rayon*cos(beta), rayon*sin(beta)
autres se rapprochent davantage de la lentille. enddo
endif
write(20,*) ! ca, c’est juste pour
3.2.5 Au-delà de la réflexion totale ! sauter une ligne dans le fichier resultat
Si on va au-delà de l’angle de réflexion totale, on s’at- enddo
close(10) ; close(20)
tend à ce que les rayons restent piégés dans la lentille.
open(30,file=’lentille.dioptre’)
Pour en tenir compte, la boucle sur d ne doit pas s’arrêter
do l = -20,20
à dmax = R/n mais aller jusqu’à R. Il faudra alors mettre i = acos(-1.0)*l/40.
une condition : si d < R/n, on fait comme avant, sinon, write(30,*) rayon*cos(i), rayon*sin(i)
on fait la réflexion totale. Dans ce deuxième cas, comme enddo
on ne sait pas d’avance combien il y aura de réflexions, il close(30)
faut mettre une boucle sans indice avec un critère d’arrêt end program lentille
et un exit.
Cela peut donner le programme suivant (on laisse le soin Et l’on obtient aisément la figure 3.4.
au lecteur de retrouver les formules utilisées. . .) :
program lentille
implicit none
real, parameter :: rayon = 1.0, n = 1.5 ! indice du verre
real :: d, i, r, f, d_max
integer, parameter :: l_max= 20 ! nombre de rayons a tracer
integer :: l
real :: alpha ! angle entre deux reflexions totales
real :: beta
real, parameter :: pi = acos(-1.0) ! nombre pi
Méthodes numériques.
Ce chapitre développe les principales méthodes On obtient après quelques lignes de calcul :
numériques utilisées par les physiciens : afin d’éviter
d’en faire un manuel de mathématiques appliquées, que qq ′ xq cos θ + (yq − ℓ) sin θ
sin θ +
d’autres seraient sans doute mieux à même de réaliser, 4πε0 mg [(ℓ sin θ − xq )2 + (ℓ(1 − cos θ) − yq )2 ] 23
chaque méthode est illustrée par un exemple de physique
puisé dans la mesure du possible dans le bagage d’un =0 (4.1)
étudiant de licence de physique, quitte à anticiper ce qui n’est pas évident à résoudre analytiquement . 1
légèrement sur certains cours (en physique quantique ou Il s’agit d’un cas particulier du problème de la recherche
en thermodynamique statistique en particulier). du ou des zéro(s) d’une fonction, c’est-à-dire trouver le ou
les x tel(s) que
f (x) = 0
4.1 Recherche des zéros d’une
Il existe deux méthodes principales pour résoudre
fonction. numériquement ce genre de problème.
Partons d’un exemple complétement académique mais
très simple : un pendule simple de masse m porte à son 4.1.1 Méthode de la dichotomie.
extrémité une charge q. On place à proximité une autre
Comme son nom l’indique, il s’agit d’une recherche dans
charge q ′ (figure 4.1). Trouver l’angle d’équilibre θ du pen-
un intervalle que l’on découpe en sous-intervalles (fig. 4.2).
dule en fonction de la valeur de q ′ .
θ
f(a)
ε
q’
q
f(b)
Figure 4.1 – Le pendule chargé
a x b
L’énergie potentielle de gravitation du pendule peut Figure 4.2 – Recherche de zéro par dichotomie. Les zones
s’écrire : grisées sont éliminées par la recherche. Le rectangle allongé
Vg = mgz = −mgℓ cos θ horizontalement délimite la précision ε requise.
où ℓ est la longueur du pendule et θ l’angle qu’il fait avec
la verticale ; de même, l’énergie potentielle électrostatique Admettons que sur l’intervalle [a, b] la fonction f ait un
des charges s’écrit : zéro et un seul : elle change de signe sur l’intervalle et donc
le produit f (a)f (b) est négatif. Coupons alors l’intervalle
1 qq ′ a+b
Ve = p [a, b] en deux, ce qui nous donne le point x = . Si
4πε0 (ℓ sin θ − xq )2 + (ℓ(1 − cos θ) − yq )2 2
le produit f (a)f (x) est négatif, c’est que le zéro recherché
se trouve dans l’intervalle [a, x], sinon il se trouve dans
où xq et yq sont les coordonnées de la charge q ′ . L’équilibre l’intervalle [x, b]. Il reste à rediviser en deux l’intervalle
est, comme d’habitude, donné par :
1. On pourrait tenter de poser par exemple x = sin θ et y = cos θ,
d(Vg + Ve ) avec x2 + y 2 = 1. On tomberait alors sur un polynôme de degré 8
=0 en x et y. . .
dθ
45
46 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
−0.8
do ! *** debut de la boucle ***
x = 0.5*(x1+x2) ; y = f(x) ! dichotomie −1
if ( abs(y) < epsilon ) exit ! critere d’arret
−1.2
! de quel cote le zero se trouve-t-il ?
if ( y1*y < 0 ) then −1.4
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
x2 = x ; y2 = y ! a gauche [x1,x] C
else
x1 = x ; y1 = y ! a droite [x,x2] Figure 4.3 – Solution du problème du pendule en fonction
endif ′
de c = 4πεqq0 mg pour ℓ = 1.
enddo ! *** fin de la boucle ***
do i = 1, imax
call f(x, y, d)
a a
xp = x - y/d
if (abs(xp-x) < eps ) exit
i2
x y x = xp
enddo
n2
newton = xp
end
4.1.3 Comment s’y prendre ? 1. l’algorithme lui-même peut-être plus ou moins précis
Les paragraphes précécents décrivent deux méthodes 2. les nombres avec lesquels travaille l’ordinateur sont
différentes pour résoudre le même type de problème, cha- eux-mêmes définis avec une certaine précision.
cune avec ses qualités et ses défauts. En consultant des
Par exemple, la méthode de la dichotomie, détermine un
ouvrages spécialisés, on s’apercevra rapidement qu’il en
zéro en l’encadrant par un intervalle d’étendue b − a, puis
existe d’autres. Comment procéder, alors ? b−a b−a
La première étape est de tenter de dégrossir qualita- , . . ., . Comme le nombre d’itérations est fini,
2 2n
tivement le problème par des résolutions graphiques par cela donne la précision du calcul intrinsèque à la méthode.
exemple, soit à l’aide de programmes de tracé de courbes Toutefois, même un algorithme parfait, s’il existait, ne
comme gnuplot, soit avec une calculette graphique, soit. . . pourrait pas donner des résultats infiniment précis à cause
à la main, ce qui est parfois le plus efficace car programmes du caractère fini de l’ordinateur lui-même qui ne peut pas
et calculettes travaillent toujours dans un intervalle défini représenter un nombre de façon parfaite.
a priori et ne disent rien sur ce qui se passe à l’extérieur
de cet intervalle, en particulier les asymptotes.
La deuxième étape est souvent de tenter de reformuler 4.2.1 Les nombres entiers.
le problème de façon qu’il n’y ait qu’un seul zéro dans le Il a été mentionné que les nombres avaient une
domaine ≪ utile ≫. Par exemple, rechercher le zéro de représentation binaire, c’est-à-dire constituée de 0 et de
tanh x − ax = 0 1. Ainsi pour les nombres entiers, on obtient la correspon-
dance habituelle entre représentation décimale (1ère ligne)
pour a < 1 donne trois solutions dont une solution triviale et binaire (2ème ligne) :
pour x = 0 (figure 4.6) ; or l’ordinateur ne ≪ sait ≫ pas 0 1 2 3 4 5 6 7 8 ...
qu’elle est sans intérêt. Il peut être habile alors de chercher 0 1 10 11 100 101 110 111 1000 ...
plutôt les solutions de Une case contenant un 0 ou un 1 s’appelle un bit.
Dans l’immense majorité des ordinateurs, les bits sont re-
tanh(x) groupés par groupes de huit, les octets, ou bytes en anglais.
−a=0
x Un octet constitue généralement un emplacement corre-
qui élimine la solution triviale si a 6= 1, puisque spondant à une adresse dans la mémoire vive de l’or-
dinateur. Le tableau ci-dessus devrait donc se reécrire :
tanh(x) 0 1 2 3 4
lim =1 00000000 00000001 00000010 00000011 00000100
x→0 x
5 6 7 8 ...
C’est alors qu’on peut choisir une méthode, Newton si 00000101 00000110 00000111 00001000 ...
le problème s’avère assez ≪ civilisé ≫ dichotomie sinon. Avec un octet on peut donc représenter les nombres
entiers allant de 0 à 28 − 1 = 255 : c’est un peu limité, car
on aimerait pouvoir utiliser, d’une part, des nombres plus
4.2 Représentation des nombres grands et, de l’autre, des nombres négatifs.
dans un ordinateur. Pour pouvoir représenter les nombres négatifs, on doit
changer la convention et l’on prend le complément à deux,
Dans ce qui précède, on a introduit, sans trop insister, qui consiste à remplacer les 1 par des 0, et inversement,
la notion de précision du résultat. Cette précision n’est puis ajouter 1 au résultat ; soit, toujours sur un octet :
jamais absolue pour plusieurs raisons. 00000001 = 1 et 11111111 = −1. Ainsi de 00000000 = 0
2. Shot off to outer space comme disent joliment nos collègues à 01111111 = 127 on code des nombres positifs et pour
américains. les nombres négatifs, 11111111 = −1, 11111110 = −2,
Physique numérique, Philippe Depondt 49
. . ., jusqu’à 10000000 = −12 ∗ 8. On peut vérifier qu’avec Le résultat obtenu est 0. et non 1. ! La raison en est
cette convention l’addition suivante est correcte : que l’on ajoute 1000 + 1 10−9 ce qui, compte tenu de la
−4 11111100 précision machine, vaut 1000 : peu importe que l’on répète
+2 00000010 l’opération un milliard de fois ! Finalement 1000 − 1000 =
= −2 11111110 0. . . En déclarant s en double precision on obtient :
Afin d’avoir une plage de nombres accessibles plus 0.999989425 4
grande, les octets sont généralement regroupés par en- Il faut donc être assez méfiant lorsqu’on traite des
sembles de quatre (appelés mots), soit 32 bits 3 . Ainsi les nombres qui prennent des valeurs très différentes. Il est
nombres entiers peuvent aller de −231 = −2 147 483 648 à aussi prudent de se rappeler que lorsqu’on fait des calculs
231 − 1 = 2 147 483 647, ce qui est largement suffisant pour itératifs, ce qui est très souvent le cas, les erreurs peuvent
la plupart des applications, mais, évidemment, pas infini. s’ajouter les unes aux autres pour ne plus être négligeables
du tout !
Un deuxième cas de figure classique est le suivant :
4.2.2 Les nombres réels.
if( a == 0. ) then
Parler de nombres réels est un abus de langage puisque √ où a est un réel. Le résultat d’une telle instruction est
l’on ne peut traiter que les nombres rationnels. Ainsi, 2 aléatoire à cause des erreurs d’arrondi ! En effet, si a est le
sera approximé par, par exemple, 1,414213562. De plus, résultat de calculs longs et compliqués, va-t-il tomber pile
on est obligé de se restreindre encore davantage aux nom- sur zéro ou sur 0.1234567E-35 ? Il vaut bien mieux définir
bres rationnels à un nombre fini de chiffres : 1/3 devient a priori la précision souhaitée et donner l’instruction :
par exemple 0,3333333333. Un tel nombre rationnel, si if( abs(a) < epsilon ) then
l’on supprime la virgule, est un nombre entier : il suf- si la valeur absolue de a est plus petite que ε, alors. . .
fit de préciser l’emplacement de la virgule, par une puis-
sance de 10, par exemple. Ainsi, 1,414213562 peut s’écrire Ainsi, une règle d’or à ne jamais oublier lorsqu’on
1414213562 10−9 . Une autre façon de s’y prendre serait : fait des calculs numériques est de vérifier sur
0, 1414213562 101 . L’avantage de la deuxième est que l’- des cas dont on connait la solution que les pro-
expression des chiffres composant le nombre est comprise grammes que l’on a écrits donnent bien la solu-
entre 0 et 1, chaque chiffre correspondant non plus à une tion attendue. . . tout en sachant qu’il ne s’agit en
puissance positive de 10 mais à une puissance négative. aucun cas d’une garantie !
Il faut donc trois choses : le signe, la position de la vir-
gule (ou l’exposant), et les chiffres (la mantisse). Le raison-
nement mené jusqu’à présent avec une notation décimale
4.3 Suites et séries.
peut-être tout aussi bien fait en binaire.
4.3.1 Généralités et premières difficultés.
Ainsi un nombre réel s’écrit, en général sur quatre
octets, soit 32 bits : 1 bit pour le signe, 8 bits pour l’- Une suite est définie par une relation de récurrence du
exposant qui donne une puissance de 2 puisqu’il s’agit de type :
nombres binaires, 23 bits pour la mantisse ; or le premier un = f (un−1 , un−2 , . . . , un−p )
bit de la mantisse est toujours 1 (sinon, il faudrait dimin-
où un est une fonction de l’élément de la suite précédent
uer l’exposant de 1), donc on l’omet ce qui permet de
ou de plusieurs éléments précédents. Par exemple, la fac-
gagner un bit significatif.
torielle :
Dans ces conditions, les nombres réels peuvent s’étendre n! = n(n − 1)! avec 1! = 1
de ±1, 175494 10−38 à ±3, 402823 1038 avec sept chiffres
significatifs. Si cela ne suffit pas, on peut utiliser la double Une série s’écrit comme :
precision sur 8 octets qui donne 15 chiffres significatifs Xn
de 2, 225074 10−308 à 1, 797693 10308 . Certaines machines sn = ui ou bien sn = sn−1 + un
acceptent aussi les real*16 sur 16 octets. . . i=1
5. Voir par exemple dans les Numerical Recipes, référence [3] dans on remplace le calcul de la surface par une approximation
la bibliographie. constituée d’une somme de surfaces de rectangles.
6. Numerical Recipes (voir bibliographie, référence [3]), qui n’y Une autre approximation tout aussi légitime serait :
va pas avec le dos de la cuillère, va jusqu’à menacer : ≪ Come the
(computer) revolution, all persons found guilty of such criminal be- Z b Xn
haviour will be summarily executed ≫ ! L’humour est sans doute f (x) dx ∼ f (a + iδx )δx
douteux, mais le message est clair. a i=1
Physique numérique, Philippe Depondt 51
On arrête le calcul lorsque l’écart entre deux résultats suc- la distance à l’axe :
cessifs est inférieur à la précision requise :
r2
n = n0 1− 2
|Sn − Sn−1 | < ε 2ρ
C’est cependant une méthode qui n’est totalement dénuée où n0 et ρ sont des constantes. Il s’agit d’une fibre à gradi-
de danger : soit par exemple la fonction suivante (figure ent d’indice qui permet de piéger, pour ainsi dire, le rayon
4.11), lumineux au centre de la fibre. Si l’on se place dans le plan
xOy, r2 se ramène à y 2 et chercher le trajet du rayon lu-
mineux revient à chercher la fonction y(x). Une incursion
1
dans le cours d’optique fournit l’équation de propagation
0.8
d’un rayon lumineux :
d~r
0.6 d n
ds ~ n
= grad (4.2)
0.4
ds
où s est l’abscisse curviligne sur le rayon du point ~r. Ceci
0.2 se résoud analytiquement assez aisément à condition de se
placer dans l’approximation où le rayon ne s’éloigne pas
0
−2 −1.5 −1 −0.5 0 0.5 1 1.5 2 trop de l’axe de la fibre, de façon que sa pente par rapport
à l’axe reste faible, de sorte que l’on puisse identifier ds à
Figure 4.11 – Si l’on ne prend pas de précautions, dx. On obtient :
l’intégrale de cette fonction sera nulle !
d~r ∂n
d n = 0
dx ∂x
=
si x < 0, 5 ou si x > 1, 5 f (x) = 0 dx ∂n n0 y
= − 2
sinon f (x) = 1 ∂y ρ
que l’on souhaite intégrer de a = −2 à b = 2. La première soit, après quelques manipulations simples,
étape donne zéro, et . . . la deuxième aussi. L’écart est nul
et donc inférieur à ε : le programme s’arrêtera. La même d2 y n0 y
n =− 2
mésaventure arrive si l’on cherche dx2 ρ
Z π
Il reste à approximer n par n0 , puisqu’on ne s’éloigne pas
sin(x)dx de l’axe de la fibre, et à chercher des solutions du type :
−π
Z ! 2 ! e− σ2 dx ∼ e− σ2 dx
n0 λ
a2 sin2 2πx a2 2π 2πx −∞ −5σ
1− λ
1+ cos2 dx
λ 0 2ρ2 2 λ λ n’est pas une mauvaise approximation.
4 2. une méthode plus élégante est de découper l’intégrale
On
R 2π peut ensuiteR éliminer le terme en a et sachant que
2 2π
0
sin x dx = 0 cos2 x dx = π, on finit par avoir : Z ∞ Z a Z b Z ∞
f (x)dx = f (x)dx + f (x)dx + f (x)dx
L a2 a2 π 2
∼ n0 1 − 2 + 2 −∞ −∞ a b
λ 4ρ λ
et de faire des approximations pour les extrémités,
La condition pour que L ne dépende pas de a est que :
sur la base d’un développement limité par exemple.
λ = 2πρ Une illustration physique simple pourrait être une dis-
ce qu’on avait déjà trouvé auparavent : l’intérêt du sec- tribution linéique de charges sur une pelote de ficelle
ond calcul étant de montrer que le chemin optique ne de forme compliquée mais dont les extrémités vont à
dépendant pas de a, une source de lumière cohérente l’infini. Le potentiel créé à l’origine pourrait s’écrire :
placée à l’entrée de la fibre sur son axe, et produisant Z ∞
1 σ(s)
un faisceau non totalement parallèle, donnera, en sortie V = p ds
4πε0 −∞ x2 (s) + y 2 (s) + z 2 (s)
de la fibre, un faisceau qui n’aura pas perdu sa cohérence,
malgré la divergence. où, σ, x, y et z sont des fonctions connues de l’ab-
0 scisse curviligne s. Admettons qu’une approxima-
−0.01 tion serait que lorsque s > b alors σ ∼ sς et que
p
−0.02 x2 (s) + y 2 (s) + z 2 (s) ∼ s. On obtient alors,
−0.03 Z ∞ Z ∞
σ(s) ς ς
L/lambda − n0
−0.04
p ds ∼ 2
ds =
−0.05 b
2 2
x (s) + y (s) + z (s)2
b s b
−0.06
−0.07 La même approximation pour s < a donnerait en fin
−0.08 de compte :
−0.09 " Z b #
1 ς σ(s) ς
−0.1
0 0.2 0.4 0.6 0.8 1 V = − + p ds +
a 4πε0 a a x2 (s) + y 2 (s) + z 2 (s) b
Figure 4.12 – L’intégrale L où la partie centrale serait calculée par la méthode
λ − n0 en fonction de a calculée
numériquement par la méthode des trapèzes. des trapèzes.
On peut également utiliser des méthodes similaires autour
On est toutefois en droit de se demander quelle est de points singuliers à condition de les avoir identifiés au
la validité des approximations que l’on a faites : pour préalable.
cela, il suffit d’intégrer numériquement l’équation (4.3)
(Exercice : le faire ! 7 ) en faisant varier a pour λ = 2πρ :
cela donne la figure 4.12 ; on constate que tant que a < 4.4 Échantillonnages, interpola-
0.5ρ, l’erreur reste inférieure à 0.01, (pour L ∼ 1.5) ce
qu’on n’aurait probablement pas deviné sinon.
tion.
On a vu, pour le problème de l’intégration, l’impor-
4.3.2.5 Intégrales indéfinies. tance du pas d’intégration : c’est déjà une première
Dans toutes les discussions ci-dessus, seules les forme d’échantillonnage puisqu’une fonction définie sur un
intégrales définies ont été abordées. On ne peut pas cal- morceau de l’axe réel se trouve réduite à un ensemble dis-
culer par ces méthodes des intégrales du type : cret de points.
Z ∞ De même, lorsqu’on demande à un logiciel comme
f (x)dx gnuplot (ou à une calculette graphique, d’ailleurs) de
−∞ tracer le graphe d’une fonction, sin x par exemple, il cal-
7. prendre par exemple ρ = 1 et n0 = 1.5. On calculera en double cule les valeurs de la fonction en un certain nombre de
precision. points, reliés ensuite par des lignes droites ; en général, les
54 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
1
4.4.2 Approximation parabolique.
0.8
0.6
0.4
0.2
0
−0.2
−0.4
−0.6
−0.8
−1
−10 −5 0 5 10
dans les produits du numérateur et du dénominateur de la peuvent donner des valeurs numériques importantes pour,
fraction ci-dessus, manquent évidemment les termes x−xℓ mettons, la dérivée première, et ces valeurs risquent de
et . . . xℓ − xℓ ! changer brutalement d’un point à un autre. En pratique,
Le choix du degré le plus approprié pour le polynôme on se limite donc à des dérivées d’ordre faible, un voire
n’est pas facile. Une bonne règle est de ne pas essayer de deux, sur des données de très bonne qualité intrinsèque.
trop bien faire ! En effet le choix d’un degré trop élevé, bien On verra dans le chapitre 4.8 d’autres méthodes plus sûres
loin d’améliorer l’interpolation, risque de produire des os- en présence de bruit.
cillations complétement erratiques de l’interpolation entre
les points connus. Il est bien rare qu’un degré supérieur
à 3 se justifie vraiment, c’est en général le signe que l’on 4.5 Algèbre linéaire.
commence à manquer de données de références : peut-être
est-il temps alors d’envisager de faire quelques points de 4.5.1 Un exemple : la diffusion de la
mesure expérimentaux supplémentaires. . . L’informatique, chaleur à une dimension.
contrairement à la magie, ne peut pas tout faire, en par-
La loi de Fourier de diffusion de la chaleur dit simple-
ticulier inventer des données numériques manquantes !
ment que le flux de chaleur en un point est proportionnel
au gradient de température :
4.4.4 Dérivées.
~ r) = −κ(~r) grad
φ(~ ~ T (~r)
Les mêmes méthodes permettent en principe une
évaluation des dérivées successives d’une fonction puisqu’à où κ(~r) est la conductivité thermique qui dépend de la
partir de l’expression d’un polynôme de Lagrange de degré nature du milieu. Si celui-ci est homogène, κ est une con-
n on peut facilement obtenir des expressions pour les stante, sinon κ dépend de la position ~r.
dérivées jusqu’à la dérivée n-ième. Si l’on produit de la chaleur en un point ~r donné (par
Par exemple, une expression de la dérivée première peut effet Joule ou par un apport quelconque, ou encore au
être obtenue à partir de l’approximation linéaire, éq. (4.4) : contraire par une perte dans l’atmosphère), cette chaleur
doit diffuser et cette chaleur diffusée par unité de temps
f (xℓ+1 ) − f (xℓ ) doit être égale à la quantité Q̇(~r) de chaleur produite par
p′ℓ =
xℓ+1 − xℓ unité de temps, ce qui donne :
En fait, il s’agirait plutôt d’un calcul de la dérivée en ~ r) = Q̇(~r)
xℓ+1 +xℓ div φ(~
2 , au milieu de l’intervalle, et non en xℓ . Si l’on
préfère une expression plus symétrique qui donne une En combinant ces deux équations, on obtient facilement :
autre estimation plus précisément en xℓ :
~ κ(~r) · grad
grad ~ T (~r) + κ(~r) ∆T (~r) = −Q̇(~r) (4.5)
f (xℓ+1 ) − f (xℓ−1 )
p′ℓ =
xℓ+1 − xℓ−1 Cette équation, alliée à d’éventuelles conditions aux lim-
ites, permet, en principe, de calculer la distribution de
On montre d’ailleurs aisément que cette dernière expres- température en régime stationnaire dans un objet, con-
sion vient de la dérivation de l’approximation parabolique. naissant Q̇(~r) et κ(~r). Autant dire que ce n’est pas tou-
jours facile : que faudrait-il faire pour une résolution
numérique ?
Pour simplifier, on se restreindra ici à une dimension,
mais le problème n’est pas très différent à trois dimensions,
du moins dans des géométries simples. L’équation (4.5) se
réduit alors à :
dκ dT d2 T
+ κ 2 = −Q̇(x)
dx dx dx
Le première étape est de discrétiser le problème : on
pose,
x = i δx
où i est un entier et δx un pas d’intégration, similaire à ce
qui a déjà été vu dans le chapitre 4.3.2. On note alors :
Figure 4.15 – Derivée d’un sinus affecté d’un léger bruit. T (x) = T (i δx ) = Ti
La dérivée, elle, est affectée d’un fort bruit, même si l’al- dT
lure générale est convenable. La dérivée peut être approchée par :
dx
Il faut cependant être assez prudent. Outre la remar- dT Ti+1 − Ti
∼
que ci-dessus concernant la limite pratique sur le degré dx δx
du polynôme utilisé, il faut être conscient qu’un calcul de
ou bien
dérivée va tendre à amplifier le bruit (figure 4.15). En ef- dT Ti − Ti−1
fet, des fluctuations locales, de point à point, de la fonction ∼
dx δx
56 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
ai,i+1 Ti+1 + ai,i Ti + ai,i−1 Ti−1 = bi ∀i Pour ce qui est de la matrice A, il faut savoir que
fortran stocke les matrices multicolonnes colonne par
colonne : une colonne, puis une autre, puis une autre.
où les ai,j sont connus et où l’on cherche à calculer les En mémoire, se succèdent ainsi : a11 , a21 , a31 , · · · an1
Ti . On vient de reformuler le problème comme un système (première colonne), a12 , a22 ,. . .(deuxième colonne),. . . etc.,
linéaire de n équations à n inconnues (les Ti ) : si on peut c’est-à-dire que le premier indice ≪ va le plus vite ≫ (en
trouver des méthodes pour résoudre de très gros systèmes C, c’est l’inverse). Si l’on veut écrire des programmes effi-
d’équations linéaires, alors le problème ci-dessus peut être caces, il faut tenter de privilégier les appels à des éléments
considéré comme résolu. successifs en mémoire 12 , et donc dans les boucles im-
briquées, mettre autant que possible, le premier indice
dans la boucle la plus interne. Par exemple :
4.5.2 Systèmes d’équations linéaires.
do j = 1, n ! boucles dans le bon ordre
Au delà de n = 2 ou 3, il ne faut surtout pas tenter de a(1:n,j) = ...
résoudre le système linéaire en procédant par élimination enddo
comme on le fait d’habitude pour une résolution à la main :
et non l’inverse :
les problèmes de stabilité numérique deviennent très vite
cruciaux. Il vaut bien mieux utiliser des sous-programmes do i = 1, n ! boucles dans le mauvais ordre
de bibliothèque : ce sont des programmes déjà écrits, sou- a(i,1:n) = ...
vent depuis longtemps, éprouvés, dont les qualités et les enddo
défauts sont connus, compilés et rassemblés dans des bib-
liothèques. Il suffit d’appeller le sous-programme choisi par Pour résoudre le système d’équations, on pourrait imag-
un call dans le programme que l’on a écrit comme n’im- iner qu’il suffise de calculer l’inverse de la matrice A et
porte quel autre sous-programme, en suivant toutefois les faire le produit :
indications fournies dans la documentation 10 puis d’in- x = A−1 · b
voquer la bibliothèque lors de la compilation : c’est en mais il se trouve que les algorithmes de résolution directe
général une option de compilation 11 : le compilateur ira du système d’équations sont plus efficaces.
puiser dans la bibliothèque ce dont il a besoin. . .
Il n’y a donc aucune raison de réinventer la roue ! C’est 4.5.2.1 La méthode LU
en fait une démarche très courante en calcul scientifique :
on se pose un problème de physique, puis on se demande C’est le véritable cheval de bataille de tous ces
comment le traduire de façon à le traiter avec un pro- problèmes (voir réf. [3] pour une discussion plus appro-
gramme de bibliothèque déjà existant. fondies des qualités et défauts des différentes méthodes,
par exemple Gauss-Jordan).
10. Souvent en ligne.
11. généralement, l’option -l (pour library=bibliothèque), par ex- 12. Parce que le compilateur gère mieux les transferts entre
emple avec la bibliothèque linpack : g95 machin.f90 -llinpack -o mémoire et processeur de paquets de nombres connexes que des nom-
machin. bres pris dans n’importe quel ordre.
Physique numérique, Philippe Depondt 57
l41 l42 l43 l44 Tous les termes dans les sommes des équations (4.8) et
(4.9) sont déjà calculés à condition d’appliquer les deux
dans le cas où n = 4, et U est une matrice triangulaire
équations par i croissants pour un j donné, puis changer
supérieure (U = upper ) qui n’a des éléments que sur et au
de j. Il ne s’agit finalement que d’un réordonancement très
dessus de la diagonale :
simple du problème.
u11 u12 u13 u14 En général, les programmes qui appliquent cet algo-
0 u22 u23 u24 rithmes détruisent le contenu de la matrice A en rangeant
U= 0
0 u33 u34 les éléments de L dans la partie inférieure de A, et les
0 0 0 u44 éléments de U dans la partie supérieure, sachant que les lii
ne sont pas conservés, puisqu’ils valent 1. En outre, afin de
Le système initial se reécrit : limiter les dégâts lors des divisions par ujj dans l’équation
(4.9), un certain réarrangement des lignes et colonnes
L · (U · x) = b
du système d’équations doit être fait pour commencer
il reste à chercher y tel que : par les éléments pour lesquels ujj est grand (une divi-
sion par un nombre très petit donne parfois des résultats
L·y =b imprévisibles). Les programmes de bibliothèque font cela
et souvent fournissent en prime des diagnostics lorsque A
puis x tel que : est singulière, ou trop proche d’une matrice singulière.
U·x=y
L’avantage de procéder ainsi est que maintenant le système 4.5.2.2 Amélioration itérative de la précision.
est trivial à cause de la forme triangulaire des deux ma-
Il faut néanmoins faire un peu attention à la précision du
trices : 1 1
résultat obtenu, car les termes du type et dans les
b1 lii uii
y1 = équations (4.7) et (4.9) peuvent donner lieu à des surprises
l11
1 si les diviseurs sont petits. Il y a plusieurs façons de s’en
y2 = [b2 − l21 y1 ] sortir. La première consiste à utiliser un sous-programme
l22
1 de bibliothèque capable de détecter ce genre de problème :
y3 = [b3 − (l31 y1 + l32 y2 )] pratiquement toutes les bibliothèques en proposent. Un
l33
autre test possible est de comparer les résultats obtenus
··· (4.7) en simple et en double précision.
puis, en procédant de même à l’envers : Une cure possible est de partir d’une solution approchée
x′ , et donc fausse, obtenue par, mettons, la méthode LU
yn et de chercher à l’améliorer.
xn =
unn Soit :
··· A · x′ = b + δb
Reste à faire la décomposition proprement dite. où δb est l’erreur qu’il faut réduire ; or :
Il s’agit d’un algorithme typique de ceux dont sont
friands les amateurs. Nous le détaillons ici pour le plaisir x′ = x + δx, et A · x = b
13
de ce genre de tourisme ! Cela s’appelle l’algorithme de
Crout. donc :
Le problème est de trouver lij et uij tels que : A · δx = δb = A · x′ − b
min(i,j)
qui est un système que l’on peut résoudre pour obtenir δx.
X On peut alors corriger x′ et recommencer jusqu’à obtenir
lik ukj = aij
la précision voulue, à condition évidemment que l’algo-
k=1
rithme converge. . .
n(n + 1) Il faut savoir cependant que les bibliothèques pro-
Il y a n2 équations, or L comporte éléments a
2 posent généralement un très grand nombre de sous-
priori non nuls, ainsi que U, soit n2 + n inconnues, et donc programmes prévus pour des cas très divers : il est
n de trop. On fixe alors : donc conseillé de choisir le programme adapté. Toutefois,
pour la plupart des problèmes ≪ standards ≫ du physi-
lii = 1, ∀i
cien, la méthode LU est très satisfaisante, mais pour les
13. Et surtout pas pour l’apprendre par cœur. . . problèmes exigeant d’énormes matrices creuses tels que les
58 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
méthodes d’éléments finis (pour la résolution de problèmes Les équations (4.8) et (4.9) se réduisent à :
de mécanique des fluides par exemple), des méthodes
spécialement prévues à cet effet doivent être utilisées. i=j−1 uj−1j = ej
i=j ujj = dj − ljj−1 uj−1j
4.5.2.3 Matrice inverse. fj
i=j+1 lj+1j =
Une fois la décomposition achevée, il est facile de rem- ujj
placer b par : Les équations ci-dessus ne constituent pas en elles-
1 même l’intérêt principal de ce paragraphe : le but est
0
ici d’attirer l’attention sur le fait que pour un type de
0
matrice, la méthode de résolution que l’on choisira n’est
..
. pas toujours la même que pour un autre type de ma-
0 trice. Les bibliothèques sont parfois fort riches et il est de
bon ton de chercher un peu dans la documentation quel
ce qui donne la première colonne de A−1 dans x, puis on peut être le sous-programme le plus adapté au cas parti-
procède colonne par colonne en posant : culier envisagé. Il existe des solutions pour des matrices
≪ bande-diagonales ≫ ou des solutions itératives par ap-
0
proximations successives pour des problèmes difficiles, des
..
. décompositions en valeurs singulières quand le problème
b= 1
se pose. . ., les ressources sont abondantes, parfois un peu
. trop, même !
..
0
4.5.3 Une généralisation de la méthode de
en plaçant le nombre 1 sur la i -ème ligne de b pour obtenir Newton à plusieurs dimensions.
la i -ème colonne de A−1 .
Au chapitre 4.1.2, on a mentionné le fait que la méthode
de Newton de recherche de zéro pouvait se généraliser à
4.5.2.4 Déterminant d’une matrice. plusieurs dimensions. Cela peut être utile, si par exemple,
C’est encore plus simple : au lieu d’un seul pendule comme dans l’exemple, on en
avait plusieurs couplés entre eux et non plus astreints à se
n
Y déplacer dans un plan : on aurait alors deux angles polaires
det A = ujj par pendule à trouver et donc un système de 2N variables
j=1
à rechercher.
C’est le moment de s’y attaquer. Soit donc n fonctions
4.5.2.5 Matrice tridiagonale. de n variables
Si l’on étudie l’équation (4.6), on s’aperçoit vite que
fj (x1 , . . . , xi , . . . , xn ), ∀j ∈ [1, n]
seuls les termes en i − 1, i et i + 1 sont non nuls. La
matrice A ne comporte alors que des termes diagonaux, dont on suppose qu’elles possèdent un zéro et qu’elles sont
sous-diagonaux et sur-diagonaux : elle est donc tridiago- raisonnablement ≪ civilisées ≫ 14 : ces fonctions ne sont
nale : toutefois évidemment pas linéaires.
On démarre la recherche comme avant à partir d’un
a11 a12 0 0 0 ··· 0
a21 a22 a23 0 0 ··· 0 point de départ :
0 a32 a33 a34 0 0
···
··· ··· · · · · · · · · · · · · · · · (0) (0)
x1 , . . . , xi , . . . , x(0)
A= n
··· 0 aii−1 aii aii+1 0 ···
··· ··· ··· ··· ··· ··· · · · on linéarise alors les fonctions localement :
0 0 ··· 0 an−1n−2 an−1n−1 an−1n
0 0 ··· 0 0 ann−1 ann fj (x1 , . . . , xi , . . . , xn )
Dans ce cas, il n’est nul besoin de stocker toute la matrice =
A avec ses n2 éléments puisque, pour la plupart, ils sont (0) (0)
nuls. On écrit plutôt fj (x1 , . . . , xi , . . . , x(0)
n )+
(0) (0)
−fj (x1 , . . . , xi , . . . , x(0)
n ) ce qui se résout aisément en écrivant que le déterminant
du système est nul, etc. 15
C’est un système d’équations linéaires dont les inconnues
Cependant, on peut reécrire le problème matricielle-
sont les {dxi } :
ment :
J · dx(1) = −f (0)
D · a = ω2 a
avec des notations sans surprise. La matrice J des dérivées
∂fj avec évidemment :
partielles, Jij = , s’appelle la matrice jacobienne.
∂xi g C C
On résout donc le système, ce qui permet de calculer les + −
ℓ1 m1 ℓ 1 m1 ℓ 1 a1
(1)
{xi } puis on recommence jusqu’à convergence, comme D=
, a =
C g C a2
dans le cas à une dimension. − +
m2 ℓ 2 ℓ2 m2 ℓ 2
fera apparaı̂tre les valeurs propres sur la diagonale. l’on cherche également). Pour simplifier les notations, il
Pour l’utilisateur, il suffit de fournir deux tableaux uni- est d’usage d’écrire la même équation comme suit :
dimensionnels contenant la diagonale et la sous-diagonale
de la matrice initiale A ou A0 . Au retour, on obtient < ψ|H|ψ >
E=
les valeurs propres à la place de la diagonale en général < ψ|ψ >
classées par ordre de valeur décroissante. Si l’on veut aussi L’énergie E dépend évidemment de la fonction d’onde et
les vecteurs propres, il faut également fournir un tableau l’on montre que si l’on modifie légèrement ψ, E doit être
n×n et. . . bien lire la documentation pour déterminer si un minimum par rapport à ce changement, si toutefois E et
vecteur propre donné occupe une ligne ou une colonne de ψ sont solutions du problème.
la dite matrice ! En général, les vecteurs propres obtenus On développe alors la fonction d’onde sur une base de
sont normalisés à 1, soit, pour un vecteur propre ai donné : fonctions connues χℓ :
X X
a2i,ℓ = 1 ψ= cℓ χ ℓ
ℓ ℓ
où ai,ℓ est la ℓ-ième composante du vecteur propre ai . en espérant que la base choisie ≪ marchera ≫. Le principe
variationnel ci-dessus dit que le meilleur jeu de coefficients
4.5.4.3 Rendre une matrice tridiagonale. cℓ est celui pour lequel E est minimum, donc pour un δck
quelconque, le δE doit être nul au premier ordre. Avec ces
Quand la matrice n’a pas la forme requise, il faut la notations, l’équation (4.11) s’écrit :
transformer d’abord, par exemple, lorsque les pendules
X
couplés de notre exemple ≪ voient ≫ leurs seconds voisins, c∗ℓ cm Hℓm
ou bien lorsque l’objet étudié est une molécule en vibra-
tion dont les atomes sont couplés les uns aux autres en E = ℓmX (4.12)
c∗ℓ cℓ
trois dimensions.
ℓ
La méthode tourne toujours autour du même genre
d’opérations : on fait une séquence du type : où
Hℓm =< χℓ |H|χm >
As+1 = Rts · As · Rs
à condition toutefois que la base de fonctions soit or-
où Rs est une rotation plane judicieusement choisie et là thonormée, soit :
encore une batterie de théorèmes appropriés montre que
< χℓ |χm >= δℓm
l’on doit converger vers une matrice tridiagonale.
Si l’on impose une variation δck au coefficient ck dans
4.5.4.4 Problèmes aux valeurs propres généra- l’équation (4.12), on obtient alors :
lisés.
δE = !
Ce sont des problèmes du type : X X X
∗ ∗
δck cm Hkm + cℓ δck Hℓk c∗ℓ cℓ
A · x = λB · x (4.10) m X ℓ ℓ
− c∗ℓ cm Hℓm (δc∗k ck + c∗k δck )
où l’on cherche les valeurs propres λ et les vecteurs propres ℓm
x, A et B étant des matrices connues : voyons un exemple.
or δE doit être nul ∀k, ∀δck , ce qui donne, après avoir
ré-injecté l’équation (4.11) dans l’expression ci-dessus :
4.5.4.4.1 L’équation de Schrödinger. La résolu-
tion numérique de l’équation de Schrödinger est un X
cm Hkm = E ck ∀k
problème particulièrement difficile et, outre qu’un tome m
entier ne suffirait pas à le traiter complètement (voir,
par exemple, la référence [12]), c’est un domaine où autrement dit
la recherche est active ! Ici, nous nous contenterons de H·c=Ec
l’équation stationnaire et l’on tentera une résolution en avec des notations sans surprise. On reconnait là une
développant la fonction d’onde ψ sur une base de fonc- équation aux valeurs propres : la résoudre donne à la fois
tions connues : c’est, a priori, une approximation car rien les énergies propres et les coefficients correspondants du
ne dit que la ≪ vraie ≫ solution puisse être correctement développement de la fonction d’onde.
développée sur la base choisie, surtout si celle-ci est réduite Pour des raisons diverses, il peut arriver cependant que
à un nombre fini, voire un petit nombre, de fonctions. la base de fonctions utilisée ne soit pas orthonormée : par
La consultation d’un cours de physique quantique mon- exemple, si l’on cherche des fonctions d’onde électroniques
tre que l’on peut poser le problème de la façon suivante : dans le champ d’un ensemble de noyaux, on peut vouloir
R ∗ utiliser des fonctions d’onde localisées sur les noyaux
ψ (X)H(X)ψ(X)dX
E= R (4.11) atomiques avec un certain recouvrement. Les produits
ψ ∗ (X)ψ(X)dX scalaires :
< χℓ |χm >= sℓm
où H est le Hamiltonien (connu) du système considéré,
X désigne l’ensemble des variables du problème, ψ(X) deviennent alors les éléments d’une matrice S qui n’est
la fonction d’onde que l’on cherche et E l’énergie (que plus la matrice unité. Le problème se reformule légèrement
Physique numérique, Philippe Depondt 61
pour donner après le même genre de calcul, le résultat où p~i est le moment dipolaire porté par l’atome i et ~ri est
suivant : la position de celui-ci.
H·c=ES·c Chaque atome est donc soumis au champ extérieur E ~ ext
que l’on applique et au champ dû à tous les autres dipôles :
un problème aux valeurs propres généralisé similaire à
(4.10). X
~ ri ) = E
E(~ ~ ext + E~ dip (~ri )
j
j, j6=i
4.5.4.4.2 Résolution. La méthode est en général très
simple : il suffit de remplacer (4.10) par : ~ dip (~ri ) est le champ produit en ~ri par le dipôle porté
où E j
par l’atome j. Donc :
B−1 · A · x = λ x
La matrice B−1 · A n’est généralement pas symétrique X
p~i = α E~ ext + E~ dip (~ri ) (4.13)
j
même si A et B le sont. Les sous-programmes de bib-
j, j6=i
liothèque font alors une décomposition 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
et le problème se re-écrit : les champs dipolaires, il faut connaı̂tre les moments dipo-
laires : on tourne en rond.
C · Lt · x = λ Lt · x On peut, certes, tenter de remplacer E ~ dip (~ri ) par son
j
expression en fonction de p~j et résoudre, par exemple, par
avec : t la méthode de Newton le système d’équations :
C = L−1 · A · L−1
p~i − f~i ({~
pj , j ∈ [1, n]}) = 0 i ∈ [1, n]
La matrice C a les mêmes valeurs propres que le problème
initial et ses vecteurs propres sont Lt · x. En principe, cela suppose cependant de calculer toutes les dérivées
toutes ces transformations sont transparentes pour l’util-
isateur. ∂ f~i
∂~
pj
4.5.4.5 Conclusion
une entreprise parfois un peu laborieuse, surtout si n est
Tous ces algorithmes sont efficaces et rapides : il ne faut grand.
surtout pas se priver de les utiliser quand le problème [0]
On peut toutefois partir d’une solution d’essai p~i , cal-
s’y prête, même si l’on ne maı̂trise pas absolument leur
culer les champs dipolaires correspondants, puis, à l’aide
fonctionnement, car ils sont dans l’ensemble assez ro- [1]
bustes 16 . En revanche, les bibliothèques de programmes de l’équation (4.13), de nouvelles valeurs p~i , puis de nou-
[2]
sont souvent extrêmement riches et l’on a parfois du mal veaux champs et p~i et ainsi de suite. La solution sera
à déterminer quel est le sous-programme qui répondra le obtenue quand on aura atteint un ≪ point fixe ≫ tel que :
mieux à la question posée : il faut prendre le temps de [k+1] [k]
réfléchir, de lire la documentation disponible, hélas pas p~i ≃ p~i
toujours limpide, voire se poser la question si une refor-
avec une précision suffisante.
mulation du problème de façon légèrement différente ne
permettrait pas, par exemple, de symétriser la matrice
étudiée ou si une écriture avec des termes complexes ne 4.6.2 Formulation générale.
pourrait pas simplifier considérablement la vie de celui qui
On cherche donc la solution du système d’équations :
écrit le programme !
xi = fi (x1 , x2 , . . . , xn ), i ∈ [1, n]
4.6 Problèmes autocohérents. ou
x = f (x)
ou self-consistent problems en anglais.
où les lettres en caractères gras représentent des vecteurs
4.6.1 Qu’est-ce donc ? de n éléments. On part d’une solution d’essai x[0] et l’on
construit la séquence :
Imaginons, par exemple, un diélectrique constitué d’un
ensemble d’atomes polarisables qui, lorsqu’ils sont soumis x[k+1] = f (x[k] )
à un champ électrique, voient leur nuage électronique
déformé. Ils portent alors un moment dipolaire dont on Le point fixe sera considéré comme atteint quand les
supposera ici selon l’approximation d’usage qu’il est pro- x[k] n’évolueront plus de façon significative à chaque
portionnel au champ : génération.
~ ri )
p~i = α E(~ 4.6.3 Est-ce que ça converge ?
16. ce qui ne dispense pas bien sûr de vérifier sur des problèmes
dont la solution est connue que les programmes marchent conven-
Rien n’est moins sûr ! Prenons un cas très simple pour
ablement, et, comme d’habitude, ne pas oublier d’user de l’esprit lequel n = 1 et :
critique du physicien. . . f (x) = ax
62 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
La solution est évidemment x = 0. Si l’on veut résoudre Pour que cela converge, on montre 17 qu’il suffit que :
ce problème par la méthode ci-dessus, on part d’un x[0]
choisi arbitrairement et ||A|| < 1
x[1] = a x[0] , x[2] = a x[1] = a2 x[0]
où ||A|| est l’une des normes de A :
et bien sûr :
n
X
x[k] = ak x[0]
||A||m = max |aij |
Si |a| < 1, la convergence est acquise, mais sinon ça di- i
j=1
verge !
Étudions maintenant le cas : ou bien
n
X
f (x) = tanh x ||A||l = max |aij |
j
là encore la solution x = 0 est connue. Le programme pour i=1
4.7.1 Du mouvement des amibes (mé- résoudre en δxi en suivant la méthode de Newton déjà
thode du simplex). vue :
H · δx = −d
4.7.1.1 À une dimension
avec des notations évidentes. Le vecteur d donne les vari-
On cherche donc le minimum d’une fonction f (x). On ations qu’il faudrait imposer aux variables x (ou xi ∀i)
pourrait imaginer quelques chose qui s’apparente à la pour annuler l’écart dans l’approximation linéaire. Comme
méthode de la dichotomie : on choisit un intervalle, on la fonction f (x) n’est pas a priori linéaire, il faut recom-
prend le milieu, on regarde s’il est plus bas que les bords, mencer l’opération jusqu’à convergence.
etc. En fait, il suffit, dans un espace unidimensionnel, de C’est souvent efficace et c’est extrêmement simple à
prendre deux points : a et b. Mettons que f (a) < f (b), mettre en œuvre (à condition de pouvoir calculer les
alors on cherchera un point c symétrique de b par rap- dérivées secondes qui composent la matrice hessienne),
port à a : on va dans le sens où ça décroı̂t et cela s’ap- mais il faut être conscient qu’on ne se donne, alors, pas
pelle une réflexion. Si f (c) < f (a) c’est sans doute qu’on tous les moyens pour réussir. En effet, la méthode de
pouvait aller plus loin : on double alors le déplacement Newton recherche les zéros d’un ensemble de fonctions
dans le même sens (dilatation) ; sinon, c’est qu’on est allé complètement indépendantes, alors que les dérivées d’une
trop loin, alors on divise le déplacement par deux (con- fonction ne le sont pas. En outre, la matrice Hessienne
traction). Puis on recommence l’opération jusqu’à ce que n’est pas toujours disponible aisément.
l’intervalle entre les deux derniers points soit plus petit
que la précision voulue.
4.7.3 Recherche à une dimension : inter-
4.7.1.2 À N dimensions. polation parabolique.
Le principe est le même : si l’on est dans un espace à N Admettons que l’on connaisse trois points x = a, b et c
dimension, on part de N + 1 points de l’espace : la figure avec a < c < b d’une part, et f (c) < f (a) et f (c) < f (b)
obtenue s’appelle un simplex, par exemple, si N = 2, c’est de l’autre. La deuxième condition impose qu’il doit y avoir
un triangle. On remplace alors le point du simplex qui un minimum au moins dans l’intervalle [a, b].
donne la valeur la plus élevée de la fonction par un autre
obtenu en faisant une réflexion par rapport au centre de f(b)
gravité du simplex, puis des dilatations ou des contractions
à la demande. Ainsi, le simplex se déplace en se déformant,
telle une amibe, en cherchant toujours à se concentrer sur
point le plus bas. Quand il devient assez petit, le problème f(a)
est résolu. f(c)
La méthode du simplex a le mérite de ne nécessiter au-
cun calcul de dérivée et d’être simple à mettre en œuvre.
Autant dire, cependant, qu’elle est assez inefficace : elle est
à réserver aux problèmes pas trop lourds numériquement
pour lesquels on n’a pas de raison de faire d’effort partic-
ulier.
puis on recommence avec une procédure similaire à celle Mettons que l’on démarre la recherche d’un point x0
de la dichotomie : si x ∈]a, c[ on prend les points a, x avec une direction de recherche r0 , l’on écrira donc :
et c, sinon, on prend c, x et b et l’on calcule par la
même méthode une nouvelle estimation x′ et ainsi de suite x 1 = x 0 + α 0 r0
jusqu’à obtenir la précision voulue. Il reste cependant la
il faut chercher α0 tel que f soit minimum sur la direction
question de savoir si le minimum de la parabole est bien
r0 , or en développant (4.17) et en écrivant la dérivée par
un minimum et non un maximum ! On peut vérifier si par
rapport à α0 , on doit chercher α0 tel que :
exemple, f (x) est bien inférieur à f (c) ; s’il ne l’est pas on
peut prendre par exemple le point milieu de c et de x. α 0 r0 · H · r0 + x 0 · H · r0 + g · r0 = 0
4.7.4 Méthode du gradient conjugué. où l’on a tenu compte du fait que H est une matrice
symétrique 18 , ce qui donne une expression de α0 :
Soit de nouveau une fonction f (x) où x est un vecteur
dans un espace de dimension quelconque n. On cherche le r0 · r0
α0 = −
minimum de cette fonction. r0 · H · r0
Une première idée qui pourrait venir à l’esprit serait de Si l’on répète la même séquence, la nouvelle direction de
suivre la ligne de plus grande pente (steepest descent) : on recherche r1 doit être orthogonale à r0 parce que justement
suit une droite parallèle au gradient local de la fonction : nous sommes déjà sur un minimum de la fonction dans la
~
grad(f ) direction r0 , donc :
δx = −α (4.15)
~
kgrad(f )k r1 · r0 = 0
où α est un scalaire obtenu par exemple par la méthode ce que l’on vérifie facilement par le calcul.
du paragraphe 4.7.3. À deux dimensions, l’on obtient donc les zizags de la
figure 4.18 et avec un plus grand nombre de dimensions,
ça doit être, a priori, pire. . . On remarque cependant que
si les courbes de niveaux de la figure 4.18 avaient été des
cercles, la convergence aurait été obtenue en un pas, à
condition de choisir une direction de recherche parallèle
au gradient !
Il serait donc habile de tenter de faire entrer en ligne
de compte la géométrie des courbes de niveaux et d’intro-
Figure 4.18 – La ≪ ligne de plus grande pente ≫ dans duire non pas le produit scalaire ordinaire x · y, qui est
une vallée étroite. Il faut un grand nombre de pas pour bien adapté à une symétrie sphérique, mais le H-produit
atteindre le fond de la vallée. scalaire adapté à la géométrie de H :
mêmes défauts. Ainsi, il s’agit toujours d’une recherche Choisissons alors, par exemple, λ pour que :
locale d’un minimum d’une fonction assimilée à une fonc- ∂f ∂g
tion quadratique qui ne possède qu’un seul minimum. La +λ =0
≪ vraie ≫ fonction n’est en général pas quadratique et si
∂xn ∂xn
elle possède plusieurs minima, on en trouvera au mieux alors les n − 1 variables x1 , . . . , xn−1 sont indépendantes.
un, sans savoir s’il n’y en a pas un nettement plus profond La relation (4.19) est donc vraie pour tout jeu de variables
juste à côté ! La méfiance et la circonspection sont les deux x1 , . . . , xn−1 , en particulier, si
mamelles du calcul numérique. . . dxi = 0, ∀i 6= k
On verra toutefois, dans le chapitre 4.11, des façons
d’éviter ces défauts lorsque le paysage du potentiel est ce qui donne puisque dxk 6= 0 :
compliqué et que le nombre de paramètres est élevé. ∂f ∂g
+λ =0
∂xk ∂xk
4.7.5 Minimisation avec contrainte : les une relation vraie pour tout k, puisqu’il a été choisi arbi-
multiplicateurs de Lagrange. trairement. C’est aussi vrai pour k = n puisqu’on a choisi
Imaginons que l’on doive chercher comme auparavent λ ainsi : on retrouve ainsi la symétrie un instant perdue. . .
un minimum d’une fonction de n variables : Le résultat de tout ceci est que si l’on définit la fonction :
Q = f (x) + λg(x)
min(f (x))
le problème revient à chercher le minimum de Q avec
mais que les variables représentées par x ne soient pas la contrainte (4.18), mais ce qui est nouveau par rap-
indépendantes mais reliées par une relation : port au problème précédent, c’est que les n variables sont
indépendantes et que l’on peut utiliser les méthodes clas-
g(x) = 0 (4.18) siques.
Prenons, par exemple, un système de pendules couplés
c’est ce que l’on appelle une contrainte. Imaginons par dont l’énergie potentielle s’écrit :
exemple que l’on cherche la configuration d’équilibre d’un X 1 X 2
ensemble d’atomes mais que deux atomes donnés soient V =− mi gℓi cos θi + Cij (θi − θj )
liés par une liaison très rigide, covalente par exemple, et i
2 i,j>i
que la distance entre ces deux atomes soit connue. On a
avec des notations standards. Admettons que l’on cherche
ainsi un système de n − 1 variables indépendantes et l’on
l’équilibre d’un tel système (en dehors évidemment de la
pourrait reécrire l’équation (4.18) :
solution triviale : certains angles peuvent être supérieurs
xn = g̃(x1 , . . . , xn−1 ) à π) avec la contrainte que la somme des angles soit nulle
(mettons qu’un système d’engrenages plus ou moins com-
et l’on rechercherait le minimum d’une fonction à n − 1 plexe impose cela) :
variables : X
θi = 0
i
min(f (x1 , . . . , xn−1 , g̃(x1 , . . . , xn−1 )))
L’on écrira donc :
Outre le fait que la recherche de la fonction g̃ n’est pas X
toujours facile, cette méthode est discutable en ce sens que Q=V +λ θi
i
l’on a choisi d’éliminer la variable xn , mais pourquoi pas
plutôt xn−1 ou xi ? Dans certains cas le choix est évident, et en exprimant les dérivées :
dans d’autres non. ∂Q
Si l’on est à un extremum de f , alors pour tout ensemble =0
∂xk
de variations infinitésimales des xi on doit avoir :
on obtient :
Xn
∂f X
dxi = 0 λ = −mk gℓk sin θk − Ckk′ (θk − θk′ ), ∀k
i=1
∂x i k′ 6=k
i=1
20. Lissage.
21. Ajustement de courbe.
22. Ajustement de moindre carré. 23. √1 .
σ 2π
Physique numérique, Philippe Depondt 67
soit minimum. Il faut donc que les dérivées de χ2 par rap- c’est l’écart entre théorie et expérience pour le point i. Si
port aux deux paramètres soient nulles : l’on estime que cet écart est entièrement dû au paramètre
n
n˚1, on obtient
∂χ2 X
= 2xi (axi + b − yi ) = 0
∂a ∂ei ∂f (xi , {pj })
i=1 ei = δp1 = δp1
Xn ∂p1 ∂p1
∂χ2
∂b = 2 (axi + b − yi ) = 0
i=1 une majoration de l’incertitude δp1 sur le premier
paramètre, or
Quelques lignes de calculs sans difficulté donnent :
n
X n
X 2
X n Xn Xn ∂f (xi , {pj }
χ2 = e2i = )δp1
n x y
i i − x i yi ∂p1
i=1 i=1
i=1 i=1 i=1
a = !2
X n Xn et en généralisant ceci à tous les paramètres pj :
2
n xi − xi
v
i=1 i=1 u
n
X Xn Xn Xn u χ2
δpj = u n
x2i yi − x i yi xi u X ∂f (xi , {pj })
t
b = i=1 i=1 i=1
!2i=1
∂pj
Xn X n i=1
n 2
xi − xi
C’est ce que l’on appelle ≪ déviations standards es-
i=1 i=1
timées ≫ (estimated standard deviations ou esd ) et ce
Lire dans un fichier les n valeurs de x et de y et faire ce sont des estimations de majorants aux incertitudes sur les
calcul pour obtenir l’équation de la droite est extrêmement paramètres.
simple (c’est d’ailleurs un petit exercice de programmation Dans le cas d’une fonction linéaire, évidemment, ces for-
conseillé 24 ) : on comprend que les éditeurs de logiciels ne mules se simplifient aisément, mais elles s’appliquent 25
se privent pas de l’inclure dans leurs productions. aux autres cas aussi.
ei = f (xi , {pj }) − yi Ces méthodes qui ont le grand mérite d’être simples et
faciles à programmer ne sont pas limitées strictement aux
24. Il est prudent de travailler en double précision à cause des
dénominateurs. 25. On n’ose parler de validité !
68 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
fonctions linéaires. Reprenons l’exemple de la loi d’Arrhe- 4.8.3 Ajustement d’un polynôme.
nius :
∆E On peut généraliser facilement les équations du para-
P = P0 e− kT
graphe 4.8.2.1 au cas d’un polynôme de degré p :
Si l’on fait les changements de variable : p
X
2 p
1 P (x) = c 0 + c 1 x + c 2 x + . . . + c p x = cj xj
y = ln P x = − j=0
kT
on obtient On cherche, bien sûr, les p + 1 coefficients cj , et donc,
y = ∆E x + ln P0 !2
X p
k
où ∆E et ln P0 tiennent le rôle de a et b dans le problème c k x i − yi
∂χ 2
∂ X n
précédent. Ainsi, si l’on peut exprimer le problème de la k=0
= 2 =0
façon suivante : ∂c j ∂c j σ i
i=1
g(y) = a h(x) + b
où g et h sont des fonctions connues sans paramètre
ajustable (ici, k est la constante de Boltzmann, connue), Il est aisé de se rendre compte que si l’on pose :
tout ce qui est ci-dessus est utilisable sans difficulté. Xn
xj+k
i
Ajk = 2
i=1
σ i
4.8.2.5 Un caveat. n
X yi x j
Bj =
2
i
i=1
σ i
et : s
χ2
δck =
Akk
Les généralisations du type :
¯ + µ sin 2π t
ṁ = ṁ
τ
Évidemment, c’est plus difficile parce qu’il ne s’agit plus
d’un polynôme et il faudra recourir aux méthodes du para-
¯
graphe 4.8.6, mais c’est peut-être plus réaliste, puisque ṁ
devient alors la vitesse moyenne d’évaporation et µ l’am-
plitude des variations périodiques. On peut même aller un
peu plus loin en remarquant que ṁ est sans doute propor-
tionnel à la pression laquelle obéit probablement à une loi
d’Arrhenius en fonction de la température. . .
à condition de rester proche de xi . Le χ2 devient local car on remplacera les xi par les valeurs lissées Li0 . À la
autour du point xi : suite de calculs sans difficulté, on obtient, toujours par les
mêmes méthodes :
+q
X 2 q
X
χ2i = (c1i xk+i + c0i − yi+k )
J 4 yi + (J4 − J2 k 2 )(yi+k + yi−k )
k=−q
k=1
Li0 = c0i = (4.20)
où q détermine la largeur de l’intervalle autour de xi où ce J0 J4 − J22
calcul est fait. Le coefficient c1i est donc la dérivée locale
recherchée : un calcul sans difficulté donne : où
q
X
3
+q
X Jℓ = jℓ
c1i = k yi+k j=−q
δx q(q + 1)(2q + 1)
k=−q
soit :
26 q(q + 1)(2q + 1)
dans le cas où xi = x0 + iδx . Évidemment, le résultat J0 = 2q + 1, J2 = ,
que l’on trouve dépend de q : si l’on choisit une valeur 3
de q petite, le résultat risque d’être sensible au bruit, en q(q + 1)(2q + 1)(3q 2 + 3q − 1)
revanche, si q est trop grand, on perdra les fluctuations J4 =
15
rapides (voir la figure 4.20). Il faut choisir autant que pos-
sible qδx < ∆x l’ordre de grandeur des variations que l’on (les Jℓ pour ℓ impair sont bien sûr tous nuls) et
cherche à détecter.
Exercice : essayer de calculer ṁ(t) à partir des données q(q + 1)(2q + 1)2 (4q 2 + 4q − 3)
J0 J4 − J22 =
de mesure. On constatera qu’il faut choisir un intervalle 45
de mesure sensiblement plus court que la durée des vari-
C’est encore extrêmement facile à programmer et rapide
ations quotidiennes de la température : l’idéal étant un
à l’exécution. Il faut cependant réaliser que 1˚ le résultat
enregistrement toutes les heures par exemple.
dépend de q et 2˚ il ne s’agit en fait que d’une moyenne
pondérée de points voisins. Il y a ici une hypothèse
4.8.5 Lissage : a dirty trick ! sous-jacente très importante : c’est que les variations
Il arrive que les informations intéressantes d’une intéressantes sont de longueur d’onde ou de dimension car-
expérience soient difficilement visibles sur la courbe actéristique grande par rapport aux fluctuations dues au
expérimentale obtenue à cause du bruit. La plupart des bruit et donc à l’intervalle balayé dans l’équation (4.20).
logiciels d’acquisition offrent des options de smoothing ou C’est pour cela qu’il vaut généralement mieux, sauf pour
lissage visant à réduire le bruit. Il s’agit d’ajuster locale- des raisons cosmétiques ne pas faire de lissage, et, au
≪ ≫
ment un polynôme comme précédemment, par exemple un contraire, ajuster une fonction physiquement justifiée aux
polynôme d’ordre 2 : résultats non lissés : si l’information intéressante est là et si
le modèle choisi est susceptible de la révéler, l’ajustement
P+q 2 q(q+1)(2q+1)
26. Il faut se rappeler au passage que −q
k = 3
. devrait la faire apparaı̂tre.
70 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
fait le premier pic était dû à des imperfections du dispositif Il suffit d’ajouter une deuxième lorentzienne :
expérimental et que l’information physique résidait dans f(x) = l1/(1+((x-x1)/g1)**2)+l2/(1+((x-x2)/g2)**2)
le deuxième. x1 = 940 ; x2 = 950 ; l = 1000
fit f(x) ’lorentz.out’ u 1:2:(1) via l1, l2, x1,
x2, g1, g2
Comme beaucoup d’autres programmes, le logiciel de tracé
de courbe gnuplot comporte une fonction fit qui permet de et l’on obtient :
2500
faire toutes sortes d’ajustements de fonctions à des données f(x)
’lo2’
50
2000
40
30
1500
20
10
1000
-10
500
-20
0 -30
900 920 940 960 980 1000
-40
On observe une petite ≪ bosse ≫. . . qu’à cela ne tienne ! Voir 900 920 940 960 980 1000
la table 4.2.
Table 4.1 – Fit avec gnuplot Table 4.2 – Fit avec gnuplot (suite de la table 4.1).
Cette anecdote n’a rien d’exceptionnel : pratiquement 4.9.1 Un exemple : les lignes de champ.
tout expérimentateur en a d’autres du même style à racon-
Admettons que l’on puisse calculer en chaque point ~r le
ter, ce genre d’aventure fait partie du métier ! ~ r) dû à une distribution de charges et
champ électrique E(~
que l’on en veuille tracer les lignes de champ. Une ligne
de champ est définie par le fait qu’elle est en chaque point
parallèle au champ :
4.9 Systèmes d’équations diffé-
~ r)
d~s // E(~
rentielles ordinaires.
où le vecteur d~s est le vecteur élémentaire tangeant au
Les physiciens sont extrêmement prolifiques lorsqu’il point ~r à la ligne de champ (figure 4.22) et s est l’abscisse
s’agit de produire, à partir de problèmes divers, des curviligne sur la ligne de champ.
équations différentielles ordinaires (par exemple, les Si les coordonnées de d~s sont (dx, dy, dz), on obtient
équations du mouvement de la mécanique newtonienne). évidemment en chaque point ~r :
Malheureusement, l’inspiration manque parfois lorsqu’il dx dy dz ds
s’agit de les résoudre, en particulier quand elles ne sont = = =
Ex Ey Ez E
pas linéaires : un petit programme de résolution numérique
peut alors s’avérer précieux. ~ et E = kEk.
où, bien sûr, ds = kdsk ~ On aboutit alors
72 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
(4)
y(x) première estimation de la dérivée
(2) (3)
deuxième estimation
(1)
y(x+dx) (3)
(2)
moyenne des 2 dérivées
x x+dx
4.9.6 Équations d’ordre supérieur à 1. Les vitesses sont évaluées au demi-pas, alors que les posi-
tions et les forces sont évaluées au pas entier, ce qui sup-
Pour le moment, on s’en est tenu à des systèmes prime la dissymétrie qui était génante dans la méthode
d’équations d’ordre un : en fait, c’est beaucoup moins re- d’Euler.
strictif que cela en a l’air. Soit par exemple, une équation Cette méthode est fort utilisée sous des formes di-
du deuxième ordre : verses dès que l’on s’intéresse à la dynamique de systèmes
d2 y dy comportant un grand nombre de particules (de quelques
2
+a =f dizaines à quelques dizaines de milliers. . .).
dx dx
où a peut être une constante ou une fonction de y. Si l’on
introduit une variable supplémentaire z qui est la dérivée
4.9.8 Le problème du pas d’intégration.
première de y, on obtient : Dans tout ces problèmes d’équations différentielles, on
l’a vu, le pas d’intégration est non-nul, il est petit, certes,
dy
=z mais il n’est pas nul. ≪ Il n’y a qu’à ≫ le choisir as-
dx sez petit. . . Ce n’est, hélas, pas toujours aussi simple :
dz = f − az
si on le choisit trop petit, on multiplie le nombre des
dx
itérations, ce qui allonge inutilement la durée du calcul,
deux équations différentielles du premier ordre. On peut mais aussi multiplie les erreurs d’arrondi ; trop diminuer
donc toujours décomposer des équations différentielles le pas d’intégration diminue la précision du calcul, on perd
d’ordre supérieur à un en plusieurs équations d’ordre un à sur tous les tableaux ! Un compromis s’impose alors, mais
condition d’introduire des variables supplémentaires qui selon quel critère ?
sont les dérivées successives des fonctions. Ainsi, trois Il appartient à chacun de se poser cette question et de
équations du deuxième ordre se transforment aisément en tenter d’y répondre par une étude a priori du problème.
six équations du premier ordre, une équation du troisième Par exemple, s’il s’agit d’un système mécanique isolé non-
ordre devient trois du premier ordre, etc. dissipatif, la somme de l’énergie potentielle et de l’énergie
cinétique doit rester constante au cours du calcul, c’est la
4.9.7 Méthode de Verlet. physique qui le dit ! La périodicité attendue du problème
de Volterra-Lotka est aussi un bon critère, la conserva-
Les systèmes d’équations différentielles du deuxième or- tion de la norme de la fonction d’onde pour l’équation de
dre sont d’un intérêt particulier en physique puisque les Schrödinger également. Bien souvent, on peut résoudre le
équations du mouvement d’un ensemble de n mobiles en système d’équations différentielles dans un cas proche de
interaction s’écrivent : celui qui nous intéresse mais dont on connait la solution
d2~rℓ d~
r analytique (un système linéaire, par exemple) et vérifier
= ~ℓ ({~rp , p }), ∀ℓ ∈ [1, n]
f que le calcul numérique donne bien le même résultat, ou
dt2 dt
un résultat très proche du calcul analytique.
Cela se résout sans difficulté majeure par la méthode Ces questions ne sont pas à négliger : revenons à
de Runge-Kutta, voire par Cranck-Nicholson, puisque l’équation logistique du premier TP Si on la considère
cela donne 3n équations du deuxième ordre et donc 6n comme une équation différentielle, implicitement, puisque
équations du premier ordre. la population d’insecte de la génération n + 1 est calculée
Si l’on se restreint à des interactions de paire, les forces un an après celle de la génération n, le pas d’intégration
s’écrivent : est de un an. On pourrait imaginer d’intégrer analytique-
Xn
f~ℓ = f~ℓℓ′ ment cette équation et considérant le temps comme une
ℓ′ =1,ℓ′ 6=ℓ
variable continue et donc un pas d’intégration qui tend
vers zéro :
soit, en tenant compte du principe de l’action et de la
réaction 28 , n(n−1)
2 forces à calculer. Si l’on est en train x(t + dt) = r x(t) (1 − x(t)) dt
de s’intéresser à un système composé d’un grand nombre
d’atomes, ou à une galaxie comportant beaucoup d’étoiles, soit :
cela fait vite un nombre prodigieux de forces à calculer et dx x(t + dt) − x(t)
= = x (r(1 − x) − 1)
l’expérience prouve que le programme va passer 99% du dt dt
temps dans le sous-programme de calcul des forces ; il est
Il s’agit d’une équation différentielle qui se résoud analy-
vital d’optimiser ces calculs là. Or, ce n’est sans doute pas
tiquement à la main avec un peu de travail 30 , ou alors
une très bonne idée, dans ce cas là, d’utiliser un algorithme
grâce à un logiciel de calcul formel, et l’on obtient :
comme Runge-Kutta 29 qui exige quatre estimations des
forces par pas de calcul ! (r − 1)x0
x(t) =
L’algorithme de Verlet est une réponse très simple à ce rx0 + (r(1 − x0 ) − 1) e−(r−1)t
problème :
où x0 = x(t = 0). Pour r > 1, cette expression con-
dt dt fℓ ({~rℓ′ (t)}) verge exponentiellement vers son point fixe : plus de chaos !
~vℓ (t + ) = vℓ (t − ) + dt
2 2 mℓ On obtient donc un énorme changement qualitatif (figure
~r (t + dt) = ~r (t) + ~v (t + )dt dt 4.28) 31 .
ℓ ℓ ℓ
2 30. On peut faire le changement de variable x(t) = a
où a,
b+cy(t)
28. f~ℓ′ ℓ = −f~ℓℓ′ . b et c sont des coefficients à déterminer et y(t) la nouvelle variable.
29. sans parler de Cranck-Nicholson. . . 31. Voir H. Krivine, J. Treiner, A. Lesne, soumis Am. J. Phys.
76 Licence de physique L3: PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
1
dt=1
continu
où x+ et v + sont les inconnues. On a donc deux fonction
0.9
dont on doit chercher le zéro par une méthode de Newton :
0.8
0.7 v + v+
0.6 f (x+ , v + ) = x − x+ + δt
2
0.5
sin x + sin x+
x
0.4 g(x+ , v + ) = v − v+ − δt
2
0.3
1
Ces considérations ne se limitent bien sûr pas à l’op-
0.8 tique : un instrument de musique capable de ≪ tenir ≫ une
0.6 note, comme un orgue, un violon ou une trompette, pro-
0.4 duira un son dont la hauteur ou la fréquence est bien
0.2 définie, alors que pour une percussion, timbale ou tam-
0
bour, dont le son est très court dans le temps, la hauteur de
la note est beaucoup moins facile à définir (même s’il existe
−0.2
des timbales de hauteurs différentes). De même, dans le do-
−0.4
maine des communications, en général, on utilise une onde
−0.6 porteuse d’une certaine fréquence : il faut que la durée
−0.8 des impulsions qui codent l’information soit relativement
−1 longue par rapport à la période de la porteuse afin d’éviter
0 2 4 6 8 10
frequences un élargissement trop grand du spectre de fréquence ce qui
1 se traduit généralement par une dégradation de la qualité
0.9 de la transmission.
0.8
0.7
4.10.1.2 Quelques propriétés importantes.
0.6 4.10.1.2.1 Notations. La notation utilisée jusqu’ici
0.5 prend la convention temps-fréquence, or on pourrait tout
0.4 aussi bien éviter le facteur 2π grâce à la pulsation ω =
0.3
2πν : Z ∞
0.2 F (ω) = f (t) eiωt dt
−∞
0.1
et Z ∞
0 1
0 2 4 6 8 10 f (t) = F (ω) e−iωt dω
frequences 2π −∞
13 Z ∞
le commerce), la largeur spectrale est de l’ordre de 10 Hz
ce qui n’est plus du tout négligeable comme le montrera ϕ(u) = f (x) eiux dx
le cours d’optique. −∞
ν1 0.4
ν2 0.35
0.3
0.25
0.2
0.15
A
0.1
0.05
0
−2 −1 0 1 2 3 4
Figure 4.31 – Au point A, on reçoit une superposition de
lumière de deux fréquences différentes ν1 et ν2 parce que Figure 4.32 – Gaussienne pour C = 1, x0 = 1 et σ = 0.5.
le faisceau incident n’est pas parfaitement fin. En fait, on
reçoit aussi toutes les fréquences intermédiaires ce qui fait
où x0 est l’emplacement du sommet et σ sa variance.
que le résultat est la superposition de toutes ces contribu-
C’est une courbe (figure 4.32) qui ressemble beaucoup à
tions comme dans l’équation (4.26).
la lorentzienne si ce n’est que les ≪ pieds ≫ en sont moins
large à cause de l’exponentielle qui décroı̂t plus vite que
d’appareil comme on l’a vu, mais aussi par exemple la fraction rationnelle. Si l’on en calcule la transformée de
lorsqu’un système répond avec retard à une sollicitation et Fourier dans le cas le plus simple (x0 = 0, σ = 1), l’on
que son état est le produit de convolution de la sollicitation obtient :
aux instants précédents par une ≪ fonction mémoire ≫. Z ∞ Z ∞
1 x2 1 x2
Le produit de convolution d’une fonction f par une fonc- ϕ(u) = √ e− 2 eiux dx = √ e− 2 cos ux dx
−∞ 2π π −∞
tion g se note par un astérisque :
Z ∞ parce que le sinus de la partie imaginaire de l’exponentielle
est impair et donc l’intégrale correspondante nulle. En sup-
f ∗g = f (x′ ) g(x − x′ ) dx′
−∞ posant que tous les théorèmes de convergence souhaitables
s’appliquent ici, une dérivation par rapport à u sous le
et c’est une fonction de x. Par un changement de variable, signe intégral donne :
il est facile de montrer que : Z ∞
1 x2
ϕ′ (u) = − √ x e− 2 sin ux dx
g∗f =f ∗g 2π −∞
Si l’on calcule la transformée de Fourier du produit de En intégrant cette expression par parties (par rapport à
convolution f ∗ g, on obtient : x), on a :
Z ∞ Z ∞Z ∞ h i∞ Z ∞
1 x2 x2
′
[f ∗ g](x′ ) eiux dx′ =
′
f (x)g(x′ − x) eiux dxdx′ ϕ′ (u) = √ e− 2 sin ux −u e− 2 cos ux dx
2π −∞ −∞
−∞ −∞ −∞
Z ∞Z ∞
soit :
= f (x)g(X) eiu(X+x) dxdX
−∞ −∞
ϕ′ (u) = −uϕ(u)
Z ∞ Z ∞
une équation différentielle qui donne :
= f (x) eiux dx g(X) eiuX dX
−∞ −∞ u2
ϕ(u) = K e− 2
séries du même nom est de pouvoir traiter des fonctions p(t) = p0 e− 2δt2 − e− 2δt2
qui ne sont pas périodiques. Bien sûr, tout ce qui est
Il s’agit de calculer maintenant la dépendance en
détonation, percussion, etc., entre dans ce cas.
fréquence car l’oreille humaine perçoit la hauteur des sons,
Ainsi, un objet qui se déplace dans l’air avec une vitesse
autrement dit leur fréquence : il s’agit donc de faire une
supersonique (un avion, par exemple) produit le fameux
transformée de Fourier en utilisant les relations ci-dessus.
double ≪ bang ≫ : il s’agit de la succession de deux on-
L’équation (4.28) permet d’écrire de façon générale,
des de choc que l’on peut être tenté de modéliser de façon
simple. Il suffit de se rappeler les vagues d’étrave d’un Z ∞ Z ∞ r
t−t 2
−( τ 0 ) iωt iωt0
2
−( τt ) iωt iωt0 π − ω2 τ 2
bateau (qui lui aussi se déplace plus vite que les ondes -les e e dt = e e e dt = e 2
e 4
−∞ −∞ τ
vagues- qu’il produit : les bateaux sont pratiquement tou-
jours supersoniques !) pour considérer que l’objet traı̂nera et, donc, la transformée de Fourier de p(t) s’écrit facile-
avec lui une onde de surpression initiée à l’avant et une ment 41 :
onde de dépression initiée à l’arrière (figure 4.33). L’audi- Z ∞
(t−t )2 (t−t )2
teur, immobile au sol, percevra la première à l’instant t1 p̃(ω) = p0 e − 2δt1
−e − 2δt2
eiωt dt
et la seconde à l’instant t2 avec −∞
L r r
∆t = t2 − t1 = iωt1 π − ω2 2δt2 iωt2 π − ω2 2δt2
v = p0 e e 4 −e e 4
2δt2 2δt2
où L est la longueur de l’avion et v sa vitesse. r
π iωt1 − ω2 δt2
La durée de chacune de ces impulsions peut s’évaluer = p0 e e 2 1 − e−iω∆t
approximativement comme : δt2
La densité spectrale correspondante s’écrit :
ℓ
δt = π −ω2 δt2
v I(ω) = p̃(ω)p̃∗ (ω) = p20 e (1 − cos ω∆t) (4.29)
40. Un peu loin de la physique, les calculs boursiers se basent en δt2
général sur des distributions ≪ normales ≫ ou gaussiennes des fluc-
La figure 4.34 montre l’allure de cette courbe. L’en-
tuations des cours, tout simplement parce que là s’appliquent des
théories d’intégration bien établies. . . alors qu’on sait très bien que veloppe gaussienne a une largeur en fréquence ∆ω =
dans bien des cas les cours de la bourse ne suivent pas des distri- 1 1
√ , soit en fréquence ∆ν = √ . La pulsation
butions de fluctuations gaussiennes : c’est un peu l’histoire du type 2δt 2π 2δt
qui cherche ses clefs sous le réverbère parce qu’au moins là, il voit
quelque chose ! 41. C’est le gros avantage des gaussiennes !
Physique numérique, Philippe Depondt 83
2
analyse en transformée de Fourier d’un phénomène somme
ν0
toute assez compliqué.
1.5
où k 2 = kx2 + ky2 + kz2 . Si on choisit Ṽ tel que : où fℓ = f (xℓ ) et Fk = ϕ(uk ). À l’utilisateur de faire les
adaptations nécessaires !
ρ̃(kx , ky , kz ) L’expression (4.30) est celle de la transformée de
Ṽ (kx , ky , kz ) =
ε0 k 2 Fourier discrète ou Discrete Fourier Transform ou encore
DFT. La transformée de Fourier discrète inverse s’écrit
alors la relation de Poisson est vérifiée. évidemment :
Cette méthode est donc de calculer la transformée de n−1
X 2πikℓ
Fourier de ρ(x, y, z) puis la transformée de Fourier in- fℓ = Fk e − n
ρ̃(kx , ky , kz ) k=0
verse de pour obtenir V (x, y, z). Le calcul du
k2
~
champ E(x, y, z) est aisé, car on obtient facilement que : 4.10.2.1 Conséquences.
~ V
~ = −grad L’approximation ci-dessus n’est pas anodine : il faut
E
donc faire un peu attention lorsqu’on utilise ces outils,
donne en transformée de Fourier : pourtant extrêmement courants et indéniablement très
utiles.
Ẽx (kx , ky , kz ) = ikx Ṽ (kx , ky , kz )
Ẽy (kx , ky , kz ) = iky Ṽ (kx , ky , kz ) 4.10.2.1.1 Périodicité. La première remarque que
l’on puisse faire est que l’on remplace en fait une trans-
Ẽz (kx , ky , kz ) = ikz Ṽ (kx , ky , kz ) formée de Fourier par une série de Fourier : autrement
dit, on postule que la fonction considérée est périodique.
ce qui est évidemment très aisé à calculer.
On risque bien sûr de rencontrer quelques difficultés 1
quand k = 0, mais il suffit de noter que : 0.9
ZZZ 0.8
Ṽ (k = 0) = V (x, y, z) dx dy dz 0.7
0.6
pour voir que le choix de la valeur de Ṽ (k = 0) n’est qu’un 0.5
choix de la constante arbitraire du potentiel : Ṽ (k = 0) = 0.4
0 peut être une bonne option.
0.3
La méthode peut paraı̂tre assez lourde, mais en fait, la
0.2
grande rapidité des transformées de Fourier numériques
0.1
permet de résoudre ainsi bien des problèmes qui n’au-
raient pas de solution sinon. Il faut cependant maintenant 0
0 1 2 3 4 5 6 7 8 9
se préoccuper de ce que font réellement les transformées
de Fourier numériques proposées dans les bibliothèques de Figure 4.35 – Une gaussienne ≪ périodique ≫ et mal
calcul car il s’agit bien sûr d’approximations et cela peut coupée !
avoir des conséquences, parfois imprévues.
En principe, ce n’est pas bien grave parce qu’on peut
4.10.2 La transformée de Fourier discrète. choisir une très grande période, ≪ infinie ≫ en pratique
par rapport aux dimensions ce que l’on veut étudier :
Il existe des méthodes numériques très efficaces pour c’est d’ailleurs généralement ce que l’on fait. Toutefois,
calculer des transformées de Fourier ; elle reposent toutes il y a parfois des choix maladroits : par exemple, si l’on
cependant sur une même approximation : veut calculer la transformée de Fourier d’une gaussienne
Z n−1
centrée en zéro, on sait que la partie imaginaire doit être
∞ X
f (x) eiux dx ∼ f (xℓ ) eiuxℓ δx nulle puisque la gaussienne est paire ; or, si par malheur,
−∞ ℓ=0
on a choisit pour faire le calcul, l’intervalle [0, X], X > 0
et grand par rapport à la variance, on est en train de
avec : couper en deux la gaussienne à son maximum en x = 0 et
xℓ = xmin + ℓ δx à l’autre extrémité de l’intervalle, la valeur de la gaussi-
et enne sera presque nulle (figure 4.35). Mais, en x = X,
xmax − xmin subitement à cause de la périodicité, la fonction retrouvera
δx =
n une valeur non négligeable : une variation rapide qui don-
ainsi, x0 = xmin et xn−1 = xmax − δx , on est dans la nera des contributions de haute fréquence. De plus, notre
même situation que celle de l’intégration par la méthode fonction n’est plus paire : la partie imaginaire n’a plus de
des rectangles. raison d’être nulle ! Un intervalle [−X, X] serait plus judi-
On remplace donc l’intégrale de −∞ à ∞ par une série cieux. . . On peut certes tenter d’être habile, mais alors, il
discrète sur un échantillonnage de points pris sur un in- faut être sûr de soi : on peut garder l’intervalle [0, X] (et
tervalle borné. donc diviser par deux le nombre de points nécessaires), et
En fait pour des raisons de généralité des programmes, forcer la partie imaginaire à zéro. On perdra alors toutefois
on se borne à calculer la série : une possibilité de détecter des erreurs !
n−1
X
Fk = fℓ e
2πikℓ
n (4.30) 4.10.2.1.2 Pas de calcul. La discrétisation de
ℓ=0
l’équation (4.30) a aussi des conséquences. Pour faire la
Physique numérique, Philippe Depondt 85
correspondance entre l’intégrale et la somme discrète, on 4.10.2.1.3 Une ≪ fausse ≫ symétrie. Calculons le
doit faire l’égalité : terme Fn−k de la DFT, c’est-à-dire le symétrique de Fk
2πikℓ
par rapport au milieu de l’intervalle :
eiuk xℓ = e n
n−1
X n−1
X
2πiℓ(n−k) 2πiℓk
sachant que : Fn−k = fℓ e n = fℓ e2πiℓ e− n
w2kp . Reste à faire un tri pour repérer quels termes fℓ inter- La remarque faite précédemment (§ 4.8.5) selon laque-
viennent dans quelle somme. . . toujours est-il qu’il s’agit lle il vaut mieux faire l’ajustement d’un modèle sur les
d’un processus dont le coût est proportionnel à n ln2 n données bruitées puis étudier les écarts qu’essayer ≪ d’em-
opérations au lieu de n2 . La différence peut être énorme : si bellir ≫ les expériences en enlevant le bruit reste per-
par exemple n = 210 = 1024, ce qui n’a rien d’exeptionnel, tinente. Le filtrage proposé ici est toutefois sans doute
alors n2 = 1 048 576 mais, n ln2 n = 1024 × 10 = 10240 : meilleur que la méthode proposée précédemment car on
un gain d’un facteur 100 ! peut contrôler précisément ce que l’on supprime, bien
Certes, il y a la restriction que n doit être une puissance mieux qu’avant en tous cas. Il faut reconnaı̂tre qu’il est
de deux, et un bon nombre de sous-programmes courants parfois utile, lors de phases intermédiaires, lors du réglage
l’exige, mais, 1o il est bien rare que l’on ne puisse pas en d’une expérience, ou bien avant que l’on sache réellement
tenir compte a priori dans la préparation des données ini- où l’on en est au point de vue modèle, de nettoyer ainsi
tiales et 2o on peut toujours compléter si nécessaire l’in- les données expérimentales afin de déterminer ≪ s’il y a
tervalle avec des zéros ! Il existe des programmes qui, au quelque chose à voir ≫. . . La règle générale est toutefois
lieu de découper l’intervalle en moitiés, commencent par que ces méthodes restent en principe à éviter quand on en
faire une décomposition de n en produit de nombres pre- arrive à l’étape ultime de publication : le minimum est de
miers, puis effectuent les découpages à partir de là : cela le signaler clairement quand on le fait.
permet d’utiliser autre chose que des puissances de deux,
mais il est clair que si n lui-même est un nombre premier,
l’efficacité en sera plus que douteuse. . . 4.11 Les méthodes de Monte-
Carlo.
4.10.3 Filtrage de données expérimen-
tales. On regroupe sous le nom de méthodes de ≪ Monte-
Carlo ≫ (à cause du célèbre casino) les méthodes qui re-
Dans le paragraphe 4.8.5 décrivant une méthode de lis- posent sur des tirages au sort : vaste monde dont nous
sage de données expérimentales, la conclusion était que n’explorerons ici que quelques régions frontalières.
c’était sans doute une méthode assez peu recommend-
able. Une autre approche est de faire un filtre passe-bas
numérique. 4.11.1 Processus stochastiques et chaı̂nes
Il s’agit de supprimer ou, du moins, de réduire le bruit de Markov.
considéré comme un signal non-corrélé d’un point à un On appelle ≪ stochastique ≫ (du grec stokhastês, devin)
autre : autrement dit, il s’agit de retirer ou de réduire un processus dont le résultat est soumis au hasard : quand
une contribution de haute fréquence. Ainsi, une première on lance un dé, on ne peut pas - en principe - prédire le
idée est de faire une transformée de Fourier des données nombre qui en sortira. En revanche, le mouvement d’un
expérimentales, puis fixer les termes de haute fréquence à satellite autour de la terre n’est pas stochastique, puisque,
zéro, puis faire une transformée de Fourier inverse : on aura connaissant sa position et sa vitesse à un instant donné,
donc ainsi purement et simplement supprimé les hautes on peut prédire sa trajectoire dans le futur.
fréquences ! Une chaı̂ne de Markov est une séquence d’événements
1 soumis au hasard comme ci-dessus, mais sans mémoire : le
0.9 dé ne se rappelle pas le nombre sorti lors du jet précédent,
0.8
ce n’est pas parce que j’ai obtenu un six au coup précédent
que je peux dire quoi que ce soit sur le résultat du coup
0.7
suivant (si le dé se rappelait le six et interdisait par ex-
0.6
emple d’obtenir deux fois de suite le même résultat, le
0.5 processus serait stochastique mais non-Markovien).
0.4 En physique, il y a bien sûr des processus imprévisibles
0.3 (les trajectoires individuelles de chaque atome d’un gaz en
0.2 thermodynamique statistique, par exemple) mais on peut
0.1 aussi avoir intérêt à utiliser des méthodes de tirage au sort
0
pour calculer des grandeurs qui n’ont rien d’aléatoire.
0 2 4 6 8 10
γ = 1 que l’on peut utiliser pour faire un filtre passe-bas. Le chapitre ≪ Nombres aléatoires ≫ des Numerical
Recipes (ref. [3]) commence par la remarque (p. 266) :
La méthode, si elle est souvent employée avec succés, ≪ Il peut paraı̂tre pervers d’utiliser un ordinateur, la
peut être considérée comme un peu brutale. Une autre plus précise et la plus déterministe de toutes les ma-
possibilité est alors de multiplier la transformée de Fourier chines conçues par l’esprit humain pour produire des nom-
par un fonction qui vaille 1 à basse fréquence et zéro à bres “aléatoires”. ≫ En effet, mais nous nous garderons
haute. Le choix est au goût de chacun : un bon candidat d’affirmer que la perversité n’a jamais fait reculer un
est cependant 21 (1 − tanh ν−ν γ ) où ν0 est le seuil et γ la mathématicien appliqué. . . Toujours est-il que bien avant
0
l’invention des ordinateurs, au XVIIIe siècle, Georges Un ordinateur produit des séquences de nombres arbi-
Louis Leclerc comte de Buffon, un individu par ailleurs traires dont on espère qu’ils sont non-corrélés au problème
honorablement connu, calcula que, si on lance au hasard que l’on souhaite résoudre. C’est que l’on appelle sou-
une aiguille de longueur ℓ sur un réseau de droites par- vent des ≪ nombres pseudo-aléatoires ≫. Pour illustrer
allèles distantes d’une distance a, la probabilité que l’aigu-
ceci, imaginons qu’un touriste un peu obsessionnel décide
ille rencontre une droite s’écrit : de visiter les musées parisiens par ordre alphabétique :
c’est un ordre parfaitement déterminé, et si l’on recom-
2ℓ mence un peu plus tard, en appliquant la même règle,
p=
aπ l’ordre sera strictement le même 47 . Cependant, si l’on
une méthode probabiliste de détermination expérimentale s’intéresse aux thématiques de ces musées, on tombera sur
du nombre π. En effet, plusieurs tentatives de ce genre une séquence du type : Musée de l’Arc de Triomphe, Musée
eurent lieu au XIXe siècle malgré le caractère quelque peu des Armées, Musées des Arts Africains et Océaniens, etc. :
fastidieux de l’opération consistant à lancer un grand nom- une séquence complètement arbitraire et qui peut être
bre de fois une aiguille et à compter le nombre de fois considérée pratiquement comme. . . aléatoire car les arts
qu’elle recontre une droite 46 . africains et océaniens n’ont pas grand-chose à voir avec
les armées 48 . Bien sûr, l’ordre alphabétique introduit des
4 corrélations parasites : tous les Musées des Arts xxx se
suivent ! Ce sont des choses dont il faudra se méfier aussi
3.8
dans l’usage de générateurs de nombres ≪ aléatoires ≫ des
3.6 ordinateurs.
Comment cela fonctionne-t-il ? Un générateur de nom-
3.4 bres pseudo-aléatoires produit une séquence de nombres
3.2
entiers I1 , I2 , I3 ,. . ., compris entre 0 et m − 1 par la
réccurence :
3
Ij+1 = aIj + b, modulo m
2.8
2.6
où m est un nombre entier ≪ grand ≫ et a et b des entiers
1 10 100 1000 10000 100000 1e+06
positifs appelés ≪ multiplicateur ≫ et ≪ incrément ≫.
A priori, cette séquence se répète puisqu’il n’y a que m
Figure 4.37 – Calcul du nombre π par tirage au sort. valeurs possibles pour les I , ainsi, si l’on a plus que m
j
En abscisse le nombre de tirages en échelle logarithmique. tirages, on doit retomber sur les mêmes nombres : c’est
En ordonnée, les estimations de π correspondantes. Le un système périodique. On note qu’il faut initialiser la
résultat obtenu pour un million de tirages est 3,1428721 séquence avec une ≪ graine ≫ I0 49 . Finalement, si l’on
I
fait le rapport mj on obtiendra une séquence de nombres
Plus simplement encore, on peut remarquer que comme réels dans l’intervalle [0, 1[.
le rapport des surfaces d’un carré de côté a et d’un cercle On a clairement intérêt à choisir m aussi grand que pos-
de rayon a2 vaut π4 , on peut lancer des flèches, cailloux ou sible, soit, compte tenu de la représentation des nombres
tout autre projectile et compter le nombre de fois où le entiers sur quatre octets : m = 231 − 1 = 2 147 483 647.
projectile tombe dans le cercle et le diviser par le nombre Le choix de a et b (par exemple a = 75 = 16 807 et
total de tirs. Cela donne des estimations successives de b = 0) fait l’objet de débats infinis et dépend parfois de
π
4 (figure 4.37). Evidemment, plus les tirs sont nombreux, la machine utilisée. Dans la grande majorité des cas, on a
meilleure est l’estimation. intérêt à se servir du générateur fourni avec l’ordinateur
Même si l’on peut imaginer d’autres méthodes plus que l’on utilise plutôt que de tenter d’écrire quelque chose
économiques pour déterminer π, ces remarques montrent soi-même : il se trouve que le langage fortran fourni une
que l’on peut tenter de résoudre des problèmes qui ne fonction intrinsèque rand() 50 qui en général donne satis-
comportent a priori aucun caractère aléatoire à l’aide faction. Si la variable x est déclarée en real, l’instruction x
de méthodes probabilistes. On notera que pour que les = rand() donnera un nombre pseudo-aléatoire. Si l’on fait
théorèmes probabilistes, comme la limite centrale, puis- plusieurs tirages, on obtiendra une séquence de nombres
sent s’appliquer, il faut un grand nombre de tirages au sort, compris entre 0 et 1 avec une distribution uniforme (figure
comme dans la figure 4.37, et que donc la capacité des or- 4.38). Il existe aussi le sous-programme random number :
dinateurs à répéter de nombreuses fois la même opération call random number(x) remplira le tableau x de nombres
sans se lasser n’est pas à négliger. pseudo-aléatoires.
Le problème de la graine est un peu plus délicat : si
4.11.3 La production de nombres on ne la fixe pas, la séquence de nombre produits par
≪ aléatoires ≫.
rand() sera la même d’un usage à l’autre : si on arrête
l’exécution du programme, l’ordinateur ≪ oublie ≫ où
Mais comment une machine déterministe comme un or- il en était et si l’on relance l’exécution, il repart au
dinateur peut-elle produire des nombres aléatoires ?
47. À condition, évidemment, que la liste des musées n’ait pas
En fait, un ordinateur est incapable de produire des changé entre-temps.
nombres aléatoires et donc il n’en produit pas. . . 48. Sauf, bien sûr, si l’on se rappelle qu’il s’agit de l’ancien Musée
des Colonies, héritage des conquêtes militaires du XIXe siècle.
46. Ainsi, l’expérience faite en 1901 par Lazzerini, en jetant une 49. seed en anglais.
aiguille 3407 fois, donna : π = 3,1415929 (au lieu de 3,14159265). 50. pour random.
88 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
1
0.9 ?
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
60
0 seed=1
0 10 20 30 40 50 60 70 80 90 100 seed=2
50 seed=3
1.03
40
1.02 30
20
1.01
10
0
1
−10
0.99 −20
−30
0.98 0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000
donc, y(x) est la fonction réciproque d’une primitive de se généralise sans difficulté à des intégrales multidimen-
p(y). sionnelles du type :
Par exemple, si l’on voulait p(y) = e−y , alors, y(x) =
− ln x ; ou encore une distribution lorentzienne p(y) = Z b1 Z b2 Z bn
1 1
, cela donne y = tan πx (exercice : le vérifier). ... f (x1 , x2 , . . . , xn ) dxn . . . dx2 dx1
π 1 + y2 a1 a2 an
Malheureusement, ce n’est pas toujours aussi simple.
Si, par exemple, on veut une distribution gaussienne (ou
normale) : Ce type d’intégrale correspond en fait à des domaines
1 y2 d’intégration de géométrie simple (rectangle à deux dimen-
p(y) = √ e− 2 sions, parallélépipède à trois dimensions, etc.) ; on peut
2π
dans une certaine mesure, par des changements de vari-
le calcul de la fonction réciproque de la primitive n’a rien
ables appropriés (coordonnées cylindriques ou sphériques)
d’évident. . . En fait les choses s’arrangent si l’on passe en
adapter l’intégration à d’autres géométries. Il y a toutefois
coordonnées polaires à deux dimensions en pensant à la
des limites.
distribution de Maxwell-Boltzman :
v2
P (v) = v e− 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
également une distribution uniforme comprise entre 0 et
1, on obtient deux nombres aléatoires (vx = v cos ϕ et
vy = v sin ϕ) avec une distribution gaussienne : la figure
4.40 en est une illustration. Un exemple de subroutine
très simple capable de produire de tels nombres est donné
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 Figure 4.41 – Un domaine d’intégration un peu com-
pliqué. . .
0.45
Generated distribution
Normal distribution
0.4
-0.08875
-0.08925
2
+y 2 )
D = {(x, y), tels que 4 tanh(x − y) e−(x > 0.4} -0.0895
-0.08975
(4.31)
-0.09
c’est nettement plus compliqué ! Il suffit toutefois de tirer -0.09025
-0.0905
2 1 -0.09075
0.6 -0.09125
1 0.4 -0.0915
0.2 -0.09175
0.5 0.0 -0.092
0 −0.2
100000 1e+06 1e+07 1e+08
−0.4 n_t
−0.5−0.6
−0.8 Figure 4.44 – Valeurs obtenues pour ID avec le domaine
−1 −1 (4.31) en fonction du nombre de tirages (l’axe des x a une
échelle logarithmique).
−1.5
−2 ≪ significatifs ≫ du résultat ci-dessus ne sont évidemment
−2 −1.5 −1 −0.5 0 0.5 1 1.5 2 pas tous significatifs ! On constate aisément sur la figure
qu’avec tous ces tirages, on en a au plus 3, soit ID ≃
Figure 4.43 – Le domaine d’intégration D défini par −0.0894. . . Peut-on être plus efficace ?
l’équation (4.31) est délimité par la courbe continue
rouge. . .
4.11.5.3 Marche au hasard dans D
au sort des nombres x et y dans l’intervalle [−2, 2], et, si la Dans le calcul précédent, on a tiré au sort des nombres
condition de l’équation (4.31) est vérifiée, additionner la dans un domaine plus grand que le domaine d’intégration
Physique numérique, Philippe Depondt 91
D et on a simplement éliminé tous les tirages qui tombaient 4.11.5.4 Échantillonnage par l’importance (im-
en-dehors de D. On est en droit de se dire que c’est ineffi- portance sampling )
cace et qu’il vaudrait mieux tenter de ne tirer des nombres
Pourrait-on, pour ainsi dire, ≪ guider ≫ le hasard ? Il
que dans le bon domaine : c’est en toute rigueur impossi-
faudrait pouvoir ≪ dire ≫ au hasard quand ça vaut le coup
ble, mais, si, partant d’un point choisi dans D (par exem-
de faire le calcul, car calculer l’intégrale d’une fonction en
ple (0.5, −0.5) dans la figure 4.43), au lieu de tirer d’autres
sommant au hasard partout, y compris là où elle est nulle
nombres de façon indépendante, on se borne à se déplacer
ou presque n’a pas grand intérêt. Autrement dit, il serait
au hasard dans le domaine, soit tirer au sort, non pas un
peut-être habile d’utiliser des tirages au sort, non pas avec
point, mais un petit déplacement (dx, dy), quitte à rejet-
des distributions uniformes comme jusqu’à présent, mais
ter les déplacements qui font sortir du domaine, on devrait
avec des distributions qui favorisent les endroits où la fonc-
passer l’essentiel du temps (ou plutôt des tirages au sort)
tion a des contributions non négligeables. Formellement,
dans le bon domaine.
cela donne, avec l’exemple du calcul ≪ naı̈f ≫ ci-dessus (§
Ainsi, on peut commencer par fixer un point de départ 4.11.5.2) :
dans D :
x0 = 0.5 ; y0 = -0.5 dans l’exemple ci-dessus, puis Z Z
sin(xy)
calculer des déplacements −δx < dx < δx et −δy < dy < ID = sin(xy) dx dy = p(x, y) dx dy
D D p(x, y)
δy :
dx = 2*delta_x*(rand()-0.5) où p(x, y) est une densité de probabilité choisie de façon
dy = 2*delta_y*(rand()-0.5) à avoir des valeurs plus importantes là où la fonction a
et ajouter cela aux anciennes valeurs de x et y. Si le nou- elle-même des valeurs plus importantes.On sommera alors
veau point obtenu est dans D le déplacement est conservé, sin(xy)
sinon, il est rejetté (c’est-à-dire que l’on revient à la po- les valeurs prises par , où maintenant x et y sont
p(x, y)
sition précédente). Dans tous les cas (voir une discussion choisis avec la densité de probabilité p(x, y). On pourrait
détaillée de ce point dans la réf. [21]), on ajoute la valeur évidemment choisir comme distribution la fonction elle-
de la fonction à la somme que l’on aura déjà initiée. même, toutefois produire des nombres aléatoires avec une
distribution de probabilité sin(xy) comme ici n’est peut-
En divisant cette somme par le nombre de tirages, on ob- être pas si facile que cela. Une approximation de la fonc-
tient la valeur moyenne de la fonction dans le domaine : il tion peut suffire : ici, il suffit de poser,
≪ suffit ≫ de multiplier par le volume du domaine VD pour
-0.0886
soit, en séparant
-0.0888
x dx = dX et y dy = dY
-0.089
-0.0892
et √ √
x= 2X y= 2Y
-0.0894
-0.0896
où l’on a oublié les problèmes de signe. . . On peut s’ar-
ranger pour que X et Y soient dans l’intervalle [−1, 1] et
-0.0898 remultiplier par le coefficient qui va bien pour que x et
-0.09 y soient dans l’intervalle [−2, 2] comme auparavant. C’est
1e+07 2e+07 4e+07 8e+07
n
plus simple que ça en a l’air :
program importance
Figure 4.45 – Valeurs obtenues pour ID avec le domaine implicit none
(4.31) en fonction du nombre de tirages (l’axe des x a une double precision :: x, y, xx, yy, s, z
échelle logarithmique) comme dans la figure 4.44, mais integer :: i, imax = 10000000
cette fois-ci par une marche au hasard dans le domaine
d’intégration D. s = 0. ; n = 0
open(10,file=’import_sampling.out’)
do i = 1, imax
xx = 2.*rand()-1. ; yy = 2.*rand()-1.
Qu’a-t-on gagné en faisant tout cela ? Pas grand-chose, x = 2.*sign(sqrt(abs(xx)),xx)
il faut le reconnaı̂tre, en termes de performances de calcul ; y = 2.*sign(sqrt(abs(yy)),yy)
toutefois, on est rassuré que cela ≪ marche ≫, ce qui sera if ( 4*tanh(x-y)*exp(-(x**2+y**2)) > 0.4 ) then
précieux quand on n’aura plus le choix. . . z = x*y
92 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
if ( abs(z) > 1.e-10 ) then ! no zero divide système 53 : autrement dit, sauf dans quelques cas 54 , on
s = s + sin(z)/abs(z) ne sait pas calculer la fonction de partition.
else Dans la formulation de Gibbs, quand on veut cal-
s = s + 1. culer une grandeur macroscopique, par exemple l’aiman-
endif tation d’un système magnétique, on doit prendre un
endif
grand nombre de systèmes identiques, placés dans le
if ( mod(i,10000) == 0 ) write(10,*) i, 4.*s/i
enddo
même état macroscopique, mais dans des états micro-
close(10) scopiques différents. La moyenne thermodynamique d’une
write(*,*) 4.*s/imax grandeur (notée hM i pour une aimantation, par exem-
end ple) est la moyenne de toutes les valeurs prises par cette
grandeur dans tous ces systèmes. C’est donc une très
On obtient la courbe de la figure 4.46. Pour des résultats grosse intégrale très compliquée et le rapport avec les para-
graphes précédents devrait commencer à poindre. . .
-0.085
-0.0855
-0.09
Z E(q1 ,q2 ,...,qn )
−
-0.0905 A(q1 , q2 , . . . , qn ) e kB T
dq1 dq2 . . . dqn
-0.091 hAi = Z E(q1 ,q2 ,...,qn )
−
-0.0915
e kB T
dq1 dq2 . . . dqn
-0.092
100000 1e+06 1e+07
n (4.32)
Les q1 . . . qn sont les variables microscopiques du système
Figure 4.46 – Valeurs obtenues pour ID avec le domaine (typiquement les positions, vitesses, etc., de tous les
(4.31) en fonction du nombre de tirages (l’axe des x a une atomes ; n est, on l’aura compris, très grand et les
échelle logarithmique) par une méthode d’échantillonnage intégrales très multidimensionnelles) ; E(q1 , q2 , . . . , qn ) est
par l’importance. L’échelle de l’axe des y est la même que l’énergie du système dans l’état microscopique défini par
pour la figure 4.44. les valeurs de ces variables, A(q1 , q2 , . . . , qn ) la valeur de
la grandeur A dans les mêmes conditions. La probabilité
très comparables, voire meilleurs que ceux de la figure 4.44, d’atteindre un état d’énergie E est proportionnelle à l’ex-
on a fait dix fois moins de tirages au sort (107 au lieu de ponentielle (dans une statistique de Maxwell-Boltzmann)
108 ) : on a gagné un ordre de grandeur en temps de calcul ! et le dénominateur de l’expression est la fonction de par-
Ça méritait un petit effort. . . tition qui sert ici à la normalisation.
Il est bien sûr hors de question de calculer directement
4.11.6 Simulation de Monte-Carlo- l’expression (4.32), mais nous avons vu qu’il existe des
chemins de traverse plus ou moins tortueux pour ce genre
Metropolis.
de situations.
À quoi tous les calculs d’intégrale plus ou moins com- Imaginons de faire une marche au hasard dans l’espace
pliqués ci-dessus peuvent-ils bien servir à part meubler la des états accessibles au système : partons donc d’un état
conversation d’un vieil enseignant ? dont on peut calculer l’énergie E1 . La probabilité que cet
On sait qu’en thermodynamique statistique, pour un état soit réalisé est :
système donné, un grand nombre d’états microscopiques E1
−k
correspondent à un même état macroscopique : par ex- e BT
2
La probabilité π1→2 de transiter de l’état 1 vers l’état 2
est simplement la probabilité p1 d’être dans l’état 1 mul- 1.5
tipliée par la probabilité conditionnelle p1→2 de transiter
de l’état 1 vers l’état 2, alors que le système est déjà dans 1
l’état 1 :
0.5
V
π1→2 = p1 p1→2
De même, en sens inverse : 0
−0.5
π2→1 = p2 p2→1
−1
Le principe dit ≪ de la balance détaillée ≫ stipule que 1 1.2 1.4
r
1.6 1.8 2
2 aura une forte probabilité d’aller dans l’état 1, alors que attractif dans le cas contraire.
s’il est dans l’état 1, il aura une faible probabilité d’aller
dans l’état 2. En revanche, si l’on regarde le système ≪ de la variation d’énergie correspondante ∆V . Si ∆V < 0,
loin ≫, d’un point de vue macroscopique, on ne sait pas p1→2 = 1, on garde la nouvelle configuration et l’on recom-
dans quel état microscopique il est, et les probabilités de mence. Si, en revanche ∆V > 0,
transition dans un sens ou dans l’autre sont égales.
− ∆V
On arrive ainsi à la relation suivante : p1→2 = e kB T
p2
p1→2 = p2→1 il faut donc garder cette nouvelle configuration avec cette
p1
probabilité.
soit On compare alors un nombre s, tiré au sort dans l’in-
(E −E )
− k2 T 1 tervalle [0, 1], avec cette probabilité de transition (figure
p1→2 = e B p2→1
4.48). La probabilité que p1→2 > s est justement. . . p1→2 !
une expression précieuse en ce sens que la fonction de par-
tition, justement redoutée, en a disparu !
L’algorithme de Monte-Carlo-Metropolis dit ceci : ≪ si s
E2 < E1 , le système qui se trouve dans l’état 1 transitera
vers l’état 2 avec une probabilité 1 : p1→2 = 1. Si au
(E2 −E1 )
−
contraire, E2 > E1 , alors, p2→1 = 1 et p1→2 = e kB T
.
Ainsi si l’on choisit : 0 1
(E −E )
p = exp(dE/kT)
− k2 T 1
p1→2 = min(1, e B )
dE
la marche au hasard ainsi produite obéira à la statistique Figure 4.48 – On calcule p = e− kT et on compare avec
de Maxwell-Boltzmann, ce que l’on voulait ≫. un nombre s tiré au sort dans l’intervalle [0, 1]. Plus p est
En effet, nous sommes maintenant en train de faire une grand, plus on a de chances que s < p : donc p est la
marche au hasard dans le domaine d’intégration avec une probabilité de garder la nouvelle configuration.
probabilité qui est justement celle que l’on attend, on fait
donc pour ainsi dire ≪ spontanément ≫ un échantillonnage Donc, si p1→2 > s, on conserve la nouvelle configuration,
selon l’importance. sinon on la rejette. Puis on recommence. . . À chaque pas,
on calcule la grandeur dont on veut la valeur moyenne et
l’on fait cette moyenne.
4.11.6.2 Concrètement. Une écriture possible de cet algorithme serait
Admettons, par exemple, que l’on s’intéresse à un en-
i = n*rand() + 1 ! tirage au sort d’un atome
semble d’atomes susceptibles de constituer un solide et ! i est dans l’intervalle [1,n], or 0 <= rand() < 1
que l’on puisse calculer l’énergie potentielle du système !
connaissant les positions atomiques : V ({~rℓ }), par exem- ! conserver l’ancienne configuration au cas ou il
ple : ! faudrait rejeter la nouvelle
12 6 ! x_old = x(i) ; e_old = e
1X σℓm σℓm !
V = εℓm −2 ! deplacer l’atome i
2 rℓm rℓm
ℓ,m x(i) = x(i) + dx*(rand()-0.5)
!
si les interactions interatomiques sont des interactions de ! calcul de la nouvelle energie
paire du type Lennard-Jones (figure 4.47), mais il existe e = energie(x,n)
de nombreuses autres possibilités. de = e - e_old
Appliquons la méthode ci-dessus : à partir d’une config- !
uration initiale qui est, soit choisie, soit prise au hasard, if ( de > 0 ) then ! si l’energie a augmente
on tire au sort un déplacement atomique, et l’on calcule ! plus exp(-de/kt) est grand, plus la condition
94 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
−0.4
5x5 n’est sans doute pas bien choisi car on ne connait pas au
10x10
−0.6 20x20 départ quelles sont les ≪ bonnes ≫ configurations) jusqu’à
30x30
−0.8 40x40
50x50
ce que l’on aboutisse à une situation où l’ont obtient au fil
−1
70x70 des tirages autant d’augmentations que de diminutions de
l’énergie : le système se met à fluctuer autour d’une même
−1.2
Energie
0.6
vu, à des systèmes classiques dont les variables (ici, les po-
0.5
sitions atomiques) peuvent varier continûment, mais aussi
0.4
à des systèmes de spins dans le cadre du célèbre ≪ modèle
0.3
d’Ising ≫ (voir la figure 4.49).
0.2
0.1
0
0 1 2 3 4 5 4.11.7 Recherche du minimum d’une
T
fonction : le recuit simulé.
Figure 4.49 – Le résultat d’une simulation Monte-Carlo La méthode de Monte-Carlo-Metropolis, on l’a vu, per-
Metropolis sur un ensemble de spins de tailles variables de met de parcourir des états d’un système, même si l’état
5 × 5 à 70 × 70, placés sur un réseau bidimensionnel carré, initial que l’on avait choisi était inadapté : le système tend
avec des conditions aux limites périodiques et des inter- à converger vers des états compatibles avec la température
actions ferromagnétiques entre premiers voisins du type choisie, et l’on imagine volontiers que si l’on fait diminuer
−Si Sj tendant à aligner les spins ; chaque spin peut pren- la température jusqu’à la faire tendre vers zéro, l’on tende
dre les valeurs +1 ou −1. Pour plusieurs températures vers le minimum de l’énergie. Peut-on alors généraliser ce
différentes, on a fait quelques centaines de milliers tirages genre de méthodes à la recherche du minimum d’une fonc-
au sort, et calculé l’énergie moyenne par spin (en haut) tion, même s’il ne s’agit pas d’une énergie ?
et l’aimantation moyenne, également par spin (en bas).
On constate qu’à basse température, l’aimantation vaut 120
1 : tous les spins sont orientés dans le même sens ce
qui correspond à l’énergie potentielle la plus faible. Puis 100
−20
−10 −5 0 5 10
! ci-dessous est difficile a remplir
if ( rand() > exp(-de/kt) ) then Figure 4.50 – Comment, à partir d’une analyse locale de
! rejet de la nouvelle configuration la dérivée de cette fonction peut-on être sûr d’aboutir sur
x(i) = x_old ; e = e_old son minimum absolu ?
endif ! sinon on garde
endif
Les méthodes de recherche de minima de fonctions vues
C’est un algorithme très simple que l’on peut optimiser de au chapitre 4.7 ont en effet toutes le défaut de reposer
multiples façons, en particulier de calculer directement la sur une analyse locale des dérivées de cette fonction, que
variation d’énergie (la variation ne dépend que de l’atome ce soit la méthode de la plus grande pente ou celle du
déplacé et de ceux avec lesquels il est en interaction, alors gradient conjugué. Rien ne garantit avec ces méthodes
que l’énergie concerne tous les atomes) peut représenter que l’on a atteint le minimum absolu de la fonction : le
un gain significatif de temps. minimum trouvé peut n’être qu’un minimum local (fig-
On fait alors de nouveaux tirages au sort. L’énergie ure 4.50), un autre plus profond se trouvant ailleurs. La
du système tend à évoluer (puisque le point de départ méthode du recuit simulé est une tentative pour s’attaquer
Physique numérique, Philippe Depondt 95
f (x1 , . . . , xn ) = f (X)
1 1
Random
0.9
0.8
0.8
0.6
0.7
0.6 0.4
0.5 0.2
0.4
Y 0
0.3
−0.2
0.2
−0.4
START 0.1
0 −0.6
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
1 1
T=1 T=0.5 −0.8
0.9 0.9
0.8 0.8 −1
−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1
0.7 0.7 X
0.6 0.6
0.5 0.5
Figure 4.53 – Le problème du voyageur de commerce,
0.4 0.4
0.3 0.3
traité par recuit simulé comme dans la figure 4.52, mais
0.2 0.2 dans un cas -des villes réparties sur un cercle- où la
0.1 0.1 meilleure solution est facile à deviner : ici la méthode par
0
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
0
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 recherche au hasard aboutit à un résultat assez peu con-
1 1
0.9
T=0.25
0.9
T=0.125 vaincant, le voyageur serait amené à faire plusieurs tours
0.8 0.8
sur le cercle, avec des retours en arrière, alors qu’un seul
0.7 0.7 tour suffirait ; la méthode n’est pas universelle. . .
0.6 0.6
0.5 0.5
0.1 0.1
0 0
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
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
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
1 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.1
0 0
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
97
98 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
conservation de la quantité de chaleur (premier principe ainsi, l’indice entier i représente l’espace et l’indice entier
de la thermodynamique en l’absence de travail) donne, j le temps, et :
~ r) = Q̇(~r)
div φ(~ (5.3) E(x, t) = E(i δx , j δt ) = Ei,j
la divergence du flux est en chaque point la création ou De même la vitesse de phase se réécrit :
l’apport local (venant du monde extérieur) de chaleur.
D’autres exemples pourraient venir de l’hydrody- vϕ (i δx ) = vi
namique où l’on applique les équations d’écoulement d’un
L’équation (5.4) des différences finies permet d’écrire :
fluide, en tenant compte ou non de la viscosité, de la
mécanique des milieux continus où l’on déforme un solide ∂E(x, t) Ei+1,j − Ei,j
plus ou moins compliqué par des contraintes ( e.g. un ≃ (5.5)
∂x δx
système constitué de deux solides collés avec des coeffi-
cients de dilatation différents soumis à un accroissement ou
∂E(x, t) Ei,j − Ei−1,j
de température. . .), etc. ≃ (5.6)
∂x δx
Tous ces problèmes ont pour ingrédient commun qu’il
s’agit d’équations aux dérivées partielles, c’est-à-dire ce sont deux approximations possibles, équivalentes mais
d’équations différentielles de plusieurs variables qui con- qui n’ont pas exactement la même valeur. . . en fait, il
tiennent des dérivées partielles comme : faudrait pouvoir prendre la valeur du champ au demi-pas :
c’est parfois possible, parfois, non. Ce qui a été écrit ici,
∂ ∂ ∂ ∂ c’est plutôt :
, , ,
∂x ∂y ∂z ∂t
δx δx
Les systèmes macroscopiques ne sont pas les seuls suscep- ∂E(x + , t) ∂E(x − , t)
2 et 2
tibles de ce genre de traitement : l’équation de Schrödinger ∂x ∂x
pour une particule dans un potentiel est aussi une équation
c’est-à-dire les dérivées au demi-pas ; or ce sont les
aux dérivées partielles,
dérivées secondes, et non les dérivées premières, qui nous
2 intéressent dans ce problème :
∂ h̄
ih̄ ψ(~r, t) = − ∆ + V (~r) ψ(~r, t)
∂t 2m δx δx
∂E(x + , t) ∂E(x − , t)
ainsi que bien sûr les équations de Maxwell de 2 − 2
∂ 2 E(x, t) ∂x ∂x
l’électromagnétisme. ≃
∂x2 δx
Ces questions ne sont pas forcément faciles à traiter, et,
parfois même dans certaines conditions et pour des raisons et en remplaçant les dérivées premières par les expressions
diverses, on ne sait pas les résoudre. Cependant, il existe (5.5) et (5.6), on obtient aisément l’approximation :
deux classes principales de méthodes pour s’y attaquer : les
méthodes de différences finies et les méthodes d’éléments ∂ 2 E(x, t) Ei+1,j + Ei−1,j − 2Ei,j
≃
finis. L’on mentionnera également les méthodes dites spec- ∂x2 δx2
trales.
La même opération peut être effectuée pour la dérivée
temporelle, sauf que c’est maintenant l’indice j qui est
5.2.2 La méthode des différences finies affecté, et en fin de compte, l’équation de propagation (5.1)
Si f est une fonction de plusieurs variables x1 , x2 ,. . ., se réécrit :
xn , on peut approximer la dérivée partielle par rapport à Ei+1,j + Ei−1,j − 2Ei,j 1 Ei,j+1 + Ei,j−1 − 2Ei,j
xi par : = 2
∂f
2
δx vi δt2
≃
∂xi Ce que l’on cherche, c’est le champ E en tous points à
f (x1 , . . . , xi + δxi
, . . . , xn ) − f (x1 , . . . , xi − δxi
, . . . , xn ) l’instant t + δt , le connaissant aux instant t et t − δt , ainsi :
2 2
δxi Ei,j+1 =
(5.4)
c’est la définition de la dérivée partielle, mais on ne passe 2
v i δt
pas à 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à que réside l’approximation et c’est de là que vient
(5.7)
l’expression différences finies.
ce qui se programme fort aisément en quelques lignes.
Dans les paragraphes qui suivent, différentes variantes
On appelle cela un schéma explicite puisque la solution
de la méthode sont montrées à l’aide d’exemples.
apparaı̂t explicitement : on doit connaı̂tre les conditions
initiales et calculer pas à pas les résultats au cours du
5.2.2.1 Le schéma explicite temps.
Prenons par exemple l’équation de propagation d’une La figure 5.1 montre un exemple simple de propaga-
onde électromagnétique dans un milieux unidimensionnel tion à travers une lame transparente d’un paquet d’ondes
(eq. (5.1) ) : il faut d’abord discrétiser le temps et l’espace, gaussien avec les réflexions sur les dioptres. On y voit bien
sûr le ralentissement du paquet dans le diélectrique (la
x = i δx t = j δt pente est plus forte, autrement dit, il faut plus de temps
Physique numérique, Philippe Depondt 99
30
2
25 1.5
1
20 0.5
0
−0.5
15 −1
t
−1.5
−2
10
0
0 5 10 15 20
x
Figure 5.1 – Propagation d’une onde à travers une lame transparente obtenue par l’équation (5.7). En abscisse,
la coordonnée spatiale x, en ordonnée le temps. La condition initiale est donnée par un paquet d’ondes gaussien
se déplaçant dans le sens des x croissants, puisque l’on doit définir les deux premiers pas de temps pour initialiser
l’équation (5.7).
une très grosse matrice n × n, et deux matrices colonne : renumérotant : m = 3(i − 1) + α où α prend les valeurs 1,
2, 3. La même opération est évidemment faite pour ℓ.
T1 −Q̇1 δx2 On conçoit aisément que la matrice A peut facilement
.. .. devenir énorme à tel point qu’il faut parfois recourir à des
. .
méthodes sophistiquées pour résoudre le système linéaire !
T=
Ti
Q = −Q̇i δx
2
. ..
.. . 5.2.2.3 Contourner le schéma implicite
Tn −Q̇n δx2
Une façon d’éviter le schéma implicite pour retrouver un
Il reste à régler la question des conditions aux limites schéma explicite est d’écrire une équation d’évolution tem-
qui, dans ce cas ci, se réduisent à peu de choses, par ex- porelle du système au lieu de tenter de calculer d’emblée
emple : une situation d’équilibre où tous les points dépendent les
T0 = Ta et Tn+1 = Tb uns des autres. Avec une équation d’évolution, on part
d’une situation initiale et l’état au pas suivant dépend ex-
on introduit des points qui n’interviennent pas dans le plicitement de l’état initial : le système, si tout se passe
système (5.9), i = 0 et i = n + 1 qui représentent les bien, doit évoluer vers l’équilibre que l’on cherchait. Par
extrémités de l’échantillon et on fixe leurs températures à exemple, l’équation stationnaire (5.3) peut être remplacée
Ta et Tb . Cela oblige à modifier la première et la dernière par une équation hors d’équilibre :
ligne de A et de Q.
∂T (~r)
On peut aussi laisser les conditions aux limites libres, la C = Q̇(~r) − divφ
seule contrainte étant alors Q̇(x). ∂t
On fait appel alors à un sous-programme de bib- c’est-à-dire que la variation temporelle locale de
liothèque, ou bien pris dans un manuel de ≪ recettes température (multipliée par la capacité calorifique C d’une
numériques ≫, capable de résoudre le système (5.9). Si n cellule) est la production locale de chaleur diminuée de la
est grand, le système est parfois lourd à résoudre, cepen- chaleur qui s’écoule hors de la cellule. En combinant cela
dant, la matrice A comporte principalement des zéros (on avec la loi de Fourier (5.2), on obtient :
dit qu’elle est creuse), et dans le cas présent elle est tridi- ∂T (~r)
C = Q̇(~r ) − div κ(~
r ) ~ T (~r)
grad
agonale ce qui facilite souvent la résolution numérique du ∂t
système d’équations.
On tombe ainsi sur un schéma explicite similaire à celui
Le résultat d’un exemple simple est montré sur la figure
de la propagation d’une onde du paragraphe 5.2.2.1. Le
5.2.
même problème que pour la figure 5.2 est ainsi traité sur
la figure 5.3.
Schrödinger à une dimension et dépendante du temps On est dans la même situation que pour la méthode de
d’une particule dans un potentiel : Cranck et Nicholson (paragraphe 4.9.5). L’inconnue dans
ce problème est ψ ℓ+1 puisqu’on cherche la fonction d’onde
∂ψ(x, t) h̄2 ∂ 2 ψ(x, t) à l’instant t + δt , la connaissant à l’instant t. Ainsi :
ih̄ =− + V (x)ψ(x, t)
∂t 2m ∂x2
δi δi
Il est coutumier, dans ce genre de problème, de se placer 1 + i HD ψ ℓ+1 = 1 − i HD ψ ℓ (5.11)
h̄ 2 2
dans un système d’unités où h̄ = 1 et = 1. On peut
2m peut se résoudre à partir d’un système linéaire du type :
discrétiser le problème comme précédemment :
où j et ℓ sont des indices entiers, j pour l’espace et ℓ pour où A est une matrice tridiagonale n × n et B un vecteur
le temps. Soit : de n éléments :
∂ 2 ψ(x, t) ℓ
ψj+1 ℓ
+ ψj−1 − 2ψjℓ δi
≃ A = 1 + i HD
∂x2 δx2 2
δi
et : B = 1 − i HD ψ ℓ
2
∂ψ(x, t) ψjℓ+1− ψjℓ
≃
∂t δt Un tel problème -qui suit le schéma implicite- se résout
Cela donne aisément : aisément à l’aide d’un sous-programme de bibliothèque
! adéquat (il s’agit d’une matrice triadiagonale, ce qui sim-
ℓ ℓ
ψj+1 + ψj−1 − 2ψjℓ plifie les choses), en prenant soin toutefois de travailler
ψjℓ+1 = ψjℓ + iδt − Vj ψjℓ
δx2 avec des nombres complexes (figures 5.4, 5.5 et 5.6). Un
des charmes de cette méthode est que la norme de la fonc-
que l’on peut écrire matriciellement : tion d’onde est conservée. . .
∂4z ρ ∂2z D=
+ =0 1. Voir par exemple G. Bruhat, Mécanique, Masson (1967) p. 653.
∂x4 Ee2 (x) ∂t2
Physique numérique, Philippe Depondt 103
.. .. .. .. et évidemment, les transformées inverses :
. . . . 0 0 0
Z
.. .. .. ..
0 . . . . 0 0 V (~r) = Ṽ (~q) e−i~q.~r d3 ~q
+1 6 +1
0 −4 −4
0
√
cℓ−2 cℓ
√
cℓ−1 cℓ cℓ
√
cℓ+1 cℓ
√
cℓ+2 cℓ
Z
.. .. .. ..
0 0 . . . . 0 ρ(~r) = ρ̃(~q) e−i~q.~r d3 ~q
.. .. .. ..
0 0 0 . . . . En utilisant les transformées inverses, l’équation de Pois-
son se reécrit :
ζ1
.. Z Z
. ∇ 2
Ṽ e q .~
−i~ r 3
d ~r = − ρ̃ e−i~q.~r d3~r
Z=
ζℓ
..
. soit après une dérivation sous l’intégrale :
ζn Z Z
2 q .~
r 3
−|~q| Ṽ e −i~
d ~r = − ρ̃ e−i~q.~r d3~r
Il suffit d’écrire explicitement quelques termes pour mon-
trer que D est symétrique. Cela ne change rien pour les
valeurs propres, celles de D sont les mêmes que celles de A, et :
ρ̃(~q)
seulement les vecteurs propres donnent les déplacements Ṽ (~q) =
|~q|2
pondérés par c(x) : il suffit d’en tenir compte (voir par
exemple la figure 5.7). extrêmement facile à résoudre. . . La méthode consiste
donc à calculer d’abord la transformée de Fourier de ρ(~r),
0.1
1 diviser le résultat par |~q|2 puis retransformer par Fourier
0.08 2
3 inverse pour obtenir le potentiel V (~r). Tout ceci est très
4
0.06 5
6 efficace et rapide. En ~q = 0, on a :
0.04 Z
0.02 Ṽ (~q = 0) = V (~r)d3~r
0
−0.02 il s’agit simplement de définir la constante arbitraire qui
−0.04 intervient dans le potentiel.
−0.06 Malheureusement, les choses sont parfois un peu re-
−0.08 torses comme on peut le constater sur la figure 5.8 puisque
−0.1
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
les deux charges placées sur un axe horizontal donnent un
potentiel qui n’a pas la même symétrie, ce qui est fâcheux !
Figure 5.7 – Les six premiers modes propres de vibration
d’une poutre homogène fixée à une extrémité (à gauche)
et libre à l’autre, calculés avec 500 points de discrétisation.
∇2 V (~r) = −ρ(~r)
où bien sûr, ρ(~r) est une densité de charges et V (~r) le po-
tentiel électrostatique correspondant. On peut introduire
les transformées de Fourier spatiales de ces quantités :
Z Figure 5.8 – Calcul par une méthode spectrale à deux
Ṽ (~q) = V (~r) ei~q.~r d3~r dimensions du potentiel électostatique produit par deux
charges.
où le symbole d3~r indique qu’il s’agit d’un intégration sur
En revanche, le même calcul par différences finies (figure
les trois coordonnées d’espace. De même :
5.9), bien qu’exigeant sensiblement plus de temps calcul
Z
(c’est un schéma implicite qui requiert la résolution d’un
ρ̃(~q) = ρ(~r) ei~q.~r d3~r système linéaire 4096 × 4096, puisque le carré de 64 × 64
104 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
∂ψ(~r, t) h̄2 2
ih̄ − ∇ ψ(~r, t) + V (~r)ψ(~r, t)
∂t 2m
Si l’on applique la même méthode que ci-dessus, on ob- Figure 5.10 – Un exemple de maillage à deux dimen-
tient après quelques calculs sans difficulté bien qu’un peu sions pour le calcul des caractéristiques d’une aile d’avion
laborieux (on a trois transformées de Fourier spatiales et (http://fun3d.larc.nasa.gov/example-20.html).
une temporelle) :
Z Au lieu d’approximer les dérivées partielles comme
h̄2 ψ̃(ω, ~q) ′ ′ ′ dans l’équation (5.4), on approxime la fonction f (x, y, z)
−h̄ω ψ̃(ω, ~q) = − + Ṽ (~q − ~q)ψ̃(ω, ~q )d~q
2m q 2 recherchée par un développement local sur une base de
fonctions. On fait ainsi un maillage de l’espace (voir la
avec des notations similaires à ce qui précède. On obtient figure 5.10), en général avec de petits tétraèdres de tailles
sans grande surprise un produit de convolution. Celui-ci variables de telle façon que la géométrie du maillage suive
peut être très rapide à calculer si Ṽ (~q) est bien localisé d’assez près celle du problème : dans le cas de l’aile d’avion,
(i.e. V (~r) varie lentement) et donc l’intégrale aisée à cal- par exemple, les ≪ mailles ≫ seront plus petites et plus
culer ; au contraire, si V (~r) est localisé, avec des variations resserrées près du bord d’attaque de l’aile, là où le flux
rapides, le produit de convolution dans l’espace réciproque d’air subit les déviations les plus brutales, les champs
sera extrêmement laborieux à obtenir. . . on retrouve ici la de vitesse et de pression présentent des variations impor-
bonne vieille propriété des transformées de Fourier : avec tantes.
des fonctions localisées, on a généralement intérêt à tra- Dans chaque maille Mp , la fonction recherchée fait
vailler dans l’espace direct (l’espace de ~r), au contraire, l’objet d’un développement sur une base de fonctions
s’il s’agit de fonctions ≪ proches ≫ d’ondes planes, l’es- ϕ (x, y, z) :
j
pace réciproque (l’espace des ~q) est plus efficace.
X p
f (x, y, z) ≃ vj ϕj (x, y, z), (x, y, z) ∈ Mp
5.2.4 Introduction aux éléments finis j
Pratiquement tous les exemples ci-dessus sont unidi- les vjp étant les coefficients du développement dans cette
mensionnels pour des raisons de simplification évidente. Le maille.
Physique numérique, Philippe Depondt 105
Comme les fonctions ϕj sont connues, choisies par l’u- 5.3 La matière comme une collec-
tilisateur, leurs dérivées partielles sont calculables et les
dérivées partielles de f s’écrivent :
tion de particules.
Tous les problèmes ci-dessus, à l’exception bien sûr de
∂f (x, y, z) X p ∂ϕj (x, y, z)
≃ vj l’équation de Schrödinger, reposent sur une modélisation
∂x j
∂x à une échelle suffisamment grande pour que la structure
atomique de la matière n’intervienne pas. Lorsqu’on se
Très souvent, les fonctions ϕj sont tout simplement des préoccupe de question se situant à une échelle plus petite,
polynômes de telle façon que leurs dérivées soient faciles il faut bien sûr adopter une modélisation appropriée où la
à obtenir. matière est considérée comme constituée d’atomes.
En général, on se retrouve avec un très grand système
d’équations à résoudre dont les inconnues sont les coeffi- 5.3.1 Matrice dynamique
cients vjp .
A titre d’exemple, le problème du paragraphe 5.4 est On a vu, à propos des problèmes de valeurs propres (§
traité ici, bien qu’il soit absurde d’utiliser les éléments fi- 4.5.4), que beaucoup de questions pouvaient se ramener
nis dans ce cas qui se résout facilement par différences à un problème de matrice dynamique dont on cherche
finies ! Il s’agit simplement de montrer ici le principe de la les valeurs propres et les vecteurs propres. Pratiquement
méthode. Dans ce cas, les mailles sont de nouveaux des pe- tous les problèmes d’oscillateurs harmoniques couplés peu-
tits intervalles d’indice p. Sur un intervalle, la température vent être avantageusement abordés de la sorte. Plusieurs
s’écrit : problèmes de cet ordre, suffisamment différents pour mon-
trer la force de cette approche, sont décrits ci-dessous.
T (x) = ap x2 + bp x + cp
D=
.. ..
. . 0 0 0
.. .. ..
. . . 0 0
κ κℓ+1,ℓ + κℓ,ℓ−1 κℓ+1,ℓ
0 − √ ℓ,ℓ−1 0
mℓ−1 mℓ mℓ
−√
mℓ mℓ+1
.. .. ..
0 0 . . .
.. ..
0 0 0 . .
S1 = ρ1 − ρ
(~ ~0 ) · ~e1
S2 = ρ2 − ρ
(~ ~0 ) · ~e2
4 S3 = ρ3 − ρ
(~ ~0 ) · ~e3
S4 = ρ4 − ρ
(~ ~0 ) · ~e4
Figure 5.14 – Une molécule tétraédrique, par exemple
CH4 ou C Cl4 . L’atome central est numéroté 0 et les quatre où les vecteurs ~ei sont les vecteurs unitaires le longs des
autres : 1, 2, 3, 4. liaisons (0, i) : ~ei = (~ri − ~r0 ) /|~ri − ~r0 |. On obtient alors
assez aisément :
5.3.1.2.3 Calcul pour une molécule tétraèdrique.
Imaginons, par exemple, une molécule tétraèdrique ~si,ℓ = ~eℓ si i = ℓ ℓ ∈ [1, 4]
(fig. 5.14) : a priori, comme on a 5 atomes et trois degrés de ~s0,ℓ = −~eℓ ℓ ∈ [1, 4]
liberté par atomes, soit quinze degrés de liberté en tout, la ~si,ℓ = 0 sinon.
matrice dynamique est (15×15). Toutefois la translation et
la rotation d’ensemble de la molécule ne nous intéressent sxi,ℓ
y
pas : 3 degrés de liberté translationnels et 3 degrés de lib- où ~si,ℓ = si,ℓ .
erté rotationnels (pour une molécule tri-dimensionnelle) ne szi,ℓ
sont pas pertinents ; de façon générale, pour une molécule Les angles entre les liaisons paraissent aussi être des
à N atomes, on doit aboutir à 3N − 6 variables internes variables assez naturelles, mais c’est un peu plus com-
et une matrice dynamique (3N − 6 × 3N − 6), soit (9 × 9) pliqué puisqu’un simple dénombrement donne θ12 (l’angle
ici. Comme nous sommes dans une approximation har- d de sommet l’atome 0 qui se situe entre les liaisons 0−1
102
monique, on considère que les déplacements ρ ~i , ∀i ∈ [1, N ] et 0 − 2), θ13 , θ14 , θ23 , θ24 , θ34 , c’est-à-dire six angles, or
des atomes par rapport à leurs positions d’équilibre ~ri sont il n’en faut que cinq puisqu’on a déjà quatre variables S1
petits, ainsi on peut écrire une relation linéaire entre les à S4 et qu’on en attend 9 en tout : c’est que ces angles ne
variables internes Sℓ , ℓ ∈ [1, 3N − 6] et les déplacements sont pas indépendants. On peut poser
atomiques :
XN X ~i − ~r0 − ρ
~ri + ρ ~0 ~hi
Sℓ = sα α ~εi = =
i,ℓ ρi |~ri + ρ
~i − ~r0 − ρ
~0 | |~hi |
i=1 α=x,y,z
q
1 2~hi · d~hi (et non finie comme dans le § 5.3.1.2.1) avec p atomes
or d~hi = ρ
~i − ρ
~0 , et d|hi | = d |~hi |2 = =
2 |~hi | par maille, ces mailles étant indéfiniment répétées. Chaque
~ei · (~
ρi − ρ
~0 ) = Si , ainsi : atome est en principe repéré par 2 indices, ℓ le numéro de
la maille (qui va de −∞ à +∞) et k le numéro de l’atome
~i − ρ
ρ ~0 Si dans la maille ℓ (k ∈ [1, p]). La position d’équilibre de
d~εi = − ~ei
|~ri − ~r0 | |~ri − ~r0 | l’atome k, ℓ est donc
En posant que les éléments différenciels dθi,j = ηi,j sont les Xk,ℓ = ℓa + Xk
variations angulaires correspondant au mouvements dits
≪ de libration ≫, on obtient après quelques lignes de cal- où a est le paramètre de maille et Xk la position dans la
cul : maille. Les déplacements des atomes par rapport à ces po-
|~ei ∧ ~ej | ηi,j = sitions d’équilibre sont xk,ℓ ; les équations du mouvement
s’écrivent alors
~0 − ρ
ρ ~i ~0 − ρ
ρ ~j Si Sj
· ~ej + · ~ei + + ~ei · ~ej
|~ri − ~r0 | |~rj − ~r0 | |~ri − ~r0 | |~rj − ~r0 | m1 ẍ1,ℓ = cp,1 (xp,ℓ−1 − x1,ℓ ) + c2,1 (x2,ℓ − x1,ℓ )
Si l’on pose, par exemple : mk ẍk,ℓ = ck−1,k (xk−1,ℓ − xk,ℓ ) + ck+1,k (xk+1,ℓ − xk,ℓ )
S5 = η12 , S6 = η13 , S7 = η14 , S8 = η23 , S9 = η24 , S10 = η34 mp ẍp,ℓ = cp−1,p (xp−1,ℓ − xp,ℓ ) + c1,p (x1,ℓ+1 − xp,ℓ )
cela permet d’obtenir, où 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é ici aux interactions entre premiers voisins, mais
~s05 = − on peut généraliser sans difficultés. . . autres que ≪ tech-
|~e1 ∧ ~e2 | |~r2 − ~r0 | |~r1 − ~r0 |
niques ≫ !
etc. Comme les mailles se succèdent en restant identiques
L’énergie potentielle de la molécule peut s’écrire en fonc- les unes aux autres, notre système est périodique et nous
tion des variables internes : pouvons chercher des solutions de type onde plane :
4
1X 2 1X 2
uk
xk,ℓ = √ ei(ωt−q(ℓa+Xk ))
ρk })
V ({~ = ρi − ρ
ki (~ ~0 ) + cij ηij (5.14) mk
2 i=1 2
i = 1, 3
j = i + 1, 4
où q est le vecteur d’onde de l’onde plane. Jusqu’ici, nous
10
1X n’avons rien fait de nouveau par rapport à la chaı̂ne unidi-
= ki Si2 mensionnelle à un type d’atomes, sinon des aménagements
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’équation (5.14), le premier terme correspond à de nouveau. . . Si l’on poursuit dans la même voie, on doit
l’allongement des liaisons et le deuxième aux oscillations injecter ces expressions d’ondes planes dans les équations
latérales, les mouvements de libration. Les coefficients ki du mouvement ; on obtient :
et cij correspondent aux dérivées secondes de l’équation
(5.13). up u1 −iqX1
−ω 2 u1 e−iqX1 = cp,1 √ e−iq(Xp −a) − e +
On constate que, dans cet exemple, la difficulté ne tient m1 mp m1
pas tant à la méthode elle-même qui n’a rien de partic- u2 −iqX2 u1 −iqX1
ulièrement nouveau par rapport à ce que l’on a déjà vu c 2,1 √ e − e
m1 m2 m1
dans les paragraphes précédents, mais dans une mise en
uk−1 uk −iqXk
œuvre de la géométrie de la molécule. −ω 2 uk e−iqXk = ck−1,k √ e−iqXk−1 − e +
mk mk−1 mk
5.3.1.3 Dynamique de réseau uk+1 uk −iqXk
ck+1,k √ e−iqXk−1 − e
mk mk+1 mk
Cette technique qui utilise la matrice dynamique est
up−1 up −iqXp
extensible à un réseau périodique d’atomes, c’est-à-dire −ω 2 up e−iqXp = cp−1,p √ e−iqXp−1 − e +
mp mp−1 mp
un cristal. Elle recouvre que qu’on appelle la ≪ dy-
namique de réseau ≫ et elle est très utilisée pour in- u1 up −iqXp
c1,p √ e−iq(Xp +a) − e
terpréter des expériences de spectroscopie optique ou neu- mp m1 mp
tronique qui servent à déterminer les modes de vibrations
présents dans des systèmes qui peuvent être assez com- Après quelques manipulations simples, cela donne :
pliqués. Sa limite cependant est que les interactions en-
cp,1 e−iq(Xp −X1 −a) cp,1 + c2,1
tre les atomes doivent pouvoir être traités dans l’approx- ω 2 u1 = − √ up + u1
imation harmonique ce qui impose plusieurs contraintes : m1 mp m1
que les positions d’équilibre soient déjà connues, donc la c2,1 e−iq(X2 −X1 )
− √ u2
structure microscopique du matériau établie et que les m1 m2
déplacements atomiques restent suffisamment petits pour
ck−1,k e−iq(Xk−1 −Xk ) ck−1,k ck+1,k
qu’un développement limité au premier ordre des forces ω 2 uk = − √ uk−1 + uk
soit possible. mk mk−1 mk
Prenons, pour simplifier les notations, le cas unidimen- ck+1,k e−iq(Xk−1 −Xk )
− √ uk+1
sionnel : nous avons une chaı̂ne unidimensionnelle infinie mk mk+1
110 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
V ({~ri })
PB
mℓ ~r̈ℓ = f~ℓ (~r1 . . . ~rℓ′ . . . ~rN ),
C
∀ℓ ∈ [1, N ]
où :
∂V
∂xℓ
Figure 5.18 – Un exemple de simulation de dynamique
f~ℓ = −grad~ V = − ∂V
ℓ ∂y moléculaire pour étudier le frottement d’un adsorbat sur
ℓ
∂V un substrat. La substrat est constitué de 18×18×4 mailles
cubiques à faces centrées. Chacune des deux surfaces libres
∂zℓ
est recouverte d’une monocouche de 288 atomes d’un autre
et, par exemple avec un potentiel d’interaction de paire de type (soit un total de 5760 atomes). L’on exerce des forces
type Lennard-Jones (figure 5.17) : extérieures opposées sur l’adsorbat et le substrat afin de
12 6 ! les faire glisser l’un sur l’autre (Ph. Depondt, A. Ghazali,
1X 1X σij σij
V = V (~rij ) = εij −2 J.-C. S. Lévy, Surf. Science 419 (1998) 29).
2 i,j 2 i,j rij rij
(5.16)
On a perdu, par rapport à la méthode de Monte-Carlo,
deux ordres de grandeur pour le nombre d’atomes max-
1
imum que l’on peut inclure dans le système, mais en
contrepartie, comme on a la dynamique, on peut suivre
0.5 l’évolution temporelle du système, étudier les vibrations
(la gamme de fréquence accessible est celle des vibrations
0 acoustiques dans la matière condensée).
Le même type de simulation peut servir pour l’étude
de systèmes fort différents et très divers comme les grains
−0.5
d’un tas de sable ou les étoiles dans une galaxie !
−1
5.3.4 Simulations ab-initio.
0 1 2 3 4 5
Toutefois, la faiblesse des méthodes ci-dessus, simula-
Figure 5.17 – Le potentiel de Lennard-Jones de l’équation tion Monte-Carlo ou dynamique moléculaire, 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épulsif dans le cas contraire, la distance et modélisables avec une précision suffisante. Les expres-
d’équilibre étant σij . sions de type Lennard-Jones ou analogues ne sont que des
modèles dont on espère qu’ils rendent compte de la réalité
Il s’agit d’un très gros système d’équations de manière satisfaisante. Il arrive que ce ne soit pas le
différentielles dépendantes du temps que l’on peut cas, simplement parce que l’on ne dispose pas d’expression
résoudre numériquement par les méthodes habituelles (en analytique valide dans un domaine suffisant de distances
général Verlet). Cela suppose toutefois que l’on dispose interatomique, ou bien que l’interaction soit modifiée par
de modèles d’interaction entre les atomes, par exemple l’environnement :
Lennard-Jones comme ci-dessus. – quand on simule une surface, le nombre de voisins
Avec un ordinateur ≪ raisonnablement ≫ puissant, l’on d’un type d’atome donné n’est pas le même selon que
atteint sans difficulté majeure les ordres de grandeurs suiv- l’atome considéré est dans le cœur de l’échantillon ou
ants (voir par exemple les figures 5.18 et 5.19) : en surface : la forme de l’interaction de cet atome avec
nombre d’atomes : N ≃ 104 ces voisins peut en être affectée
longueurs d’onde accessibles : λ ≤ 10nm – des atomes ou des molécules dont les nuages
pas de temps d’intégration : δt ≃ 10−3 ps électroniques sont fortement modifiés par la présence
durée accessible : τ ≃ 103 ps ou non d’autres atomes,
fréquences accessibles : 10−2 tHz ≤ ν ≤ 10tHz – si l’on comprime le milieu de façon que les noyaux
A priori, on travaille à E = K + V = Cste et à vol- se rapprochent suffisemment pour modifier les nuages
ume constant, mais on peut aussi fixer P et T . Maintenir électroniques
la pression constante, plutôt que le volume est utile pour – ...
simuler des transitions de phase ou des changements struc- On peut introduire des potentiels à trois corps, voire
turaux, voire simplement tenir compte de la dilatation. plus, afin de tenir compte de l’effet que la présence d’un
Maintenir la température constante permet de traiter par troisième atome peut avoir sur l’interaction entre deux
exemple des phénomènes dissipatifs, tels que diffusion de autres atomes, on peut également introduire des charges
la chaleur à l’échelle microscopique. qui peuvent se déplacer dans certaines conditions : tous
112 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
Figure 5.19 – Vue de dessus de l’adsorbat (gris sombre) et d’une couche du substrat (gris clair) de la figure 5.18, à
gauche avant glissement, à droite après.
ces modèles restent cependant assez phénoménologiques. Imaginons maintenant le même problème à trois dimen-
Toutefois, dès que l’on s’intéresse, par exemple, aux liens sions : la discrétisation implique un triplet d’indices (i, j, k)
entre propriétés structurales et propriétés électroniques
d’un matériau, on peut aussi tenter de revenir aux xi = i δx, yj = j δy, zk = k δk
principes fondamentaux et faire ce que l’on appelle des
ψi,j,k = ψ(xi , yj , zk ) Vi,j,k = V (xi , yj , zk )
simulations ab-initio (à partir du début). Dans ce cas,
on ne fait pas d’hypothèse sur la forme des interactions et l’équation de Schrödinger se reécrit comme avant
mais on considère un ensemble de noyaux avec leurs nu-
ages électroniques. En principe, on doit alors résoudre ψi+1,j,k − 2ψi,j,k + ψi−1,j,k
−
l’équation de Schrödinger de n noyaux de numéro atom- δx2
Xn ψi,j+1,k − 2ψi,j,k + ψi,j−1,k
ique Zi et Zi électrons en interaction. −
δy 2
i=1
ψi,j,k+1 − 2ψi,j,k + ψi,j,k−1
−
δz 2
5.3.4.1 Une petite contrariété
+Vi,j,k ψi,j,k = E ψi,j,k
Malheureusement, on ne peut pas attaquer le problème
avec des méthodes comme celle étudiée dans le paragraphe Le triplet (i, j, k) prend alors n3 valeurs 5 , ainsi la ma-
5.2.2.4 : il n’existe pas au monde d’ordinateur assez puis- trice dont on cherche les valeurs propres est de dimension
sant pour le faire ! Pour illustrer ce propos, revenons à n3 × n3 , soit 106 ×106 si n = 100 : le problème s’est brutale-
l’équation de Schrödinger indépendante du temps à une ment amplifié de façon démesurée. . ., et nous n’en sommes
dimension et à une particule dans un potentiel : c’est le encore qu’à une seule particule ! Passons à un problème a
cas le plus simple. La fonction d’onde ψ qui décrit l’état du priori simple, l’atome d’hydrogène : un proton et un neu-
système est une fonction à une variable, et l’on obtient 4 : tron, soit deux particules en interaction, à trois dimen-
sions, soit 6 variables. Le même raisonnement nous mène
∂ 2 ψ(x) à estimer l’ordre de grandeur du problème à 1012 × 1012
Hψ = Eψ ≡ − + V (x)ψ(x) = Eψ(x)
∂x2 (toujours avec 100 points par variable) : même avec un
En discrétisant le problème de la façon habituelle, ordinateur très puissant, c’est sans espoir !
Conclusion : il ne suffit pas, pour résoudre un problème,
xi = i δx, Vi = V (xi ), ψi = ψ(xi )
de ≪ le mettre dans l’ordinateur ≫ et d’attendre que la
l’équation se reécrit : force brute de la machine fasse son œuvre. Il faut donc
faire des approximations.
ψi+1 − 2ψi + ψi−1
− + Vi ψi = Eψi
δx2
5.3.4.2 L’approximation de Born-Oppenheimer
Il est aisé de se convaincre que, chercher E et ψi , i ∈ [1, n],
revient à chercher les valeurs propres et les vecteurs pro- La première étape consiste à découpler les mouvements
pres d’une matrice (n×n) : si n est de l’ordre de 100, voire des électrons de ceux des noyaux beaucoup plus lourds
davantage, il n’y a rien de bien extraordinaire à cela. 5. en général, on renumérote les sites pour n’avoir qu’un seul
h̄2 indice ℓ = i + n(j − 1) + n2 (k − 1) dont on vérifie aisément qu’il varie
4. en posant = 1. de 1 à n3 .
2m
Physique numérique, Philippe Depondt 113
et beaucoup plus lents (c’est l’approximation de Born- de manière auto-cohérente : on choisit d’abord un ensem-
[0]
Oppenheimer). Pour le mouvement des noyaux, on se con- ble de fonctions d’onde d’essai ϕi (~ri ) qui permettent de
tente en général d’une dynamique classique. Cette dy- calculer les termes Ji,j . Cela permet de résoudre le système
namique est lente par rapport à celle des électrons, ainsi, [1]
d’équations qui donne de nouvelles fonctions ϕi (~ri ) et des
on fait l’hypothèse que le nuage électronique est toujours [1]
valeurs des énergies εi . De nouvelles valeurs de Ji,j sont
en équilibre, qu’il s’adapte instantanément à un change- [2]
alors calculées puis de nouvelles fonctions ϕi (~ri ) et ainsi
ment de configuration des noyaux. D’un point de vue
de suite jusqu’à ce que les solutions trouvées n’évoluent
quantique, il ne reste plus qu’à résoudre l’équation de
plus.
Schrödinger électronique : pour l’hydrogène, on revient à
C’est ce qu’on appelle la méthode de Hartree. Elle
un problème à une particule. Le problème reste cependant
présente un énorme défaut : a priori, les électrons sont
entier dès lors que l’on s’intéresse à, ne serait-ce qu’un
des fermions et leur fonction d’onde devrait être anti-
atome d’hélium isolé. Il faut donc encore aller quelques
symétrique, c’est-à-dire changer de signe par permutation
pas plus loin : il existe à ce titre plusieurs approches pos-
de deux électrons :
sibles.
ψ(~r1 , . . . , ~ri , ~rj , . . . , ~rn ) = −ψ(~r1 , . . . , ~rj , ~ri , . . . , ~rn )
5.3.4.3 Les méthodes de Hartree et Hartree-Fock
Si l’on choisit de remplacer cette fonction d’onde par un
Imaginons d’abord, pour simplifier, une fonction à deux simple produit de fonctions mono-électroniques, il est clair
variables ψ(x1 , x2 ) : on peut en faire un développement que cette propriété ne sera pas remplie. Pour régler cette
à un ordre quelconque par rapport à x2 , sur une base de question, on remplace ce produit pas un déterminant, ap-
fonctions appropriées ϕℓ2 (x2 ) : pelé déterminant de Slater :
X
ψ(x1 , x2 ) = cℓ2 ϕℓ2 (x2 ) χ1 (~r1 ) χ2 (~r1 ) ... χn (~r1 )
ℓ2 χ1 (~r2 ) χ2 (~r2 ) ... χn (~r2 )
ψ(~r1 , ~r2 , . . . , ~rn ) ∼
... ... ... ...
mais, évidemment, les coefficients du développement cℓ2 χ1 (~rn ) χ2 (~rn ) ... χn (~rn )
sont des fonctions de x1 , suscptibles d’un développement
analogue : X qui assure la propriété d’antisymétrie : si l’on permute
cℓ2 (x1 ) = aℓ1 ,ℓ2 φℓ1 (x2 ) deux électrons, cela revient à permuter deux lignes et
ℓ1 donc à changer le signe du déterminant. Ainsi corrigée,
et : la méthode s’appelle la méthode de Hartree-Fock : bien
X qu’assez lourde et nécessitant un travail non-trivial de
ψ(x1 , x2 ) = aℓ1 ,ℓ2 φℓ1 (x1 )ϕℓ2 (x2 )
modélisation des fonctions χℓ , elle est très utilisée, no-
ℓ1 ,ℓ2
tamment par les chimistes théoriciens, pour des calculs de
On peut, bien sûr généraliser ce genre de raisonnement fonctions d’onde moléculaires.
à un nombre quelconque de variables. Maintenant, l’ap-
proximation est faite d’entrée de jeu et elle est massive : 5.3.4.4 Théorie de la fonctionnelle densité
on remplace la fonction d’onde poly-électronique par un
produit de fonctions d’onde mono-électroniques, ce qui re- La théorie de la fonctionnelle densité (Density func-
vient à se limiter au premier ordre du développement : tional theory ou DFT 7 ) est, elle, une théorie, au départ,
exacte, mais dont la mise en œuvre pratique oblige à des
ψ(~r1 , ~r2 , ~r3 . . . , ~rn ) ∼ ϕ1 (~r1 ) ϕ2 (~r2 ) ϕ3 (~r3 ) . . . ϕn (~rn ) approximations.
L’idée qui sous-tend la méthode est que le détail des
On montre après quelques calculs 6 que le problème s’écrit : fonctions d’onde de tous les électrons n’est pas ce dont on a
réellement besoin : la densité électronique ρ(~r) suffit bien.
X N X Le résultat de cela, si c’était possible, serait de substituer à
− ∆i Zi
+ < ϕj |
1
|ϕj > ϕi (~ri )
2 ~I| |~ri − ~rj | une fonction compliquée de 3n variables ψ(~r1 , ~r2 , . . . , ~rn ),
I=1 |~ ri − R j
une fonction de trois variables, ρ(~r) telle que
Z
= εi ϕi (~ri ) ∀i 2
ρ(~r) = n |ψ(~r, ~r2 , . . . , ~rn )| d~r2 . . . d~rn
où ∆i est l’opérateur laplacien relatif à l’électron i :
Il n’est pas évident a priori qu’une telle opération soit
∂2 ∂2 ∂2
∆i = + 2+ 2 possible, car en considérant l’équation de Schrödinger, si
∂x2i ∂yi ∂zi on essaye d’intégrer, en multipliant à gauche par ψ ∗ , sur
toutes les positions, sauf une, pour faire apparaı̂tre la den-
R~ I la position du noyau I, ~ri celle de l’électron i
sité électronique,
et εi l’énergie de l’état ϕi . On obtient un système Z Z
d’équations couplées par l’intermédiaire du terme d’in-
1 ψ Hψ d~r2 . . . d~rn = ψ ∗ Eψ d~r2 . . . d~rn = E ρ(~r)
∗
naturellement. En revanche, le premier membre comporte En effet, la densité électronique ne fait pas apparaı̂tre ex-
un opérateur (avec des dérivées, etc.) que l’on ne peut pas plicitement ces effets 11 , il faut les introduire explicitement
commuter avec la fonction d’onde 8 . ≪ à la main ≫ pour ainsi dire. . . C’est ici que se situent les
Des théorèmes dûs à Hohenberg et Kohn montrent que approximations de cette théorie : les différentes variantes
si, dans l’approximation de Born-Oppenheimer, on écrit (qui s’appellent pour les plus répandues LDA et GGA)
l’Hamiltonien comme partent en général de l’approximation que ρ(~r) est essen-
tiellement homogène, ou du moins, varie lentement.
H = Te + Vee + Vext Les méthodes ab-initio ne sont donc pas des méthodes
sans hypothèse mais elle permettent néanmoins d’attein-
où l’on a décomposé en énergie cinétique des électrons dre les interactions interatomiques très précisément en ten-
(Te ), énergie potentielle d’interaction électron-électron ant compte, par exemple, de la déformabilité des nuages
(Vee ) et interaction électrons-noyaux (Vext ), les deux pre- électroniques en fonction des positions de noyaux.
miers termes ne dépendent que du nombre d’électrons, ils Leur gros défaut est que, même s’il existe des méthodes
sont pour ainsi dire universels. Le dernier terme dépend de calcul efficaces, ces méthodes sont terriblement voraces
des noyaux et donc du système étudié. L’énergie de l’état en temps de calcul !
fondamental peut alors s’écrire comme une fonctionnelle 9 Ainsi des ordres de grandeurs réalistes seraient :
de la densité électronique
Z <
N ∼ 300
E(ρ) = F (ρ) + ρ(~r)Vext (~r)d~r
τ ≃ 1ps
où F (ρ) regroupe les deux premiers termes universels et ρ Malgré ces défauts, elles ont leurs lettres de noblesse,
est la densité électronique -que l’on cherche- de l’état fon- par exemple, les phases à haute pression de la glace (li-
damental. Pour obtenir ρ, il faut alors chercher la fonction aison hydrogène) ou la silice vitreuse. Ces méthodes font
ρ qui rend E(ρ) minimum avec, bien sûr, la contrainte que l’objet de programmes, soit commerciaux, soit libres, qui
Z se répandent assez rapidement dans les laboratoires pour
ρ(~r)d~r = N devenir des outils relativement standards.
Cependant, comme on l’a vu, ces méthodes se limi-
le nombre d’électrons dans le système. tent à l’état électronique fondamental. . . lorsqu’on veut
La petite difficulté qui subsiste et que l’expression de s’attaquer à des états excités, pour comparer les calculs
F (ρ), bien qu’universelle, est inconnue ! (c’est quelque avec des expériences de spectroscopies diverses, il existe
chose comme < ψ|Te + Vee |ψ > mais le but de l’opération d’autres méthodes plus complexes et plus coûteuses encore
était justement d’ignorer les fonctions d’ondes). en ressources de calcul ! Autant dire que c’est un domaine
La méthode de Kohn et Sham 10 consiste à réaliser que, dans lequel la recherche est active en ce début du XXIe
puisque ce qui nous intéresse est la densité électronique siècle. . .
et non les fonctions d’onde, n’importe quel jeu de fonc-
tions d’onde qui donne la même densité électronique
est acceptable ! Ainsi, on remplace un système de N
électrons en interaction par N autres particules fictives
mais indépendantes ; chacune de ces particules fictives est
soumise à un potentiel effectif qui contient le potentiel
extérieur Vext et l’effet des électrons. On en arrive à une
théorie similaire à celle de Hartree-Fock, mais elle n’est
pas le résultat d’une approximation, elle est, jusqu’à ce
point au moins, exacte.
Z
E(ρ) = Ts (ρ) + EH (ρ) + ρ(~r)V (~r)d~r + Exc (ρ)
Optimisation de code.
L’optimisation de code n’est certes pas un sujet très ! les constantes sont calculees hors de la boucle
exaltant, surtout que les calculs décrits ci-dessus sont en pi = acos(-1.0)
général rapidement exécutés même sur un PC de puis- iomega = 2*pi*freq*(0.,1.) ! nbr complexe
sance médiocre. Il faut cependant être prudent : si l’on do it = itmin, itmax
ne fait pas attention, on arrive facilement à fabriquer des x = exp(iomega*it*dt)
problèmes très lourds ! Imaginons par exemple que l’on enddo
cherche, par Monte-Carlo-Metropolis, la structure d’un en-
semble de quelques dizaines de milliers d’atomes (un tout on imagine aisément que la seconde sera plus rapide !
petit échantillon) en interaction à diverses température
afin d’obtenir un diagramme de phase : la figure 4.49, 6.2 Utiliser les symétries.
par exemple, représente des journées de calcul. . . Les
méthodes ab-initio décrites dans le paragraphe précédent Le deuxième exemple est un peu plus élaboré : on doit
sont évidemment redoutablement voraces ! Il faut donc calculer, par exemple pour une simulation Monte-Carlo
utiliser des méthodes de programmation efficaces afin d’en l’énergie potentielle d’un ensemble d’atomes en interac-
réduire autant que possible le coût en ressources informa- tion :
tiques. Par exemple, si l’on arrive à optimiser un calcul de 1 X
V = vij (rij )
telle façon qu’au lieu de 24 heures, il n’en prenne que 15, 2
i,j,(j6=i)
non seulement le gain est appéciable dans l’absolu, mais
on peut espérer démarrer un calcul le soir avant de ren- soit sous forme de programme :
trer chez soi pour en récuperer les résultats le lendemain
v = 0.
matin : les ordinateurs sont des machines qui peuvent tra-
do i = 1, n
vailler la nuit sans inconvénient, leurs utilisateurs des hu-
do j = 1, n
mains qui préfèrent dormir. . .
if ( i /= j ) then
Une première précaution à prendre est d’utiliser les op-
rij = sqrt( (x(i)-x(j))**2 + &
tions d’optimisation du compilateur, par exemple avec
(y(i)-y(j))**2 + (z(i)-z(j))**2 )
g95 :
v = v + energie(rij)
g95 -O3 simul.f90 -o simul
endif
où l’option -O3 dit au compilateur de chercher à optimiser
enddo
le code proposé 1 . Le compilateur néanmoins, même s’il est
enddo
parfois étonnament efficace, ne peut pas tout faire et il est
v = v/2
prudent d’appliquer soi-même quelques règles simples.
ce qui donne n(n − 1) calculs d’énergie à faire. Or, on cal-
cule ici la même énergie deux fois : vij et vji , c’est inutile.
6.1 Éviter les calculs inutiles n(n − 1)
Si l’on s’y prend un peu mieux, il n’y a que paires
2
C’est une consigne qui paraı̂t stupide à première vue, (i, j) : en pratique, le programme ci-dessus fait deux fois
cependant, si l’on compare les deux séquences suivantes : trop de calculs !
Celui qui est donné ci-dessous est nettement meilleur :
! les constantes sont calculees dans la boucle
do it = itmin, itmax do i = 1, n-1
t = i*dt ; pi = acos(-1.0) do j = i+1, n
omega = 2*pi*freq rij = sqrt( (x(i)-x(j))**2 + &
x = exp((0.,1.)*omega*t) ! exp complexe (y(i)-y(j))**2 + (z(i)-z(j))**2 )
enddo v = v + energie(rij)
enddo
et enddo
1. il y a en général plusieurs degrés d’optimisation : -O1, -O2, Ainsi donc, la simple étude préalable de la symétrie d’un
-O3. Sur un PC avec un processeur Pentium, on peut tenter aussi :
-mtune=pentium4. Chaque compilateur a ses propres options, plus
problème permet parfois des gains considérables : point
ou moins adaptées à tel ou tel processeur : c’est parfois un peu n’est besoin de refaire plusieurs fois un calcul qui donnera
labyrinthique. . . toujours, pour des raisons de symétrie, le même résultat.
115
116 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
b(i,k) dans s(k) et utiliser s dans le produit, puis faire 6.6 Ne pas réinventer ce qui existe
la même chose pour a).
Évidemment, tout ceci suppose d’entrer un peu dans
déjà
l’architecture de l’ordinateur que l’on utilise, mais l’essen- En général, les bibliothèques de calcul scientifique,
tiel des machines en service actuellement suit peu ou prou quand il y en a, implantées sur un ordinateur donné sont
la même logique et un programme efficace sur un PC a de optimisées pour l’architecture de cette machine. Donc,
bonnes chances de l’être également sur d’autres machines sauf cas particulier, il est souvent plus efficace en termes
(j’ai écrit et optimisé des programmes sur un PC 486 - de temps de calcul (pour ne pas parler du temps de pro-
déjà périmé à l’époque - sous DOS qui se sont révélés très grammation) d’utiliser un sous-programme pris dans une
efficaces sur. . . CRAY, une machine vectorielle de concep- bonne bibliothèque installée par un professionnel que de
tion très différente : seulement l’une et l’autre travaillaient chercher à réinventer la roue. . . De même, en dehors de
efficacement sur les tableaux de nombres contigus). toute considération d’optimisation suivant une architec-
Ce qui est vrai des données l’est aussi pour les instruc- ture donnée, il existe un bagage énorme d’algorithmes ef-
tions du programme. Les instructions qui se suivent dans ficaces qu’il serait stupide de ne pas utiliser : ainsi la FFT
un programme se suivent également en mémoire, mais l’ap- est considérablement plus rapide que :
pel à un sous-programme ou à une fonction brise souvent
cette séquence ce qui produit en général un appel à la do k = 1, n
mémoire vive et donc un ralentissement. Afin de conserver s(k) = (0.,0.)
l’avantage considérable de la programmation structurée do l = 1, n
permise par les sous-programmes et fonctions, les compi- s(k) = s(k) + f(l)*exp((2*pi*i*k*l)/n)
lateurs permettent en général ce que l’on appelle l’≪ in- enddo
lining ≫, c’est-à-dire qu’ils recopient un sous-programme enddo
beaucoup utilisé directement dans le programme appelant
et un programme de tri suivant un algorithme éprouvé sera
de façon que les instructions se succèdent en mémoire.
vraisemblablement plus efficace, parfois de plusieurs ordres
Donc, si l’on a écrit une structure qui ressemble à :
de grandeur, que ce que l’on aura pu inventer soi-même.
Il est vrai qu’il faut alors enquêter pour savoir ce qui est
do i = 1, beaucoup
disponible sur une machine donnée, les syntaxes d’appel
call machin(arg1,arg2,...)
(nature, type des arguments, etc.). Il faut généralement
enddo
aussi indiquer lors de la compilation que l’on utilise telle
il peut être habile de consulter le manuel du compilateur ou telle bibliothèque : la plupart des compilateurs utilise
utilisé afin de chercher à invoquer l’in-lining. l’option -lnom de la bibliothèque. Par exemple, pour lin-
pack (qui contient des FFT entre autres) :
g95 -O3 machin.f90 -llinpack -o machin
—
6.5 Eviter les interruptions En fin de compte, si malgré tous ses efforts, un pro-
gramme prend à l’exécution un temps prohibitif, il reste
Imaginons un calcul du champ magnétique subi par un
deux possibilités : 1o limiter ses ambitions ou 2o utiliser
spin, dû à tous les autres spins :
une machine plus puissante, ce qui signifie en général
X s’adresser à un centre de calcul disposant d’ordinateurs
~i =
H ~ ij
H puissants et s’attaquer à de la programmation parallèle,
j
j6=i c’est-à-dire utiliser plusieurs processeurs simultanément.
do i = 1, n
hij(:) = (expression)
h(i) = sum(hij(1:i-1)) + sum(hij(i+1:n))
enddo
do i = 1, n
hij(:) = (expression)
hij(i) = 0.
h(i) = sum(hij)
enddo
High performance computing ! Calcul scientifique in- avec quatre processeurs en pipe-line, s’exécutera de la
tensif ! Teraflops ! Petaflops ! Exaflops ! Ce sont des façon suivante :
expressions-clefs que l’on voit apparaı̂tre de façon cycle proc 1 proc 2 proc 3 proc 4
récurrente pour dire que l’on calcule toujours plus, sur 1 lit b(1) . . .
des problèmes toujours plus gros. . . Or, si les puissances 2 lit b(2) lit c(1) . .
de calcul des processeurs croissent à une vitesse qui donne 3 lit b(3) lit c(2) b(1)+c(1) .
4 lit b(4) lit c(3) b(2)+c(2) écrit a(1)
le vertige, les besoins en calculs lourds croissent encore
- - - - -
plus vite. De plus, bien des raisons portent à croire que i b(i) c(i-1) b(i-2)+c(i-2) a(i-3)
la limite de ce que l’on peut faire en la matière n’est pas - - - - -
très loin : bien sûr, ce genre de prédiction est vouée à être De cette manière, au i-ième cycle, le premier processeur
démentie d’une façon ou d’une autre, toutefois, l’évolution va chercher en mémoire le i-ième élément de b, le deuxième
des stratégies d’équipement des centres de calcul semble le i-1-ième élémént de c, le troisième fera l’addition des
montrer que cette préoccupation est partagée. i-2-ièmes et le quatrième processeur écrira en mémoire
Une option séduisante est alors d’associer plusieurs le i-3-ième résultat : les quatre processeurs travaillent à
unités de calcul dans un même ordinateur ou de lier 100% ! On réalise aisément que le démarrage et la fin de ce
plusieurs ordinateurs pour qu’ils puissent joindre leurs processus ne seront pas optimum, ce qui fait que ceci n’a
forces sur un problème donné. Par exemple, la plupart des aucun intérêt sur des tableaux de, mettons, 3 éléments. . .
processeurs comportent des unités distinctes spécialisées mais avec des tableaux de quelques milliers d’éléments, on
dans les additions et multiplications de nombres réels. En a quasiment gagné un facteur 4.
général, lorsqu’on soumet une instruction complexe asso- On appelle cela une machine ≪ vectorielle ≫.
ciant additions et multiplications, ces unités peuvent tra-
Pour tirer partie efficacement d’une telle architecture,
vailler simultanément sur des morceaux différents de l’in-
l’effort n’est pas énorme : il faut travailler sur des tableaux
struction. On peut toutefois aller beaucoup plus loin.
avec des logiques assez simples, pour ne pas interrompre
le pipe-line. C’est assez similaire à ce qui a été dit du
7.1 L’architecture vectorielle bon usage des caches. L’expérience prouve qu’en général,
un code efficace sur une machine classique, donnera de
L’architecture dite ≪ pipe-line ≫ permet d’associer, pour bonnes perforances sur une machine vectorielle.
ainsi dire ≪ en tuyau ≫ plusieurs processeurs à la suite La facilité de programmation de ces machines a fait
les uns des autres qui travaillent en suivant le principe leur succès : certains CRAY des années 1990 en partic-
≪ je fais ma petite part de travail et je passe à mon ulier avaient des registres de très grande taille capable de
voisin ≫. Un exemple élémentaire est tout simplement stocker un grand nombre d’éléments de tableau afin de
l’existence de mémoires-tampon : si l’on envoie un texte tirer parti de la rapidité d’accès aux registres et l’on obte-
ou une image en impression sur une imprimante, celle-ci nait aisément ainsi de très bonnes performances de calcul
est très lente par rapport au processeur de l’ordinateur ;
pour l’époque.
donc en pratique, on envoie la tâche d’impression dans une
mémoire dite ≪ tampon ≫(ou buffer ) de telle façon que le Ce sont toutefois des technologies coûteuses dont les lim-
processeur puisse s’occuper d’autre chose pendant l’im- ites sont assez vite apparues : on verra ce que l’avenir
pression. Plus sérieusement, lorsqu’on travaille dans une réserve, mais il ne semble plus que cette voie continue à
boucle avec des instructions composites sur des tableaux, être activement explorée par les constructeurs, même si
chaque processeur fera quelque chose (une addition par des ordinateurs comportent une part de vectorisation.
exemple) sur un élément du tableau et passera le résultat
à son voisin, et sans attendre que ledit voisin ait fini son
travail, passera à l’élément suivant du tableau. Ainsi, tous 7.2 Parallèlisme
les processeurs travaillent en même temps sur des éléments
différents du tableau. Par exemple, la boucle :
Le parallèlisme consiste à tenter de répartir un cal-
do i = 1, n cul sur plusieurs processeurs différents de façon que les
a(i) = b(i) + c(i) données sur lesquelles ils travaillent soient différentes mais
enddo les instructions exécutées peuvent être identiques (Single
119
120 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
Instructions Multiple Data) ou différentes (Multiple In- en proposer des centaines, voire des milliers (on commence
structions Multiple Data). En pratique, les problèmes sont à parler de calculs répartis sur des dizaines de milliers de
différents selon que l’on travaille avec un petit nombre de processeurs).
processeurs (ou plutôt de cœurs ; en gros 4 ou 8) qui parta-
gent le même espace mémoire (mémoire partagée ou shared 7.2.2 Mémoire distribuée
memory) ou un grand nombre de processeurs qui utilisent
chacun un espace mémoire propre (mémoire distribuée ou Une autre solution consiste à répartir explicitement
distributed memory) : dans ce cas la communication en- le travail sur les processeurs, tel processeur devant faire
tre processeurs se fait par un réseau qui est généralement tel morceau du programme sur telles données, tel autre
optimisé pour ralentir le moins possible les calculs. processeur faisant autre chose sur d’autres données. En
anglais, on appelle cela Multiple Instructions Multiple
Data ou MIMD. Chaque processeur fait son travail
7.2.1 Mémoire partagée
spécifique sur ses données. La difficulté est la synchronisa-
C’est une situation assez fréquente et qui le devient tion de ce beau monde, car il arrive que ce que doit faire
de plus en plus : un ordinateur contient plusieurs pro- un processeur dépende du résultat d’un calcul fait par un
cesseurs, parfois multi-cœurs qui partagent le même espace autre, sinon, il suffirait de prendre plusieurs ordinateurs
mémoire. On peut alors donner des directives de compila- indépendants qui feraient les calculs séparément. Il existe
tion, c’est-à-dire des instructions au compilateur, du type des bibliothèques de programmes de passage de messages
≪ parallélise-moi ce morceau de programme ≫, et le com- (comme MPI pour Message Passing Interface) qui perme-
pilateur, si on lui donne les bonnes options, parallélise. . . ttent de faire communiquer les processeurs entre eux et les
presqu’automatiquement. forcer à s’attendre les uns les autres pour s’échanger les
En pratique on utilise généralement OpenMP (pour données dont ils ont besoin. Ainsi, dans un programme,
Open MultiProcessing) qui est librement distribué : en on appelle des sous-programmes de bibliothèque, par ex-
fortran cela apparaı̂t comme des commentaires du type : emple :
!$OMP PARALLEL call MPI_SEND(....)
ou
pour envoyer des données d’un processeur à un autre. En
!$OMP END PARALLEL
de telle sorte qu’un compilateur ≪ non averti ≫ (c’est-à- effet, mettons que l’on soit en train de faire un calcul de
dire qui ne connait pas OpenMP ou auquel on n’a pas type Monte-Carlo-Metropolis, il faut calculer toutes les
fourni l’option de compilation appropriée) puisse compiler interactions i-j, or il faut répartir les atomes entre les
le programme sans tenir compte de ces directives. Au con- processeurs : un processeur donné doit donc disposer des
traire, le compilateur qui connait OpenMP va tenir compte positions de tous les atomes, et non seulement de ceux dont
de tout ce qui commence par !$OMP. On écrira alors des il a la charge. En fin de course, il faut additionner toutes
choses comme : les énergies et donc concentrer sur un processeur toutes
!$OMP PARALLEL
les énergies partielles calculées sur tous les processseurs :
do i = 1, n encore des communications entre processeurs.
... La gestion de ceci par l’utilisateur est plus difficile car il
enddo faut gérer explicitement par programme tous ces échanges,
!$OMP END PARALLEL et équilibrer les charges de travail des processeurs de façon
à ne pas perdre trop de temps dans les attentes.
et le compilateur répartit la boucle sur les processeurs
disponibles, chacun prenant sa part de données. Il faut
cependant être assez prudent : tous les processeurs
utilisent la même mémoire, il y a donc le risque qu’ils
écrasent le travail de leurs voisins ! Certaines variables
peuvent donc être déclarées comme privées, c’est-à-
dire qu’elles sont dupliquées en autant d’exemplaires
qu’il y a de processeurs, afin qu’elles soient utilisées
indépendamment par chacun :
!$OMP PARALLEL PRIVATE(X, Y, Z)
do i = 1, n
...
enddo
!$OMP END PARALLEL
Le langage fortran est ≪ LE ≫ langage de program- // inclure les entrées-sorties par fichiers
mation scientifique par excellence : il a été fait pour cela #include <fstream>
et il a constamment évolué depuis les années 1950 pour
s’adapter. La version actuellement la plus utilisée a été // inclure les cha^
ınes de caractères
définie en 1990 et légèrement modifiée en 1995. Les com- #include <string>
pilateurs correspondants sont progressivement apparus à
// inclure les fonctions mathématiques
la fin des années 1990. Une norme 2003 a été définie et
#include <cmath>
de nouveaux compilateurs devront voir le jour également
dans quelques années (g95 commence à inclure des aspects Les symboles // indiquent les commentaires sur la fin de
2003 en plus de la norme fortran95) : ainsi l’évolution la ligne ; si on veut mettre un commentaire sur plusieurs
se poursuit. lignes : /* ... */.
Toutefois, il y a une maxime importante qui est que : Toujours dans le cadre du ≪ je ne sais rien faire ≫,
≪ le meilleur outil est celui que l’on maı̂trise bien ≫. Pour
C++ prévoit que l’on puisse avoir envie d’utiliser des
des raisons diverses, le langage C est largement répandu noms génériques de fonctions pour des usages particuliers,
et enseigné : or tout ce qui est dit et fait dans le présent d’où risque de conflit. On peut donc définir un namespace
polycopié peut être traité en C ; il faut bien sûr lui re- (ou espace de noms) particulier pour éviter cela. Sinon (ce
connaı̂tre ses lettres de noblesse car le système Unix (et qui est le cas général), on doit préciser que l’on veut utiliser
par conséquent Linux) est écrit en C et c’est un succès re- l’espace de noms standard : using namespace std ; (ne
marquable. Le C en tant que langage de programmation pas oublier le point-virgule).
scientifique date des années soixante-dix et peut être con- Avant donc le début du programme, de toute fonction,
sidéré comme largement obsolète : le C++ a pris la suite. ou de déclarations, il faut ces directives et cet espace de
Ce développement ne répond cependant pas ou mal aux noms.
limitations du C pour ce qui est du calcul scientifique et S’il n’y a pas de variables globales ou de fonctions, on
fortran95 reste plus commode à l’usage 1 , mais en vertu peut alors attaquer le programme principal. Celui-ci s’ap-
de la maxime ci-dessus, ceux qui ont une bonne maı̂trise pelle toujours main( ) et n’a pas de type ; en fait, on peut
du C peuvent vouloir rester dans un monde familier, d’où aussi le mettre en int (entier). Le début du programme
les présents Éléments de C++ (qui ne remplacent pas est marqué par une accolade ouvrante et sa fin par une ac-
un vrai cours). Ce langage ne manque pas de charme : il colade fermante. On obtient donc quelque chose qui peut
permet des exercices de voltige informatique admirables ressembler à :
d’élégance quoique souvent. . . périlleux !
#include <iostream>
#include <fstream>
#include <string>
8.1 Avant même de commencer #include <cmath>
Il faut savoir qu’a priori C++ ≪ ne sait rien faire ≫ : using namespace std ; // espace de noms standard
c’est un choix explicite, il faut lui indiquer que l’on a be-
soin de choses aussi élémentaires que les entrées-sorties, les // programme principal
chaı̂nes de caractères et les fonctions mathématiques stan- main( )
dards ! En pratique, tout programme commence donc par // accolade : debut du ’bloc’ du programme principal
des directives au préprocesseur marquées par un # (dièze) : {
cout << "Hello world" << endl ;
} // accolade : fin du bloc du programme principal
// Directives au préprocesseur
// inclure les entrées-sorties d’écran
#include <iostream> On notera l’instruction cout d’écriture et sa syntaxe très
différente de celle du langage C (pour ne pas parler du
1. Lors d’un colloque, quelqu’un qui simulait des problèmes de fortran. . .). endl signifie end of line (fin de ligne) : il
combustion complexe dans des turbines aéronautiques, à qui on de- s’agit de passer à la ligne à la fin de l’écriture, ce qui n’est
mandait si ses programmes étaient en C++, répondit non parce que :
pas le mode par défaut, il faut le préciser.
1o ≪ C++, ça rame ! ≫ (je cite) et 2o on pouvait laisser un nouveau
chercheur intervenir sur un code en fortran au bout de quelques On notera que toutes les instructions se terminent par
semaines de formation, ce qui était totalement exclu en C++. . . un point-virgule ; : C++ ignore les espaces et les sauts
121
122 Licence de physique L3: PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
de lignes. Non seulement une même instruction peut être On peut aussi écrire des choses comme
répartie sur plusieurs lignes, mais on peut mettre autant for ( float x=x_min ; x<=x_max ; x=x+dx ) { in-
de sauts de ligne que l’on veut au milieu de l’instruction. . . structions. . .}
Ceci se compile de façon très classique par la com- ou encore
mande : while(condition) {instructions. . .}
c++ hello.cpp -o hello et
le suffixe cpp indiquant qu’il s’agit bien d’un programme do {instructions. . .} while(condition)
en C++.
8.3.2 Conditions
8.2 Déclarations On a évidemment :
if ( condition ) { instructions. . . } else { instruc-
Les variables doivent être déclarées : les types de base tions. . . }
sont int (entier), float (réel), double (double précision), Attention, pour les habitués du fortran, il n’y a pas de
char (caractère) et bool (booléen). En C++ comme then. . .
en C, le type complexe n’existe pas. Les noms Il y a une variante :
de variables obéissent aux règles habituelles, seulement, z = ( condition ) ? x : y ;
C++ distingue entre les lettres majuscules et minuscules qui équivaut à
(Resultat est différent de resultat, les mots-clefs du lan- if ( condition ) z = x ; else z = y ;
gage étant en lettres minuscules : float et non FLOAT ou Les conditions s’écrivent sans grande origi-
Float) nalité : x >= y, y != z (différent de), a == b ou
En revanche les déclarations peuvent être faites n’im- a < b && y <= u où && signifie et, et ou s’écrit ||.
porte où dans le programme à condition que ce soit
1o avant la première utilisation et 2o dans le même bloc. 8.3.3 Sauvegardes
Ainsi, dans le programme suivant qui comporte une boucle
faisant varier la variable entière step de 1 à 100 : Si l’on veut écrire des résultats dans un fichier, il faut
l’ouvrir, écrire, puis le fermer : ce n’est pas bien original,
#include <iostream> par exemple,
#include <fstream>
#include <string> // ouverture du fichier Calcul.res
#include <cmath> ofstream fichier("Calcul.res") ;
using namespace std ; for( int i = 0 ; i < i_max ; i++)
fichier << i<< " " << x[i] << endl ; // écriture
main( ) fichier.close() // fermeture
{
/* déclaration de 2 nombres réels
pour tout le programme */ 8.4 Tableaux
float t, dt=0.1 ;
8.4.1 Tableaux de taille fixe
// boucle et déclaration de step Il n’y a ici rien de très original :
for ( int step = 1; step <= 100; step++ )
{ t = step*dt ; cout << t << endl ; } #include <iostream>
// fin de la boucle et fin du ’bloc’ où step est défini #include <fstream>
#include <string>
/* si on met ici une référence à step, #include <cmath>
ça ne marchera pas ! */ using namespace std ;
// cout << step << endl ; // donc, NE PAS décommenter !
} int main( )
/* la taille du tableau doit ^ etre définie
la variable step n’est déclarée que pour la boucle qui par une constante entière */
constitue le bloc pour lequel elle est déclarée. Si on es- { int const n=100 ;
saie de compléter le programme en ajoutant la ligne float x[n] ; // déclaration du tableau
cout << step << endl ; entre l’accolade qui termine
la boucle et l’accolade finale, on obtiendra une erreur for ( int step = 0; step < n; step++ )
{ x[step] = step ; cout << x[step] << endl ; }
à la compilation. Le début et la fin de la boucle sont
}
évidemment marqués par les accolades.
On notera néanmoins quelques points importants : 1o on
ne peut pas délimiter les tableaux comme on veut (par ex-
8.3 Structures de base diverses emple x[-5:5] n’est pas permis), car on se borne à donner
le nombre d’éléments du tableau, et 2o le premier élément
8.3.1 Boucles du tableau est l’élément zéro (les bornes de la boucle sont,
dans l’exemple ci-dessus, 0 et 99, soit n-1).
On a déjà vu : Les tableaux à plusieurs dimensions existent, ce
for ( int i = debut ; i < fin ; i++ ) {instruc- sont simplement des tableaux de tableaux (on omettra
tions. . .} dorénavent dans les exemples les préliminaires #include
où debut et fin sont des entiers. et using) :
Physique numérique, Philippe Depondt 123
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éclaration du tableau dynamique // définition de la fonction après 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 Passage d’arguments par valeur
Ici, la taille n du tableau est une vraie variable que l’on Imaginons que l’on tente de modifier la valeur de l’ar-
entre au clavier à la demande (voir au passage la syntaxe gument i dans la fonction :
de la saisie au clavier). Le tableau disparaı̂t dès que l’on
sort du bloc où il a été défini (dans cet exemple, c’est le #include <iostream>
programme principal, donc il ne disparaı̂t qu’au moment #include <fstream>
de la fin du programme). #include <string>
#include <cmath>
using namespace std ;
8.5 Fonctions
int machin(int) ;
C++ n’a pas le concept de subroutine, il faudra donc int main( )
utiliser quelques astuces ; de plus, les fonctions doivent être { int j = 5 ;
définies avant d’être utilisées sauf si l’on définit un proto- cout << j << " " << machin(j) << " " << j << endl ;
}
type.
int machin(int i)
8.5.1 Une fonction très simple {
i = 3*i+1 ; // ici, la variable i est modifiée
Voici un exemple élémentaire : return i ;
#include <iostream> }
#include <fstream>
ce programme répond : 5 16 5, autrement dit, la vari-
#include <string>
#include <cmath> able j du programme principal n’est pas modifiée par la
using namespace std ; fonction machin, alors que le calcul s’effectue bien dans la
fonction. C’est que l’argument j est passé ≪ par valeur ≫ :
/* début de la fonction entière machin la valeur de j est transmise à la fonction, mais j n’est pas
avec un argument entier */ modifiée.
int machin(int i)
{
return 3*i+1 ; // calcul de la valeur de la fonction 8.5.4 Passage d’arguments par référence
} // fin de la fonction Le passage par référence consiste à passer la variable
comme une valeur de pointeur, c’est-à-dire une adresse
int main( ) // programme principal qu’on ne peut pas modifier, alors que la la valeur vers
{ laquelle on pointe peut, elle, être modifiée :
cout << machin(5) << endl ; // appel de la fonction
} //prototype avec passage par référence
int machin( int &) ;
La fonction est définie avant le programme principal qui
l’appelle. int main( )
{ int j = 5 ;
cout << j << endl ; // écriture de j initial
8.5.2 Prototype
cout << machin(j) << endl ; /* écriture de la valeur
Le prototype permet de ne définir la fonction qu’après de la fonction */
son appel, il consiste simplement en une déclaration du cout << j << endl ; } // écriture de j modifié
type de la fonction et des types de ses arguments, ainsi :
// fonction avec passage par référence
#include <iostream> int machin(int & i)
#include <fstream> {
#include <string> i = 3*i+1 ;
#include <cmath> return i ;
using namespace std ; }
16 Babar : 120.32
16 Céleste : 180.25
La variable j a bien été modifiée. L’intérêt est bien sûr de Définissons maintenant une fonction dans la classe :
généraliser ceci à plusieurs variables afin d’obtenir quelque
chose qui ressemble à une subroutine : class client
{
// prototype (type void) public :
void machin( float &, float &, float &) ; string nom ;
float montant ;
int main( ) void client_print() ; // fonction dans la classe
{ float p = 5, q =6, r ; } ;
cout << p << " " << q << endl ;
machin(p,q,r) ; // p, q, et r sont modifiés void client :: client_print() /* définition de la
cout << p << " " << q << " " << r << endl ; fonction : elle est de type void et se réfère à la
} classe client. Noter le :: */
{
// fonction de type void (c’est-à-dire, sans type) cout << nom << " : " << montant << endl ;
void machin(float & a, float & b, float & c) } ;
{ //---------------------------------------
a = a/2 ; b = 3*a- b ; c = a + b ; int main()
} {
client a, b ;
a.nom = "Babar" ; a.montant = 120.32 ;
8.6 Les classes b.nom = "Céleste" ; b.montant = 180.25 ;
C’est la grande nouveauté introduite par C++ par rap- // l’impression est devenue plus simple
port à C et c’est ce qui ouvre la voie vers la programmation a.client_print() ;
orientée objet. En pratique, l’idée est très proche de celle b.client_print() ; // noter la syntaxe
des types dérivés du fortran95, mais c’est conçu assez }
différemment. Les classes peuvent contenir des fonctions
et des opérateurs, ce qui les différencient des structures Puisque le type complex n’existe pas en C++,
(struct) du C. Voici une classe élémentaire : fabriquons-le. Il faut à la fois définir le type (c’est un objet
composé de deux nombres réels, les parties réelle et imag-
#include <iostream> inaire), des fonctions spécifiques (extraire la partie réelle
#include <fstream> ou la partie imaginaire, par exemple) et des opérations
#include <cmath> (addition, produit, etc.). Pour commencer, quelque chose
#include <string> de simple :
using namespace std ;
class complex // Definition de la classe complex
class client // définition de la classe {
{ public :
/* ces variables sont publiques // parties réelles et imaginaires
et donc accessibles de l’extérieur */ float RealPart, ImagPart ;
public : void Zprint() ; // fonction
string nom ; } ;
float montant ; /* client comporte donc
une chaine et un réel */ void complex :: Zprint() // fonction pour imprimer
} ; // attention, ici il y a un point-virgule {
cout << "(" << RealPart << "," << ImagPart << ")" ;
//-------------------------------------------- }
int main() //--------------------------------------------------
{ int main()
// déclaration de deux variables de type client {
client a, b ; complex z1 ;
// initalisation du nom du client a z1.RealPart = 1. ; z1.ImagPart = 2. ;
a.nom = "Babar" ; z1.Zprint(); cout << endl ;
/* initialisation du montant de la transaction }
pour le client a */
Il n’y a ici rien de nouveau. D’ailleurs ça répond :
a.montant = 120.32 ;
b.nom = "Céleste" ; // idem pour b (1,2)
b.montant = 180.25 ;
Maintenant, il faut définir des opérateurs d’addition et de
cout << a.nom << " : " << a.montant << endl ; multiplication :
cout << b.nom << " : " << b.montant << endl ;
} class complex
{
public :
Noter comment on accède aux composantes des variables. float RealPart, ImagPart ;
Après exécution, ce programme répond : void Zprint() ;
126 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
127
128 Licence de physique L3 : PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
et l’on veut que cette dérivée soit nulle : où Ms est l’aimantation à température nulle et Tc la
solve(%,v); température au-dessus de laquelle l’aimantation est nulle.
(1/3) On peut tenter de résoudre cette équation à l’aide de
%1 4 a (−3 b R T + a) 2a Maple, afin d’obtenir une expression de l’aimantation M
+ (1/3)
+ ,
3RT 3 R T %1 3 RT en fonction de la température T . Cela donne :
(1/3)
%1 2 a (−3 b R T + a) 2a solve(tanh(Tc/T*M/Ms)=M/Ms,M)
− − (1/3)
+ +
6RT 3 R T %1 3 R!
T 2
(1/3) RootOf( Z T (e Z )2 + Z T −Tc (e Z )2 +Tc)
1 √ %1 4 a (−3 b R T + a) Ms e −1
I 3 − (1/3)
,
2 3RT 3 R T %1 2
(1/3) eRootOf( Z T (e Z )2 + Z T −Tc (e Z )2 +Tc) + 1
%1 2 a (−3 b R T + a) 2a
− − (1/3)
+
6RT 3 R T %1 3 RT! On n’est guère plus avancé : ≪ RootOf ≫ signifie ≪ racine
(1/3)
1 √ %1 4 a (−3 b R T + a) de ≫ autrement dit, Maple ne sait pas répondre à la
− I 3 −
2 3RT 3 R T %1
(1/3) question. Tentons donc une résolution numérique, en nous
%1r := a (−36 a b R T + 27 b2 R2 T 2 + 8 a2 + plaçant pour simplifier dans un système d’unités dans
3 b (8 a − 27 b R T ) 2 2 lequel Ms = 1 et Tc = 1 :
3b − R T ) f:=T->fsolve(tanh(M/T)=M,M);
RT
2. On a commencé par définir une fonction de deux variables M
f := T → fsolve(tanh( ) = M, M )
f (a, b), puis on a demandé un graphe tri-dimensionnel. T
3. Au passage, on notera qu’il ne donne qu’une solution, alors
qu’il y en a une infinité. . . plot(f,0..1);
Physique numérique, Philippe Depondt 129
9.2.4 Le projectile
1
eq2 := diff(z(t),t$2)=-g-k/m*diff(z(t),t)
–0.8
sqrt(diff(x(t),t)**2+diff(z(t),t)**2);
q
∂ ∂ ∂
–1
0 0.2 0.4 0.6 0.8 1 ∂2 k ( ∂t z(t)) ( ∂t x(t))2 + ( ∂t z(t))2
eq2 := 2 z(t) = −g −
C’est mieux, mais on préfèrerait une solution positive ; im- ∂t m
posons 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
2
z(t) = RootOf t− 1/RootOf − f m
M
tanh( ) Z
T = 1, M, 0..1 Z
f m2 (3 m2 c 3 + 9 m2 g c 2 − 2 f 4 g k2 + 2 m2 g 3 + 8 m2 g 2 c)
h := T → fsolve − d c Z2
M c 3 (5 m2 g c 2 − f 4 g k2 + m2 g 3 + 4 m2 g 2 c + 2 m2 c 3 )
(
!
− C1 Z 2 d f + C2 dt + C3 ,
plot(h,0..1);
1 Z p
(m g + %1 − k ( ∂ z(t))2 ) (m g + %1 + k ( ∂ z(t))2 )
∂t ∂t
x(t) = dt + C1 ,
( ∂ z(t)) k
0.8
Z p ∂t )
(m g + %1 − k ( ∂ z(t))2 ) (m g + %1 + k ( ∂ z(t))2 )
∂t ∂t
x(t) = − dt + C1
0.6 ( ∂ z(t)) k
∂t
2
%1 := m ( ∂ z(t))
0.4 ∂t2
0.2
C’est plutôt indigeste (même réduit), mais on retrouve le
célèbre ≪ RootOf ≫ qui signifie que Maple ne sait pas
0 0.2 0.4 0.6 0.8 1
résoudre le problème !
Essayons numériquement :
Cela a bien l’allure attendue de l’aimantation en fonction
g:=9.81;
de la température avec la transition de phase pour T = Tc .
g := 9.81
En revanche, on constate deux choses : 1o Maple ne sait
résoudre formellement que les problèmes qui ont une solu- k := 1;
tion analytique, 2o le calcul numérique effectué par le logi- k := 1
ciel n’est pas magique : la procédure suivie et les difficultés
rencontrées sont les mêmes que lors du calcul numérique m := 1 ;
fait avec un programme personnel, Maple apporte simple- m := 1
ment le fait qu’il n’est pas besoin de programmer soi-même inc:={x(t),z(t)};
la recherche de zéro, ainsi que la convivialité de l’interface
graphique incorporée. inc := {x(t), z(t)}
130 Licence de physique L3 : PHYTEM, Université 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.7
0.6
s:=dsolve({eq1,eq2,condini },inc,type=
numeric); 0.5
z
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 0.3 0.4 0.5 0.6 0.7 0.8
x
fy := u->subs(s(u),z(t));
plot(’[fx(t),fy(t),t=0..10]’,x=0..2,y=-0.01..1);
1
est le pas de temps utilisé, 3o la syntaxe (les subs en par-
ticulier) n’est pas particulièrement limpide. On admettra
0.8 sans grande difficulté que pour un problème simple comme
celui-ci, ces défauts ne sont sans doute pas rédhibitoires.
0.6
9.2.4.2 Fortran
#! /usr/bin/octave -qf
Il est aisé de vérifier à l’aide de quelques lignes de pro-
function proj = f(x,t)
gramme que l’on obtient la même chose par les moyens
habituels : k = 1 ; m = 1 ; g = 9.81 ;
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
c = k/m*dt ; gdt = g*dt ! constantes # et nbr de pas
x=0.; z=0.; vx = 10.; vz = 10.; t = 0. ! cond. init. x=lsode("f",x0,t); # resolution
open(1,file=’project.res’) gset nokey; # commandes gnuplot
write(1,*) t, x, z, vx, vz gset yrange[0:1]; gset xrange[0:2];
do step = 1, nstep ! verlet gset xlabel ’x’; gset ylabel ’z’;
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, évidemment, une fois de plus la même figure
Ce qui donne la figure 9.2. (fig. 9.3).
En termes de convivialité, Maple s’en sort plutôt bien Les commentaires en termes d’absence de choix de l’al-
grâce au graphisme intégré. Il a toutefois des défauts de gorithme seraient les mêmes 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é d’in-
utilisé (probablement Runge-Kutta), 2o on ne sait pas quel clure dans la liste des commandes graphiques.
Physique numérique, Philippe Depondt 131
ce que le programme a fait pendant ce temps. . . Un autre (en rouge), et celle en − 1r + 10r12 (en vert). Il est aisé
utilisateur qui aurait ouvert une autre session entre-temps de calculer qu’avec 500 astéroı̈des et un rayon d’orbite
peut très bien ne pas s’apercevoir qu’il y a quelque chose moyen r = 1, la distance moyenne entre deux astéroı̈des
qui tourne en même temps que ses propres applications ! est un peu plus grande que la distance à laquelle le terme
3. at 2 répulsif commence à intervenir : les astéroı̈des sont donc
mongroprog ≪ presque ≫ au contact, du moins au début de la simula-
Bibliographie.
135