Ph. Depondt - Physique Numérique
Ph. Depondt - Physique Numérique
Ph. Depondt - Physique Numérique
de la
PHYSIQUE NUMÉRIQUE
Licence de physique L3
Physique fondamentale et PHYTEM
Université Pierre et Marie Curie Paris-6 — ENS-Cachan
Ph. Depondt1
Année 2008-2009
1
INSP (Institut des NanoSciences de Paris), CNRS UMR 7588 & Université P. et M. Curie Paris-6.
Contact : [email protected]
2 Licence de physique L3 : Physique Fondamentale & 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 : Physique Fondamentale & 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 L’équation logistique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2.1 De la multiplication des insectes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2.2 Étude préalable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2.3 Étude numérique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
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. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
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 ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
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. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
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. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
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
4.10.3 Filtrage de données expérimentales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.11 Les méthodes de Monte-Carlo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
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
trice1 , 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 impor- massive, même si il/elle n’est pas directement impliqué(e)
tant aux décideurs (et aux payeurs) à la fois pour la re- dans des calculs légers ou lourds.
cherche scientifique et pour la recherche et développement L’évolution fulgurante de la capacité de calcul dispo-
(R & D) industriel. Les demandeurs de ce genre de calculs nible ne peut toutefois être utile et profitable que s’il y a
lourds voire très lourds sont divers ; par exemple et dans des personnes compétentes pour s’en servir de façon per-
le désordre : tinente et donc convenablement formées : il s’agit là d’une
– La météorologie est l’un des utilisateurs civils les plus double compétence à la fois scientifique dans la discipline
importants : les prévisions au quotidien bien sûr, mais d’origine (physique, chimie, mathématiques, science de la
aussi les recherches sur le réchauffement climatique, vie, etc.) et de simulation : « Some jog along with the
essayer d’en prévoir les conséquences, voire trouver technology while others lag behind 3 . . . ». Ce monde évolue
des remèdes requièrent des simulations très élaborées rapidement et le but de ce cours est de fournir les bases et
des mouvements atmosphériques et des échanges chi- les démarches permettant de s’y repérer.
miques et énergétiques.
– La matière condensée, les matériaux et les nanos- L’expérience tend à montrer que ce cours de Physique
ciences en physique et en chimie offrent une variété numérique surprend parfois un peu ceux à qui il s’adresse.
incroyable de problèmes mettant en jeu un grand Il commence, en effet, par de la programmation et quelques
nombre (entre quelques dizaines et le nombre d’Avo- notions d’Unix : serait-ce alors un « cours d’info », comme
gadro !) d’atomes : des calculs classiques ou quan- on l’entend souvent appeler ? Très rapidement toutefois,
tiques, parfois assez simples, parfois très lourds, sont après quelques semaines, on ne parle plus, ou presque plus,
mis en œuvre pour tenter de comprendre ou de prédire d’informatique ou de programmation : c’est supposé ac-
leurs propriétés. quis ; on parle de physique principalement, parfois ornée
– Les sciences de la vie se préoccupent, au niveau micro- d’un peu de mathématiques appliquées. En outre, cette
scopique, de molécules énormes, extraordinairement physique ne paraı̂t, parfois, guère familière à des étudiants
complexes. Des efforts considérables sont faits pour habitués à résoudre des problèmes dont la solution analy-
tenter de modéliser ces objets, avec des enjeux impor- tique est connue : c’est qu’ici, justement, l’objectif est de
tants : repliement de proteines, conséquences pour la résoudre des problèmes pour lesquels il n’y a pas de solu-
maladie d’Alzheimer ou celle de Parkinson, drug de- tion analytique, c’est-à-dire l’immense majorité. . . L’infor-
sign, etc. La génomique, de son côté, doit utiliser des matique est alors pour nous un outil - qu’il faut bien sûr
bases de données colossales en utilisant des méthodes maı̂triser - pour s’attaquer à des problèmes de physiques
qui doivent être efficaces et n’ont rien de trivial. variés. Le charme de cet enseignement, pour les ensei-
– Les sciences de l’ingénieur sont aussi très deman- gnants mais aussi souhaitons-le pour ceux qui le reçoivent,
deuses. Les simulations aérodynamiques permettent une fois - répétons-le - l’outil acquis, est qu’il ne se can-
de prévoir et d’optimiser les caractèristiques d’un tonne pas à tel ou tel domaine de la physique, mais qu’il
avion avant même son premier vol ; un industriel pioche ses exemples dans des champs aussi variés que pos-
comme EDF développe des calculs souvent très lourds sible, dans des questions souvent très contemporaines, avec
dans des domaines d’une grande diversité : simula- 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 vo-
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 traı̂nent
7
8 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
lontaire : à chacun de sélectionner ce qui lui paraı̂t utile, Un autre exemple, moins célèbre sans doute, est
les séances de travaux dirigés et de travaux pratiques étant l’ensemble des opérations qui, pendant la Révolution
de bons guides en la matière4 . Française, ont abouti à la définition du mètre, en rem-
placement 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
1.1 Des méthodes numériques, universel (on aurait certes put choisir comme référence
les unités en vigueur à Paris, mais l’idéal universaliste
pour quoi faire ? des 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 et
nateurs pour tenter de traiter des problèmes de physique
le soin avec lequel ils menaient leurs observations (Jean-
aussi variés que possible, afin, soit de se simplifier la vie
Baptiste-Joseph Delambre (1749-1822) et Pierre-François-
et gagner du temps en faisant faire par un ordinateur des
André Méchain (1744-1804)) équipés des instruments de
calculs fastidieux que l’on pourrait sans doute faire soi-
visée les plus élaborés, mesurer entre Dunkerque et Bar-
même, soit au contraire de s’attaquer à des questions que
celone 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 recouvre
façon qu’un calcul permette d’y répondre de manière sa- complétement l’arc de méridien compris entre les deux
tisfaisante, 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 mea-
1.1.1 Quelques jalons. . . sure of all things, Free Press (2002)) dura sept ans (1792-
1799) dans une France en proie à toutes sortes de vio-
Il ne faut cependant pas croire que les calculs numé- lences (les invasions, les guerres révolutionnaires, la Ter-
riques aient attendu l’invention de l’ordinateur pour voir
reur, Thermidor. . .) : dans les jours qui suivirent la fuite
le jour. Au XVIIe siècle déjà, l’invention des logarithmes de Louis XVI à Varennes, Delambre avec son attirail de
par John Napier (1550-1616) fut une révolution (Miri- longue-vues et d’instruments, et, pire encore, son ordre de
fici logarithmorum canoni descriptio, Edimbourg (1614)) : mission signé par le roi fugitif, fut arrêté à plusieurs re-
une multiplication se transformait en addition -beaucoup prises comme « espion » ; un peu plus tard, Méchain resta
plus aisée-, une extraction de racine carrée en division bloqué en Catalogne quand l’Espagne bourbonnienne et
par deux ! L’astronome Johannes Kepler (1571-1630) qui la France républicaine se trouvèrent en guerre ; Méchain
découvrit l’ellipticité des orbes planétaires, se livra à dut aussi lutter en permanence contre un état psycholo-
des calculs numériques vertigineux dans, par exemple, gique dépressif lié à son inquiétude quant à la qualité de
son œuvre principale, l’Astronomie Nouvelle (Astronomia ses mesures. Les deux hommes revinrent enfin à Paris en
Nova, (1609) ). Ainsi, par exemple, pour évaluer les posi- 1799 pour présenter leurs résultats : une conférence inter-
tions au cours du temps d’une planète alors qu’elle par-
nationale de mathématiciens devait : 1o vérifier et valider
court ce qui n’est encore qu’un « ovoı̈de » avec une vitesse la cohérence de leurs observations, et 2o en déduire la lon-
variable5 , il divise la trajectoire en 360 petits segments gueur du mètre.
et additionne les résultats obtenus pour chaque segment :
c’est ce que l’on appelle maintenant une discrétisation. Il fallait donc, pour la deuxième partie de ce travail, faire
Kepler, lui, appelait cela un « morcellement numérique » des calculs de trigonométrie sur une surface sphérique.
et se plaignait de ce que ce calcul fût « mécanique et en- On savait cependant qu’outre les montagnes dont il fal-
nuyeux » : comme son employeur, l’empereur Rudolf II., lait bien sûr tenir compte, la Terre n’était pas une sphère
ne payait son salaire qu’occasionnellement, il n’avait pas parfaite mais plutôt un ellipsoı̈de de révolution légèrement
les moyens d’employer lui-même un assistant pour l’ai- applati aux pôles : toutefois, le choix d’un arc de méridien
der. . . Il connaissait d’ailleurs les tables de logarithmes de situé à des latitudes intermédiaires (le 45˚ parallèle passe
Napier et en établit lui-même dans ses Tables Rodolphines à Bordeaux et donc coupe l’arc Dunkerque-Barcelone non
(Tabulæ Rudolphinæ, (1627) ). loin de son milieu) permettait d’espérer obtenir une va-
leur moyenne qui pût servir de référence. On fit alors une
4 Le chapitre 5, en particulier doit être considéré comme la suite découverte complétement inattendue : le géoı̈de n’était pas
logique du cours, mais n’en fait à proprement parler partie. régulier mais recouvert de bosses et de creux. La valeur
5 Jusqu’alors, on croyait, Copernic, Tycho Brahe et Galilée y com-
du rayon de courbure de la surface terrestre dépendait de
pris, que les mouvements planétaires étaient des mouvements cir-
culaires uniformes, ou des combinaisons de mouvements circulaires l’endroit où il était mesuré, or la précision magnifique des
uniformes, ce qui permettait un calcul facile des positions planétaires observations de Delambre et Méchain, le soin méticuleux
futures. Kepler, comme on le sait, introduisit, à cause d’un désaccord -voire obsessionnel dans le cas de Méchain- avec lequel
de 8 minutes d’angle dans la position de Mars, les orbes, d’abord
elles avaient été réalisées ne permettaient pas de mettre ce
ovoı̈des puis elliptiques, parcourues à vitesse variable ; les prédictions
en devenaient beaucoup plus difficiles : il fallut attendre Newton pour résultat sur le compte d’erreurs ou d’imprécisions de me-
voir la résolution de ce problème. sure. Après de longues tergiversations, on finit néanmoins
Physique numérique, Philippe Depondt 9
Curseur transparent
Réglette
a b
Graduations logarithmiques
a.b
Fig. 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.
par fixer la valeur du mètre à 443,296 lignes (une unité en de celle de Pascal et un système de cartes perforées issu
vigueur à Paris alors) et l’on fondit le fameux mètre-étalon des métiers à tisser Jacquard. Malheureusement, malgré
en platine irridié du 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 par
devine en arrière-plan les prodigieux calculs numériques Ada Byron6 , les réalisations pratiques ne donnèrent jamais
que les mathématiciens de la conférence ont dû faire satisfaction, à cause semble-t-il des frottements excessifs
(outre les travaux de dégrossissage réalisés par De- des mécanismes.
lambre et Méchain : corrections pour l’altitude, la La première réalisation pratique de calculs massifs au-
réfraction atmosphèrique, la température, etc.) armés tomatisés est due à Herman Hollerith qui inventa une ma-
d’une plume pour écrire et d’une table de logarithmes. chine pour traiter les données du recensement américain
Il ne se répartirent même pas la tâche, car pour plus de de 1890 à l’aide de cartes perforées. Le résultat (62 622
sûreté, chaque participant devait faire indépendamment 250 habitants) fut obtenu en six semaines au lieu de sept
l’intégralité des calculs en utilisant ses propres méthodes ! ans pour le recensement précédent. Fort de ce succès, Hol-
On reste pantois devant la dextérité et l’acharnement cal- lerith fonda en 1896 la Tabulating Machine Company qui
culatoires que cela représente. . . changea de nom en 1924 pour devenir International Busi-
ness Machines : ibm. . . spécialisée dans la fabrication de
Un peu plus tard, au XIXe siècle, Urbain Le Verrier
calculatrices mécaniques de bureau, parfois mûes par des
étudia les perturbations observées dans l’orbite d’Uranus
moteurs électriques, ou utilisant des cartes perforées.
et postula l’existence d’une autre planète jusqu’alors in-
Un effort de recherche important sur le calcul automa-
connue. Il calcula la position de cette planète et le direc-
tique fut mené aux États-Unis pendant la deuxième guerre
teur de l’observatoire de Berlin, Johann Galle, vit à l’en-
mondiale poussé en grande partie par le Ballistic Research
droit indiqué, le 23 septembre 1846, la nouvelle planète,
Laboratory. Il fallait calculer les trajectoires des projectiles
Neptune : un triomphe pour le valeureux calculateur !
tirés par divers armements afin de fournir des tables de
On imagine sans peine cependant l’énorme labeur que
pointage aux artilleurs. Pour chaque nouvelle munition, il
représentèrent, pour Le Verrier, ces calculs, entièrement
fallait produire une nouvelle table. Une armée d’employés,
faits à la main. . .
dotés de calculatrices mécaniques de bureau, faisait ces
Cependant, l’idée d’automatiser des calculs ennuyeux calculs, mais à la fin de la guerre, était littéralement sub-
est ancienne. Le baron Gaspard de Prony était chargé mergée par l’afflux de munitions de tous types et de tous
pendant le Premier Empire d’établir des tables pour le calibres produits par une industrie de guerre en plein ef-
calcul de l’impôt foncier : pour cela, il divisa le tra- fort. . . La première calculatrice électronique, l’ENIAC en
vail en trois grands blocs. La première partie, la plus 1945, était un monstre de 30 tonnes comportant 17 468
noble, était confiée à des mathématiciens : il s’agis- tubes à vide7 et consommant 150 kW. La panne d’un seul
sait de décomposer tous les calculs nécessaires en séries tube arrêtait la machine qui occupait un bâtiment à elle
d’opérations élémentaires. La deuxième tâche consistait à toute seule et nécessitait un système de refroidissement
organiser le travail et à compiler les résultats. La troisième, puissant pour évacuer la chaleur produite ! Les premiers
faire les calculs réduits à des opérations très simples, fut ordinateurs virent le jour à la fin des années 1940, trop
confiée à une armée de calculateurs humains dont la seule tard pour participer à l’effort de guerre.
qualification était d’être capable de faire des additions. Rapidement, les banques, les compagnies d’assurance8
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.
culs en tâches élémentaires avec une calculatrice du type 8 Du point de vue des constructeurs d’ordinateurs, ce genre de
10 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
et toutes les entreprises astreintes à une comptabilité la fin de la décennie. Un livre de « mathématiques com-
lourde comprirent l’usage qu’elles pouvaient faire de ces putationelles9 » régulièrement réédité jusqu’à la fin des
nouvelles machines et constituèrent un marché important années 80 explique, dans un chapitre d’introduction inti-
pour les constructeurs. Cependant, la demande de calculs tulé « General rules of computation work », que si l’on
toujours plus importants venant des scientifiques, physi- veut construire une table des valeurs de la fonction :
ciens et astronomes en tête, n’a jamais cessé d’être pres- ex + cos x p
sante, toujours de quelques ordres de grandeur au-delà de y= + 1 + sin2 x
1 + x2
ce que pouvaient fournir les ordinateurs les plus puissants
du moment : cette histoire se poursuit actuellement, cer- il faut faire sur une feuille de papier un tableau à 12 co-
tains calculs quantiques, par exemple, se chargeant, par lonnes donnant, pour la première la liste des valeurs de x,
leurs exigences en termes de puissance de calcul, de rame- la deuxième celles de x2 , la troisième ex , etc., la douzième
ner à une saine modestie les fabriquants des processeurs donnant enfin la liste des valeurs de y (voir la table 1.1) :
les plus éblouissants ! il n’est pas inutile de réaliser que tous les calculs scienti-
fiques étaient réalisés de la sorte jusqu’à un passé somme
toute récent à l’échelle d’une vie humaine10 .
électroniques n’ayant détrôné l’invention de Napier qu’à était déjà éteinte depuis quelques années. . .
11 Voir par exemple : David Ruelle, Hasard et chaos, Odile Jacob
Fig. 1.3 – Une page de la table de logarithmes Bouvart et Ratinet. Admettons que l’on cherche le produit 0,1263×18,17 ;
une calculette donne 2,2949. Avec la table, il faut d’abord chercher 1263, soit 120 puis la sixiè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 !
plus gros consomateurs civils de calcul sur les ordinateurs cile, la « modélisation de données d’expérience » qui
les plus puissants. consiste à ajuster un modèle théorique aux données expéri-
Dans un autre domaine, les expériences faites par mentales connues, en tenant compte des barres d’erreur
exemple à l’aide du rayonnement synchrotron produit expérimentales. Il s’agit en général de minimiser autant
dans des laboratoires tels que SOLEIL à Orsay et l’ESRF que possible l’écart entre les données empiriques et les
à Grenoble, produisent une grande quantité de données prédictions du modèle théorique : cette minimisation, une
numériques qui ne se traduisent pas immédiatement par optimisation du modèle si l’on préfère, est établie en ajus-
des informations de type physique : par exemple, les tant un nombre souvent élevé de paramètres (les positions
positions des atomes d’une protéine, qui en comporte atomiques, la caractérisation de l’agitation thermique) et
des centaines voire des milliers, destinée à soigner telle ne peut pratiquement se faire qu’à l’aide d’un ordinateur.
ou telle maladie. Survient alors une tâche assez diffi- L’étude des systèmes désordonnés est aussi grosse
12 Licence de physique L3 : Physique Fondamentale & 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
Tab. 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. . .
Tab. 1.2 – Un article du journal Le Monde en 1957, les m′ réparties aléatoirement, le problème devient beaucoup
derniers progrès de la prévision météorologique, il y a un plus difficile à résoudre. On montre cependant sans grande
demi-siècle : difficulté que la solution est donnée par la recherche des
Une machine à prédire le temps valeurs propres et vecteurs propres d’une énorme ma-
Quel temps fera-t-il demain ? Vieille question à laquelle les of- trice n × n, appelée « matrice dynamique » où n est le
fices météorologiques s’efforcent de répondre. Mais voici que la nombre d’atomes de la chaı̂ne. Le problème est très facile
machine électronique vient à leur secours. On connaı̂t les ap- à résoudre numériquement à l’aide d’un sous-programme
titudes extraordinaires de ces ordinateurs, véritables cerveaux de bibliothèque, alors que le désespoir guette quiconque
de remplacement, doués de raisonnement et d’une fabuleuse tenterait de le résoudre à la main. . .
mémoire, qui peuvent aujourd’hui répondre en quelques se-
condes à des questions qui embarasseraient plus d’un auditoire
savant. On pourrait objecter à ce qui précède qu’un problème
C’est à des machines semblables que le Bureau météorologique
de physique qui nécessite plus qu’une règle de trois pour
américain demande de travailler pour lui, au moins pour un cer-
tain nombre de calculs. Ce bureau centralise des milliers d’ob-
être résolu est un problème mal posé. L’art du physicien
servations qu’une armée de savants, de ballons-sondes, toute théoricien n’est-il pas justement de faire des approxima-
une flotille de bateaux, tout un réseau de postes et de stations tions adroites de façon à rendre résolubles ces problèmes
disséminés aux quatre coins du monde, glanent quotidienne- tout en isolant les principes importants ? L’intérêt n’est-il
ment et à chaque instant sur terre, sur mer et dans le 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
sûreté de diagnostic, l’évolution du temps pour des périodes de
vite : imaginons un pendule simple qui subit un frotte-
vingt-quatre, quarante-huit et même soixante-douze heures. ment aérodynamique. Il pend verticalement et on le lance
(Le Monde, le 25 juillet 1957, reproduit le 25/07/2007). avec une vitesse initiale donnée, suffisamment fort pour
qu’il passe à la verticale au dessus de son point d’équilibre
pour retomber de l’autre coté. Combien de tours fera-t-
consommatrice de moyens de calcul. Par exemple, une il autour de son axe avant de se mettre à osciller ? Il est
chaı̂ne linéaire harmonique d’atomes, tous de masse m, clair qu’on est fort loin des conditions où l’on peut faire
est parcourue de vibrations de type onde plane xℓ = les approximations usuelles (angle petit). En attendant de
u ei(ωt−kℓa) , où xℓ est le dépacement de l’atome ℓ par rap- trouver le concept adéquat, il n’est peut-être pas stupide
port à sa position d’équilibre et a est la distance inter- de faire une petite simulation numérique sur un ordina-
atomique. Un calcul classique13 à partir des équations du teur : cela ne représente guère plus que quelques dizaines
mouvement : de lignes de programme et quelques secondes de simulation
sur une machine même de puissance médiocre. . .
m ẍℓ = C(xℓ+1 − 2xℓ + xℓ−1 )
Il ne faut pas croire non plus que le calcul numérique
donne la pulsation ω en fonction du vecteur d’onde k, c’est- sur ordinateur se limite à la physique : les prévisions
à-dire la relation de dispersion : météorologiques (voir la table 1.2) sont évidemment un
r cas bien connu, mais aussi les simulateurs de vol per-
C ka mettent à des pilotes d’essais de tester le comportement
ω(k) = 2 sin
m 2 d’un nouvel avion sans risquer leurs vies et des simulateurs
d’opérations permettent à des chirurgiens de s’entraı̂ner
où C est la constante de force entre deux atomes. Main- sans risquer celles de leurs patients ! Le dossier de la revue
tenant, si la chaı̂ne comporte des impuretés de masse Pour la Science (voir la bibliographie, ref. (20)) consacré
13 Voir, par exemple : Charles Kittel, Introduction to Solid State- à la modélisation informatique parcourt quelques thèmes
Physics, New York : Wiley, (1986). « à la mode ». . .
Physique numérique, Philippe Depondt 13
Les notes ci-dessous ont pour but de donner rapidement la mémoire est aussi désigné par une adresse binaire.
au lecteur la capacité d’écrire des programmes ; elles ne C’est ce qu’on appelle le langage machine. Réaliser un
remplacent pas, bien sûr, un cours systématique1. Il s’agit programme consiste donc à fournir à l’ordinateur une
ici d’un outil dont la maı̂trise est un préalable indispen- séquence d’instructions de ce type pour qu’il la place
sable à tout travail de calcul numérique : il n’est pas utile dans sa mémoire pour exécution ; or il est rapidement
de connaı̂tre toutes les subtilités du Fortran95, mais fastidieux d’aligner des listes fort longues de 1 et de 0,
sans compter les risques d’erreurs que cela comporte ! Un
il faut impérativement être capable d’écrire rapidement
premier progrès fut de remplacer le code binaire d’une
des programmes simples « qui marchent » car, sinon, les instruction par un mot-clef, par exemple load (pour
séances de travaux pratiques destinées à faire de la phy- charger en mémoire), et d’écrire les adresses en décimal
sique que l’on espère intéressante avec cet outil, en devien- (ou en hexadécimal) plutôt qu’en binaire. Cela donne
draient suprêmement ennuyeuses pour tous, enseignants quelque chose qui peut ressembler à :
compris. . . load 150 aller chercher un nombre à l’adresse 150
add 200 additionner avec le contenu de l’adr. 200
store 220 ranger le résultat a l’adresse 220
2.1 Qu’est-ce qu’un langage de C’est nettement plus lisible que :
programmation ? 0011010100101100011111100100001001110101...
Un ordinateur, lorsqu’il exécute un programme, lit Un programme spécial, en général fourni avec l’ordinateur
l’une après l’autre dans sa mémoire des instructions et appelé assembleur traduit alors toutes ces instructions
élémentaires, par exemple : « aller chercher un nombre en binaire ou langage machine, puis on peut faire exécuter
à tel emplacement dans la mémoire » ou « multiplier tel le programme (voir les tables 2.1 et 2.2).
nombre par tel autre ». Ce schéma correspond à la célèbre L’assembleur permet de faire beaucoup de choses,
« machine de Turing » qui sert de modèle théorique à presque tout, à vrai dire : à une époque (les années
l’immense majorité des ordinateurs (figure 2.1) : instruc- 80) où les mémoires disponibles n’étaient pas ce qu’elles
tions et données sont inscrites sur un même support ap- sont devenues, la programmation en assembleur permet-
pelé mémoire2. La mémoire est constituée d’emplacements tait d’écrire des programmes efficaces et peu encombrants,
correspondant chacun à une adresse et contenant chacun au détriment évidemment de la facilité et du temps passé
une instruction ou une donnée : on peut se représenter à la programmation, car tout cela reste très « proche de
cette mémoire comme une espèce de long ruban divisé en la machine » et certainement assez peu convivial4 .
cases, chacune d’entre elles ayant un numéro, comme les L’étape suivante fut donc de créer des langages dits
maisons le long d’une rue, chaque numéro constituant une « évolués » avec lesquels on puisse faire aisément
« adresse ». des instructions beaucoup plus compliquées comme, par
exemple :
La « machine » lit dans la mémoire les instructions et
les exécute l’une après l’autre séquentiellement3 . Une ins- x = a*exp(i*(omega*t+phi))
truction peut être l’ordre d’aller lire une donnée à l’adresse
en mémoire indiquée par cette instruction, ou de modifier qui ressemble beaucoup à l’expression mathématique :
une donnée ou encore d’inscrire une donnée à une autre x = a ei(ωt+ϕ)
adresse dans la mémoire : on peut donc modifier le contenu
de la mémoire. et où x et i sont des nombres complexes, les autres va-
Chaque instruction est désignée par un code binaire riables étant réelles, exp désignant évidemment l’expo-
constitué de 0 et de 1, et chaque emplacement dans nentielle et * la multiplication. Un autre programme ap-
1 voir par exemple J. F. Kerrigan, réf. [6] dans la bibliographie, pelé compilateur doit alors décomposer ces instructions
ou, plus récent et plus complet M. Metcalf et al., réf. [18]. évoluées en instructions élémentaires, les coder en bi-
2 Le terme mémoire date des années 1940, lorsque John Von Neu- naire et affecter des adresses en mémoire à toutes les va-
mann s’est préoccupé de réalisations pratiques de la machine de Tu- riables pour produire un programme exécutable : cette
ring qui dans son esprit devaient être des cerveaux artificiels. 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 : Physique Fondamentale & 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.
Fig. 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.
disque dur. dows, dans lesquels ces étapes sont plus ou moins automatiques et
Physique numérique, Philippe Depondt 17
Le fortran est le premier de ces langages évolués à commencent à être disponibles en libre diffusion et il n’y
avoir vu le jour, mais beaucoup d’autres ont suivi : algol, a donc guère de raison de s’en priver. Des « nouvelles
cobol, pl1, basic, pascal, forth, C, ada, occam. . . du front » ainsi que des compilateurs téléchargeables,
Pour ce qui est de la programmation scientifique, outre peuvent être obtenus via le site :
fortran, seul le langage C semble survivre. http ://programming.ccp14.ac.uk/fortran-resources/~
Le sigle fortran signifie « formula translator » (tra- cgp/fortran.html
ducteur de formules) : l’idée est donc de coder des formules Dans les notes qui suivent, nous suivrons le « format
de façon aussi proche que possible de ce que l’on fait lors- libre » (ou free form) qui permet de s’affranchir de l’obliga-
qu’on écrit des équations à la main et de traduire ceci en tion de s’en tenir aux colonnes 7 à 72 comme au bon vieux
instructions exécutables par l’ordinateur. C’est à première temps des cartes perforées. . . Les compilateurs s’en acco-
vue une gageure, mais, en fait, fortran est un langage modent en principe sans problème encore que quelques
simple, bien adapté au calcul scientifique. Mis au point facéties soient possible : on peut alors tenter d’utiliser
dans sa première version par John Backus en 1956, il n’a l’option de compilation -ffree-form, voire lire le manuel
pas cessé d’évoluer depuis et ses variantes sont nombreuses d’utilisation du compilateur. . .
tant les façons de programmer ont évolué. En effet, les La compilation s’effectue par la commande :
moins jeunes de vos enseignants ont appris le fortra- g95 monboprog.f90 -o monboprog
nIV et ont travaillé avec des cartes perforées : ils ont bien monboprog.f90 (ou tout autre nom se terminant par
sûr des anecdotes à raconter sur des paquets de cartes .f90) est le fichier, dit « fichier source » créé avec un
s’échappant de leur carton et se répandant sur le sol ou de éditeur comme emacs, qui contient toutes les instruc-
cartes abı̂mées après de nombreux usages (après tout, il ne tions écrites en fortran10 . L’option -o (pour output )
s’agissait que de morceaux de papier bristol) se coinçant indique au compilateur où il doit placer le résultat de
dans le lecteur et dont il fallait aller chercher les débris son travail, ainsi le fichier monboprog contient le pro-
avec une pince à épiler ! Le bruit des machines à perfo- gramme exécutable, c’est-à-dire sa traduction en langage
rer7 a marqué un certain nombre de générations de pro- machine11 . Evidemment, si l’on utilise un autre com-
grammeurs. . . À la fin des années soixante-dix et au début pilateur que g95 (par exemple gfortran12, pgf9013 ou
des années quatre-vingt, les cartes perforées disparurent, xlf9014 ), il faut remplacer g95 par le nom du compila-
remplacées d’abord par des télétypes puis par l’ensemble teur.
écran-clavier que nous connaissons maintenant. Le résultat de la compilation est donc, quand tout s’est
Le fortranIV avait bien des défauts. Il comportait bien passé, un programme exécutable qu’il reste à faire
des instructions (go to et if « arithmétique ») capables travailler, mais en général, au premier essai, il reste des er-
de produire des logiques échevelées, bondissant d’un bout reurs de programmation que le compilateur détecte : il faut
à l’autre du programme en des itinéraires dignes d’un alors corriger le programme-source en tenant compte des
plat de spaghettis : autant dire que ce n’était pas très diagnostics fournis par le compilateurs et re-compiler. . .
lisible et générateur d’erreurs retorses. Entre-temps, les jusqu’à ce que ça marche ! (figure 2.2).
idées liées à la programmation dite « structurée » s’étaient
développées, incarnées entre autres par le langage pascal,
et le fortran a intégré une bonne part de ces concepts. 2.2 Notions élémentaires.
Deux normes officielles de fortran coexistent actuel-
lement : fortran77 qui reste assez classique et for-
2.2.1 Instructions.
tran90 (ou fortran95 quasiment identique), beaucoup Une instruction très simple de fortran peut être par
plus évolué, qui est appelé à le remplacer progressivement exemple :
et qui constitue la norme sur les gros calculateurs dédiés
a = b + c
aux calculs lourds.
Nous utiliserons ici la norme fortran95, principa- elle signifie :
lement pour sa capacité à travailler sur des tableaux 1. que l’on désigne par a, b et c trois emplacements dans
de nombres de façon très confortable et efficace8 . Le la mémoire vive de l’ordinateur,
compilateur g77 qui fait partie de toutes les distributions
2. que l’on prend le contenu des emplacements b et c,
Linux, librement diffusé par gnu (Le mot anglais gnu
désigne le gnou, une espèce de buffle, et le sigle gnu 3. que l’on en fait la somme (cela suppose qu’il s’agit de
signifie : GNU’s Not Unix, un exemple d’autoréférence nombres)
typique d’un certain humour informatique), est basé Linux (Debian et Fedora au moment où ces lignes sont écrites) et,
sur fortran77, mais il intègre un grand nombre de convenablement installé, il paraı̂t plutôt plus efficace à condition
caractéristiques de fortran90 ce qui en fait un outil d’utiliser l’option -ffast-math.
10 certains compilateurs fortran90 exigent que le nom du fichier
puissant tout en gardant une grande simplicité. Toutefois,
source se termine par .f. Pour d’autres, la terminaison .f signifie
de bons compilateurs fortran95 (g95 et gfortran9) « format fixe » et la terminaison .f90, « format libre »
11 On peut fabriquer une commande personnelle de compilation,
donc quasiment invisibles. par exemple en créant un fichier appelé gf95 dans lequel on met la
7 Il y eut aussi l’étape ruban perforé qui permettait, avant les ligne : g95 $1.f90 -o $1. Ce fichier peut alors être rendu exécutable
bandes, disquettes et autres supports magnétiques, d’enregistrer des par la commande : chmod +x gf95. Pour compiler un programme, il
données : cet engin était -justement- surnommé « la mitrailleuse » ! suffira dorénavant de taper : gf95 monboprog. Selon les besoins, gf95
8 Les programmes écrits en fortran77 peuvent être compilés avec peut être modifié ensuite pour inclure d’autres options de compila-
un compilateur fortran95. tion comme -O3 (optimisation) ou des bibliothèques de calcul.
9 Le 12 version gnu.
compilateur g95 est aisément téléchargeable sur
http ://g95.org/. Le compilateur gnu gfortran commence à 13 compilateur commercial de Portland Group.
Edition : emacs monboprog.f90 & Tab. 2.3 – Qu’est-ce qu’un système d’exploitation ?
On doit, on l’a vu, mettre dans la mémoire vive de l’ordinateur
le ou les programmes que l’on utilise ainsi que les données cor-
respondantes. C’est une des tâches du système d’exploitation :
quand, sous unix, on tape le nom d’un programme, un autre
Compilation : g95 monboprog.f90 −o monboprog programme (ou plusieurs autres programmes) qui fait partie du
système d’exploitation, lit les caractères que l’on tape sur le cla-
vier, au passage reproduit ces caractères sur l’écran, puis va lire
le fichier exécutable au bon endroit sur le disque dur, l’installe
en mémoire et lance son exécution. Éventuellement, il fera ap-
paraı̂tre un message du genre file not found ou toute autre
Exécution : ./monboprog
chose de ce style. . . Si plusieurs programmes doivent s’éxécuter
en même temps, ou si plusieurs utilisateurs travaillent en même
temps sur le même ordinateur, c’est le système d’exploitation
qui répartira les ressources (mémoire, processeur, disque dur,
imprimantes, etc.) entre les programmes et les utilisateurs.
Fig. 2.2 – Le cycle de mise au point d’un programme : C’est aussi au système d’exploitation que l’on a à faire lorsqu’il
faut s’identifier comme utilisateur (login et mot de passe).
édition du fichier-source, compilation, exécution. La com-
Le système d’exploitation unix date du début des années 1970 ;
pilation permet de détecter les erreurs de syntaxe que l’on il a d’abord été installé sur des stations de travail « moyennes »
corrige par un retour à l’étape d’édition. À l’exécution, la mais il a rapidement envahi le monde des ordinateurs des-
prudence impose de tester le programme, en général en tiné au calcul scientifique. Le premier système d’exploitation
faisant des calculs dont on connait le résultat : les erreurs de Microsoft, dos (1981), est une version extrêmement sim-
ainsi détectées renvoient aussi à l’édition. En principe, le plifiée d’unix, en particulier, il est mono-utilisateur, alors
cycle converge assez vite. . . qu’Unix est multi-utilisateur, c’est-à-dire que plusieurs per-
sonnes peuvent utiliser simultanément le même ordinateur :
c’est particulièrement important sur les grosses machines et
4. que l’on met le résultat dans l’emplacement a. les serveurs. En 1991, Linus Torvalds créa linux, une version,
complète cette fois-ci, d’unix utilisable sur des ordinateurs per-
sonnels. Les machines utilisées pour les travaux pratiques de
a = b
Tab. 2.4 – Quelques commandes Unix de base
Beaucoup de choses peuvent être faites sous Unix en cliquant alors, a, b et c contiennent la valeur 3. . . Il s’agit donc bien
sur des icônes : les gestionnaires de fenêtre tels que kde ou de deux instructions exécutées l’une après l’autre dans
gnome sont devenus très similaires à Windows ou MacOS. l’ordre donné dans le programme. Finalement, l’instruc-
Il est bon cependant de connaı̂tre les commandes de base tion :
d’Unix, d’une part parce que les icônes sont loin d’être ca-
pables de tout faire et de l’autre, il est souvent sensible- i = i + 1
ment plus rapide de taper une commande dans un ter- n’a rien d’absurde : il s’agit simplement de l’ordre d’aug-
minal que de déployer tout l’arsenal, graphique en par- menter la valeur de i de 1 (on prend i, on lui ajoute 1 et
ticulier, qui accompagne les gestionnaires de fenêtres et on met de résultat dans i). En revanche :
d’icônes et qui est généralement gourmand en ressources.
mkdir make directory créer un répertoire a + b = 3*x + c ! ATTENTION, CECI N’A AUCUN SENS
pwd print working directory nom du répertoire courant
cd change directory changer de répertoire est totalement dépourvu de sens pour l’ordinateur car l’ex-
cp copy copier des fichiers, pression a + b à gauche du signe = ne désigne pas un em-
rm remove effacer des fichiers placement dans la mémoire. . . pire encore :
mv move déplacer un fichier
more more voir le contenu d’un a = b = c ! CA NE PLAIRA PAS DU TOUT AU COMPILATEUR
fichier texte.
lpr line printer imprimer à droite du premier signe =, il y a une expression b = c qui
a2ps ASCII to postscript imprimer un fichier texte ne peut pas être évaluée, puisque ce n’est pas une valeur,
emacs éditeur de texte c’est une instruction !
g95 compilateur fortran
man manual manuel en ligne
Par exemple : cp machin nouveau machin crée un fichier qui
2.2.2 Déclarations.
est la copie de machin. On peut déplacer ou copier d’un Tout ceci suppose cependant que l’on ait déjà « dit »
répertoire à un autre : mv td1/prog.f td2 déplacera le fichier à l’ordinateur que a, b et c sont des emplacements de
prog.f du répertoire td1 au répertoire td2. la mémoire destinés à contenir des nombres, par exemple
La plupart des commande ont des options marquées par un des nombres réels : c’est ce qu’on appelle une déclaration.
tiret -, par exemple : g95 prog.f90 -O3 -o prog utilise deux Ainsi la déclaration :
options (optimisation, et nom du fichier de sortie), ou : lpr
-Ppr1 figure.ps précise sur quelle imprimante l’impression real :: a, b, c
doit se faire. Pour trouver les possibilités d’une commande et
les options qu’elle peut utiliser : man nom de commande. déclare que l’on va occuper trois emplacements mémoire
Finalement, le répertoire courant est marqué par un point : . dorénavant appelés a, b et c et que l’on mettra des nombres
et le répertoire situé au-dessus du courant par deux points : réels dedans15 . Comme on peut changer la valeur du
.., ainsi cd . ne fait rien, mais cd .. remonte d’un cran dans contenu de ces emplacements, on les appelle variables. Un
la hierarchie des fichiers. Si l’on veut copier un fichier d’un nom de variable peut être simplement une lettre comme
autre répertoire vers le répertoire courant, on peut faire, par a ou x, ou alors une combinaison de lettres et de chiffres
exemple, un cp /home/machin/truc/fichier origine . , où à condition de commencer par une lettre, par exemple :
le point “.” est la destination de la copie. agecpt, y2, zmax, mais pas : 2pi ou s*3 (* est un ca-
ractère spécial désignant la multiplication). Le caractère
Tab. 2.5 – Le BIOS ou Basic Input/Output System. “ ” « blanc souligné » ou underscore est également auto-
Le BIOS est un programme qui est directement installé par le risé : pere ubu ou nbr pas. La longueur peut aller jusqu’à
constructeur sur la carte-mère (c’est-à-dire la carte qui com- 31 caractères : age du capitaine. Il ne faut pas utiliser
porte le processeur, la mémoire vive, etc.) de l’ordinateur et les lettres accentuées, cédilles, trémas, et autres signes dia-
qui peut donc démarrer dès la mise sous tension alors qu’au- critiques. Enfin, fortran ne fait pas la distinction entre
cun périphérique n’est encore opérationnel. C’est lui qui, après lettres majuscules et minuscules (Zmin est identique à
avoir identifié les périphériques disponibles, charge le système zmin) alors que le système d’exploitation unix le fait (les
d’exploitation qui se trouve, lui, généralement sur le disque fichiers resultats et Resultats sont distincts).
dur, un CD, voire une disquette ou une autre machine acces- On peut déclarer des nombres entiers, par exemple :
sible par réseau.
integer :: i, m, nbrpas
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.
18 On note au passage que l’expression 0.1*i mélange une Deux écritures sont possibles pour les opérateurs lo-
constante réelle et un entier : le résultat est réel. giques, première et deuxième colonnes ci-dessous :
22 Licence de physique L3 : Physique Fondamentale & 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 souhaite19 .
Cependant si l’on a une série de possibilités à envisager,
.or. ou
l’instruction select case20 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 sou- write(*,*) 1000.*l*c/12.,’ mm’
mis à condition : 19 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 : 20 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 on peut écrire :
de tenter de l’ouvrir en lecture,
write(1,*) ( x(i), i = 1, n )
! declaration d’une chaine de 40 caracteres La différence est que dans le deuxième cas tous les éléments
! qui devra contenir le nom du fichier du tableau24 sont écrits sur la même ligne, sauf si on le
character (len=40) :: n_fic ! nom de fichier précise par format. Plus concis encore, si x est un tableau :
logical :: ok ! variable logique
write(1,*) x
do écrit tout le tableau.
write(*,’(‘‘Nom du fichier de donnees : ‘‘,$)’) On peut faire la même chose avec read.
read(*,*) n_fic ! lire au clavier le nom du fichier
! inquire est une commande FORTRAN permettant de
! verifier l’existence du fichier 2.8 Tableaux.
inquire(file=n_fic,exist=ok) ! existe: ok = .TRUE.
if ( ok ) exit ! et on n’insiste pas Les tableaux de nombres sont l’équivalent informatique
! sinon, il faut recommencer des vecteurs et des matrices : on peut ainsi désigner plu-
write(*,’(‘‘Fichier non trouve’’)’)
sieurs nombres par une seule variable ; le vecteur V de
enddo
open(10,file=n_fic) ! ouverture du fichier
dimension n désigne l’ensemble de ses n éléments vi , i ∈
... [1, n], la matrice A de dimension (n, m) désigne tous les
n × m éléments aij , le tenseur T de rang 3 désigne tous les
Les boucles infinies, assorties de exit et cycle, tendent éléments tijk , et ainsi de suite. Comme dans ces exemples,
à remplacer le do while, souvent considéré comme ob- un ou plusieurs indices entiers servent à indiquer l’élément
solète. Le until du pascal n’existe pas en fortran : voulu du tableau. Avec les tableaux, on acquiert la capa-
de fait, exit et cycle sont beaucoup plus riches, puis- cité à traiter, comme s’il s’agissait d’une seule entité, un
qu’ils peuvent être placés n’importe où dans la boucle, et grand nombre de données, pour ainsi dire « d’un coup » !
non seulement au début comme while ou à la fin comme
until23. 2.8.1 Déclaration
Si les boucles ont un nom, exit et cycle en tiennent
compte : La déclaration d’un tableau est faite en indiquant les
valeurs extrêmes des indices de chacune des dimensions
l1 : do du tableau, par exemple :
...
real, dimension(1:100) :: x
l2 : do
... déclare un tableau à un seul indice qui va de 1 à 100, c’est-
if ( age_du_capitaine < 0 ) exit l1 à-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
if ( ok ) cycle l2 élément est désigné par x(i) ; i est bien entendu un entier.
... Par exemple :
enddo l2 real, dimension(0:100) :: x
... real :: pi = acos(-1.0)
enddo l1 integer :: i
Le exit l1 fait sortir de la boucle l1, la plus externe, alors
do i = 0, 100
que l’instruction se trouve dans la boucle la plus interne : x(i) = cos(i*pi/100.)
ça permet de sauter par dessus un niveau d’imbrication. enddo
23 L’intérêt de ces structures est réel, toutefois pour relativiser, no-
remplit un tableau de 101 éléments avec les valeurs prises
tons qu’en fortranIV, on pouvait très bien fabriquer des logiques si-
par cos θ avec θ ∈ [0, π] par pas de π/100.
milaires à ce que permettent exit et cycle, l’esprit était simplement
moins orienté « programmation par bloc » et il fallait s’astreindre à On peut faire des déclarations du genre :
un minimum de discipline, par exemple : real, dimension(-100:100) :: x
do 100 i = 1, 1000000
... ce qui donne dans ce cas un tableau à 201 éléments dont
c ici l’equivalent d’un ‘‘cycle’’ l’indice varie de -100 à 100, et alors, on peut accéder à des
if ( x .gt. y ) go to 100
... éléments comme par exemple x(-20).
c ici l’equivalent d’un ‘‘exit’’ La déclaration real, dimension(100) :: x est
if ( z .le. 0. ) go to 200 équivalente à real, dimension(1:100) :: x25 .
... Pour les tableaux à plusieurs dimensions, il faut spécifier
100 continue
200 ...
les valeurs extrêmes de chacun des indices :
Il était prudent d’éviter de placer l’étiquette 200 à l’autre bout du 24 voir les tableaux dans la section suivante.
programme, du moins si l’on avait l’ambition d’écrire un code « main- 25 à
la différence du langage C pour lequel les tableaux commencent
tenable ». . . avec l’élément 0.
Physique numérique, Philippe Depondt 27
Finalement, il est possible d’initialiser un tableau dans tit pas que les opérations effectuées dans un traitement global de
la déclaration, comme un scalaire : tableau se fassent dans l’ordre des indices de sorte que si un calcul
dépend d’un résultat obtenu précédemment sur un élément d’indice
real, dimension(-2:2) :: x=(/-4,-2,0,2,4/) inférieur, il faut écrire explicitement une boucle. En revanche, cer-
tains ordinateurs sont optimisés pour ce genre de calcul et un trai-
ici, x(-2) = -4, x(-1) = -2, etc. Une boucle implicite tement global, quand il est possible, peut se traduire par un gain de
peut aussi être utilisée pour le même résultat : temps sensible.
28 Licence de physique L3 : Physique Fondamentale & 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 po-
positifs du tableau x, et l’on annule y pour les éléments sitifs 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 quelles on aimerait pouvoir modifier la taille d’un tableau
une matrice. en cours d’exécution : par exemple, si l’on a écrit un pro-
Un résumé (non exhaustif) de quelques fonctions que gramme qui calcule la moyenne des éléments d’un tableau
l’on est amené à utiliser assez souvent est donné dans la de nombres de longueur quelconque, il serait agréable de
table 2.828 . pouvoir entrer la taille du tableau, puis le dimensionner,
puis faire le calcul sans avoir à recompiler le programme
à chaque fois que le nombre de nombres dont on veut la
2.8.4 Allocation dynamique de mémoire 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écision29 : 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, mo- !... ici on fait des calculs
30
difier le code source, recompiler et relancer l’exécution . deallocate(x) ! desaffectation
Il existe cependant des quantités de situations dans les- ! on recommence avec un tableau plus petit
28 NE
! qui commence en zero au lieu de un
PAS apprendre ce tableau par cœur !
29 pour la plupart des ordinateurs courants. L’usage de mots de 64 allocate(x(0:n/2-1))
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
30 Licence de physique L3 : Physique Fondamentale & 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 fonction32 . L’appel de la fonction
Pour des raisons, ne serait-ce que de lisibilité, on a très dans le programme principal est fait normalement, ici dans
souvent intérêt à découper un gros problème en plusieurs une instruction
petits pour lesquels les possibilités de se tromper sont plus write(*,*) bsom(x,n)
faibles31 . 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 expli-
récupérer et l’insérer dans le programme que l’on est en citement l’expression donnant la valeur de la fonction :
train de faire sans avoir à le reécrire. Il existe en outre, et si l’on oublie l’instruction bsom = s/sum(z), il n’y aura
l’on verra dans ce cours un certain nombre d’exemples de pas d’erreur détectée, le calcul sera fait normalement, mais
leur utilisation, des bibliothèques de sous-programmes et le résultat ne sera pas transmis au programme appelant.
de fonctions extrêmement riches, telles linpack, lapack, La fonction doit se terminer par l’instruction end qui en
nag, imsl. . ., dans lesquelles on peut puiser sans vergogne marque 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 ba-
2.9.1 Les function. rycentre des éléments de z. Le tableau z est un argument
de la fonction ( function bsom(z,m) ). Dans l’appel de
2.9.1.1 Définir une function. 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 va-
les fonctions intrinsèques mais évidemment, il faut aussi riables 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 corres- pel et la définition de la fonction. En effet x est la première
pondantes, 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
dessus33 .
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 ouplus précisèment la définition de la function.
tous les sous-sous-sous-. . .-problèmes sont tellement élémentaires 33 Laseule chose qui soit transmise est l’adresse du premier élément
qu’il n’y a plus de problème ! du tableau x. C’est en fait un pointeur masqué !
Physique numérique, Philippe Depondt 31
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
entre le programme principal et B : on saute, pour ainsi
! definition de constantes trigonometriques
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
comme argument.
end
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 trans-
mais ce n’est pas obligatoire) et, le cas échéant, d’affecta- mettre comme argument, outre les bornes xmin et xmax
tions de valeurs. Dans un programme ou sous-programme de l’intégrale et la précision eps souhaitée, le nom de la
dans lequel on veut utiliser ces variables, il faut spécifier fonction à 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 sans si 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 diag-
en degrés : nostiquera que la variable sin n’est pas déclarée, et dira
quelque chose qui peut ressembler à : Error : Symbol
sin_theta = sin(deg_rad*theta)
’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 besoin
intrinsic :: sin
dans chaque sous-programme qui l’utilise, les dégats po-
34 ...
tentiels restent limités : on peut très bien imaginer des
xmin = 0. ; xmax = acos(-1.0)
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 programmes35.
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éclarations36.
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 mo-
dule 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 les fichiers correspondants à l’aide de directives include
peut très bien qu’il ait besoin d’autres grandeurs utilisées 35 Certains compilateurs plus anciens n’acceptent que l’ancienne
par le programme principal. Si l’on ne veut pas modifier A 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 du imaginer des situations où cela peut être nécessaire, par exemple
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
’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 modifiant matrice, transformée de Fourier, valeurs propres, . . .) et
éventuellement un signe ; il faudrait alors inclure explici- l’on trouve le programme de bibliothèque convenable, on
tement les deux sous-programmes, ce qui suppose que l’on l’appelle et on compile l’ensemble avec l’invocaton de la
connaisse spécifiquement comment tout cela est organisé : bibliothèque idoine : un appréciable gain de temps !
autant dire que c’est rarement le cas quelques années après
l’écriture initiale. Une bonne solution est alors de consti-
tuer une bibliothèque (library en anglais37 ). 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 com-
et dans lequel le compilateur peut aller pêcher ce dont portent des commentaires. Pour cela, il suffit d’utiliser
il a besoin, par exemple un sous-programme de calcul de le symbole ! qui marque le début d’un commentaire qui
transformée de Fourier et tous les sous-programmes aux- ne sera donc pas interprété comme une instruction à
quels celui-ci fait appel : dans le programme principal, il exécuter :
suffira de faire un call du sous-programme voulu.
! ceci est un commentaire, mais la ligne
! qui suit est une instruction
2.9.6.2 Créer une bibliothèque personnelle. read(*,*) x
On a donc écrit un certain nombre de sous-programmes C’est très utile quand on veut pouvoir s’y retrouver dans
et de fonction (dûment testés, bien sûr. . .) placés dans des un programme écrit quelques temps avant, par exemple :
fichiers machin 01.f90, machin 02.f90, truc real.f90,
truc dbl prec.f90, etc. Si on compile tout cela par g95 !-----------------------------------------------
*.f90, le compilateur refusera de la faire parce qu’il n’y a ! Ceci est un programme ecrit le 06-11-98
! par Tycho Brahe
pas de programme principal : il faut donc inhiber l’éditeur
! Il comporte trois boucles imbriquees
de lien38 avec l’option -c et pendant qu’on y est, on peut !
demander une optimisation du code avec l’option -O3. ! Mise a jour (adaptation free form) le 18-12-01
Cela donne : ! par Johannes Kepler
g95 -c -O3 *.f90 !-----------------------------------------------
on obtiendra alors une série de fichiers machin 01.o, ....
machin 02.o, truc real.o, truc dbl prec.o, etc. Ces ! debut de la grande boucle
fichiers doivent alors être inclus dans un fichier d’archive : do i = 1, n
ar rv libmabib.a *.o ......
Le fichier libmabib.a contient la bibliothèque mabib. On ......
peut alors supprimer tous les fichiers intermédiaires : ! debut de la moyenne boucle
do j = 1, m
rm -f *.o
........
Pour utiliser cela, il suffit de compiler normalement ........
son programme principal, dans lequel il y a des call ! debut de la petite boucle
machin 01(arg1, arg2), avec la commande : do k = 1, l
g95 big prog.f90 -Lrepertoire de mabib -lmabib ......
-o big prog ......
où repertoire de mabib est le répertoire où se trouve ......
le fichier libmabib.a. Si l’on peut placer le fichier enddo
libmabib.a dans le répertoire /usr/local/lib39, ! fin de la petite boucle
l’option -L n’est plus nécessaire. ......
......
enddo
2.9.6.3 Utiliser une bibliothèque existante. ! fin de la moyenne boucle
.....
Il est toutefois assez rare que l’on ait à créer une
.....
bibliothèque de toutes pièces : l’essentiel des algorithmes enddo
courants a déjà été programmé, compilé, testé, etc., il ! fin de la grande boucle
est inutile -voire nocif- de les refaire ! Pour l’algèbre
linéaire, il y a par exemple lapack qu’en général, il suffit Si chaque série de points (.....) représente plusieurs cen-
37 attention aux faux amis : en anglais, library signifie bibliothèque
taines d’instructions, les commentaires qui en marquent le
(l’endroit où l’on emprunte des livres) alors que librairie (l’endroit
début et la fin ne sont pas de trop. . .
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 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
Les fichiers internes fonctionnent aussi pour l’écriture, 2.13 Détection de fin de fichier.
par exemple, le programme metres ci-dessous lit les ar-
guments de la commande qui l’invoque, ainsi quand on Il arrive que l’on lise un fichier dont la longueur est
tape : inconnue : ainsi, on ne sait pas la longueur de la boucle de
lecture :
$ metres 6500 pieds
open(1,file=nfichier)
on obtient do i = 1, n ! mais quelle valeur donner a n ?
read(1,*) x
1981.200 metres
...
Le programme est aussi une illustration de select case : enddo
program metres Une bonne solution est de faire une boucle infinie dont on
implicit none sort quand une condition de fin de fichier est rencontrée :
real, parameter :: c = 0.3048 ! conversion
real :: l open(1,file=nfichier)
character (len=10) :: unite do
read(1,*,iostat=i) x
! si le nombre d’arguments est >= 2, lire les deux if( i < 0 ) exit
! premiers, sinon, lire classiquement au clavier ...
if ( command_argument_count() >= 2 ) then enddo
call get_command_argument(1,unite) ! 1er argument
la spécification iostat=i où i est une variable entière
! Le 1er argument est la longueur que l’on veut
! convertir, c’est donc un nombre, or on a une chaine place dans i un diagnostic du résultat de l’opération
! de caracteres qu’il faut convertir en reel par d’entrée-sortie. Tant que i reste positif ou nul, la lecture
! unite interne se poursuit. La fin du fichier ou une erreur de lecture pro-
read(unite,*) l ! on lit la chaine pour obtenir l duira une valeur négative, et la lecture s’arrête.
call get_command_argument(2,unite) ! 2eme argument
! le 2eme argument est le nom de l’unite qui reste
! une chaine de caracteres : donc pas de conversion. 2.14 FORTRAN77-90-95 : filiation
else
write(*,’("Entrer la longueur et l’’unite ",$)’)
et différences.
read(*,*) l, unite
Le langage fortran ne cesse d’évoluer : la première
endif
norme officielle et indépendante d’un constructeur, for-
! trim est une fonction intrinseque qui reduit une tran66 ou fortranIV, date de 1966. fortran77, en
! chaine de caracteres a sa partie utile (sans espaces) 1977, introduisait des structures comme if-then-else,
select case(trim(unite)) les chaı̂nes de caractères et des instructions d’entrée-sortie
case (’ft’,’feet’,’foot’,’pieds’,’pied’) élaborées comme open. En 1991, la norme fortran90 fut
write(*,*) l*c,’ metres’ définie et les premiers compilateurs cray et ibm sont ap-
case (’in’,’inch’,’inches’,’pouces’,’pouce’) parus en 1994. Enfin, la norme fortran95 est devenue
write(*,*) 1000.*l*c/12.,’ mm’ ! 1 ft = 12 in opérationnelle en 1999 sur des gros calculateurs de type
case(’m’,’metres’) cray et ibm. . . en attendant fortran2003 !
write(*,*) l/c,’ ft’ Si fortran95 apporte surtout des modifications de
case default
détail par rapport à fortran90, celui-ci constitue
write(*,*) ’unite inconnue’
end select
une évolution significative. Certaines structures (comme
end do-if(...) exit-enddo) étaient déjà intégrées dans g77
mais pas toutes : la manipulation globale de tableaux, les
–Exercice : adapter ce programme pour pouvoir faire modules, l’intention, l’allocation dynamique de mémoire
des conversions du type metres 5 ft 10 in pour obte- n’en faisaient pas partie.
nir 1.778 m. Cette capacité à manipuler des tableaux est probable-
Une autre application est la création de formats au- ment l’apport principal de fortran90 au calcul scienti-
tomatiques : imaginons que l’on ait déclaré un tableau fique ; la logique des programmes peut en être modifiée :
« allocatable » : combien d’éléments doit-on mettre un exemple pourrait être un calcul d’énergie potentielle
dans le format d’écriture ? A priori, on ne peut pas le savoir
d’interaction entre n atomes, à partir de l’énergie de paire
avant l’exécution : c’est le but de l’allocation dynamique
de mémoire. . . On peut s’en sortir en se rappelant qu’un de chaque couple d’atomes, donnée par une expression du
format est une chaı̂ne de caractères que l’on peut modifier, type 12 6 !
ainsi : σ σ
V (rij ) = ε −2
rij rij
integer :: n
real, dimension(:), allocatable :: s et
character (len=9) :: form=’(00f11.5)’ n−1
X n
X
write(*,’("Donnez la dimension du tableau : ",$)’) Ep = V (rij )
read(*,*) n i=1 j=i+1
allocate(s(n)) en fortran77 :
...
write(form(2:3),’(i2.2)’) n ! modification du format do i = 1, n-1
write(*,form) s ! ecriture do j = i+1, n
36 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
rij2 = (x(i)-x(j))**2 + (y(i)-y(j))**2 + & On peut faire la même chose avec des entiers :
(z(i)-z(j))**2 integer :: l
sigr6 = (sigma2/rij2)**3 code l sur 4 octets et permet d’utiliser des nombres entiers
epot = epot + sigr6*( sigr6 - 2.0 ) jusqu’à 109 , alors que
enddo integer (kind=8) :: l
enddo
travaille sur 8 octets et permet d’aller jusqu’à 1010 .
epot = epsilon*epot
Toutefois, tout ceci dépend du processeur utilisé : ce qui
en fortran90 : est cité ci-dessus n’est vrai que pour les processeurs les
plus communément utilisés sur PC ; le programme suivant
do i = 1, n-1 permet de tester tout cela en cas de doute :
rij2(i+1:n) = (x(i)-x(i+1:n))**2 + & program inquire_kind
(y(i)-y(i+1:n))**2 + & implicit none
(z(i)-z(i+1:n))**2
integer :: p
sigr6(i+1:n) = (sigma2/rij2(i+1:n))**3 ! l’exposant est celui de la puissance de 10 accessible
epot = epot + sum(sigr6(i+1:n)*(sigr6(i+1:n) - 2.0)) write(*,’("Nombres entiers :")’)
enddo
write(*,’("exposant, kind")’)
epot = epsilon*epot do p = 1,10
write(*,’(2i6)’) p, selected_int_kind(p)
où maintenant rij2 et sigr6 sont des tableaux : la boucle enddo
interne est implicitement décomposée en trois boucles plus ! la precision est le nombres de chiffres significatifs
simples. Le résultat est que l’on occupe plus de mémoire write(*,’("Nombres reels :")’)
vive (plus de tableaux) mais que la logique du calcul s’en write(*,’("precision, kind")’)
trouve décomposée en éléments plus simples. do p = 1, 20
Il y a cependant d’autres innovations, plus « informa- write(*,’(2i7)’), p, selected_real_kind(p)
tiques » qui seront décrites ici car elles ont un attrait cer- enddo
tain, mais elles sont d’un intérêt moins immédiat pour le end
calcul scientifique pur et dur.
On peut aussi utiliser kind avec des caractères pour
écrire avec des caractères non-latins.
2.14.1 kind
Le type double precision est considéré comme ob- 2.14.2 Interfaces.
solète et disparaı̂tra probablement dans une version Supposons qu’une équipe de programmeurs travaille
ultérieure de Fortran. Son intérêt est de faire des cal- collectivement sur un même (gros) programme en se
culs avec un plus grand nombre de chiffres significatifs, ce répartissant les tâches. Chaque programmeur n’est pas
qui est parfois utile, sinon indispensable. Il est remplacé forcément toujours au courant du détail des arguments
par le concept plus général de kind40 qui s’applique aux utilisés par ses collègues dans tel ou tel sous-programme
entiers, aux réels et aux caractères. Dans la plupart des cas enfoui dans des dizaines de milliers de lignes de code ; il n’a
(ça dépend du processeur) un kind=4 codera un nombre pas forcément le temps ou le courage de relire tout le code
sur 4 octets (c’est en général ce qui se passe quand on existant pour retrouver la liste d’arguments et leurs types
ne précise rien et cela donne 6 chiffres significatifs) et un de la subroutine lfpz atis13102twr11800 écrite deux
kind=8 sur 8 octets, soit la double precision ( 15 chiffres ans auparavant par quelqu’un qui a entre-temps changé
significatifs). d’affectation !
Ainsi : Il peut être alors utile de résumer au début du pro-
real :: x gramme principal, dans une interface, tout ce qu’il faut
et savoir sur tous les sous-programmes :
real (kind=4) :: x
program yepee
sont (sur la plupart des ordinateurs) équivalents. De
même : interface
double precision :: x
et subroutine lfpz_atis13102twr11800(x,y,n)
real (kind=8) :: x integer, intent(in) :: n ! nombre
De la même façon, on peut faire des double complex par real, dimension(n), intent(in) :: x ! annees
complex (kind=8) :: z real, dimension(n), intent(inout) :: y ! mvts
Quel intérêt tout cela peut-il avoir ? La déclaration real end subroutine lfpz_atis13102twr11800(x,y,n)
est un peu ambigüe parce que, sur un processeur à 32 bits,
subroutine cp301_phln(a,h)
le réel est bien codé sur 4 octets, alors que sur un proces-
real, intent(in) :: a ! annee
seur à 64 bits (qui deviennent de plus en plus fréquents)
real, intent(out) :: h ! heures
il est codé sur 8 octets, ce qui en fait l’équivalent d’un end subroutine cp301_phln
double precision. . . La notion de kind a pour but de
clarifier les choses. end interface
40 Sorte ou espèce. Par exemple : the American bald eagle is a kind
of eagle found in Northern America. En américain « conversation- ! declarations du programme principal
nel », It’s kind of neat (prononcer : It’s kinda neat) : c’est super implicit none
chouette ; he’s kind of weird : il est assez bizarre. ...
Physique numérique, Philippe Depondt 37
Toutes les déclarations de tous les arguments de tous opérations sur les rationnels qui tiennent compte, en par-
les sous-programmes sont ainsi répétées au début du ticulier, de la réduction au même dénominateur :
programme principal (ou du programme appelant), avec
éventuellement des commentaires : le compilateur peut module rat
ainsi vérifer au passage la cohérence des appels de sous- ! definition du type rationnel dans un module pour
programmes et signaler d’éventuelles erreurs. ! eviter d’avoir a le refaire dans tous les
L’interface ne sert cependant pas uniquement à se rap- ! sous-programmes
peler la syntaxe d’appel d’un sous-programme, elle permet type rationnel
de résoudre un certain nombre de problèmes de déclaration integer :: n, d
de variables. Admettons que l’on cherche à faire une fonc- end type rationnel
! 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 :
! test pour verifier que le resultat est bien ! declaration de deux nombres rationnels p et q
! perpendiculaire aux deux vecteurs initiaux ! le numerateur de q s’ecrit q%n et
! son denominateur q%d
write(*,*) "Produit scalaire X.Z", dot_product(x,z)
write(*,*) "Produit scalaire Y.Z", dot_product(y,z) ! meme chose pour p
type (rationnel) :: q, p
end
write(*,’("Num, denom 1: ",$)’)
!----- definition de la fonction ----- read(*,*) q%n, q%d
write(*,’("Num, denom 2: ",$)’)
function cross_product(a,b) result(c)
read(*,*) p%n, p%d
implicit none
real, dimension(3),intent(in) :: a, b
! utilisation des deux nouveaux operateurs
real, dimension(3) :: c
write(*,*) "produit ", q*p
c = cshift(a,1)*cshift(b,-1)-cshift(b,1)*cshift(a,-1) write(*,*) "somme ", q+p
end
end
use rat doute les scientifiques eux-mêmes qui sont frappés d’obso-
implicit none lescence ! En attendant, l’un des reproches essentiels que
type(rationnel), intent(in) :: q1, q2 l’on fai(sai)t au fortran est l’absence de pointeurs.
type(rationnel) :: q3 Un pointeur est une variable qui contient l’adresse d’une
q3%n = q1%n*q2%d + q2%n*q1%d variable : si l’on modifie un pointeur, on ne modifie pas la
q3%d = q1%d*q2%d
valeur de la variable, mais on « pointe » vers une autre
call simplify(q3)
end function ratadd
adresse et donc une autre variable. A priori, un pointeur
est donc juste une variable entière qui contient une adresse
subroutine simplify(q) et l’on peut faire les opérations que l’on veut sur cette
use rat adresse, aux risques et périls de l’utilisateur. C’est ainsi
implicit none en assembleur et en langage C qui est très proche de la
type(rationnel) :: q machine. En assembleur en particulier, il n’y a pas de ta-
integer :: i, m bleaux, mais on peut accéder à des grandeurs stockées
à la suite les unes des autres en mémoire simplement
! si a la fois numerateur et denominateur sont en incrémentant un pointeur, ce qui revient au même,
! divisibles par le meme nombre, le faire : si ce n’est que c’est d’un maniement sensiblement plus
! c’est pedestre, mais ca marche...
délicat. . .
m = min(abs(q%n),abs(q%d))
l1 : do i = 2, m
Les pointeurs sont importants en informatique parce
l2 : do ! il faut parfois recommencer que c’est le point de départ de l’allocation dynamique
if (mod(q%n,i) == 0 .and. mod(q%d,i) == 0 ) then de mémoire, puisqu’on accède ainsi librement à toute
q%n = q%n/i la mémoire sans en réserver des morceaux à telle ou
q%d = q%d/i telle variable. fortran90 gère l’allocation dynamique de
else mémoire autrement, comme on l’a vu, et -opinion qui n’en-
exit l2 gage que son auteur- de façon nettement plus prudente.
endif Autant dire que pour l’essentiel du calcul scientifique,
enddo l2 la capacité à utiliser des tableaux efficacement est beau-
enddo l1 coup plus importante. Toutefois, fortran90 introduit les
end subroutine simplify
pointeurs avec un certain nombre de garde-fous.
Ça donne par exemple : Un pointeur doit être déclaré avec le type de la variable
vers lequel il pointe : un pointeur donné ne peut pas avoir
$ ratio
pour cible un entier à un moment et un réel un peu plus
Num, denom 1: 5 2
tard :
Num, denom 2: 4 5
produit 2 1 ! declaration d’un pointeur vers un entier
somme 33 10 integer, pointer :: a
5 4 20 2 5 4 ! declaration d’un pointeur vers un tableau reel
ce qui est correct : × = = et + = real, dimension(:), pointer :: b
2 5 10 1 2 5
5×5+2×4 33
= . Il faut aussi déclarer explicitement des variables comme
2×5 10 cible (target en anglais) :
On peut, sans difficulté majeure, ajouter à cela les
deux autres opérations et l’on aura créé un type nou- integer, target :: n, m
veau et les opérations associées. Les types dérivés et les real, dimension(150), target :: x, y
opérations associées constituent un pas important du for-
Si l’on veut que a pointe vers m et b vers x, cela donne :
tran en direction de la programmation orientée « objet »
au détriment, sans doute, de la simplicité originelle du a => m
langage : la norme fortran2003 la développe d’ailleurs b => x
encore davantage. Quel intérêt ? On peut, par exemple, faire pointer un poin-
-Exercice : définir un type temps composé d’heures, teur vers un morceau de tableau
minutes, secondes et une addition et une soustraction
permettant de calculer en sexagécimal (par exemple : b => x(100:150)
1h32mn24s + 2h42mn39s = 4h15mn3s). ce qui permet d’optimiser des transferts de données d’un
-Exercice : définir un type triangle défini par les co- morceau de tableau à un autre : dans certains cas on
ordonnées de ses trois sommets et une opération * d’ho- économise ainsi de l’espace mémoire.
mothétie permettant de le dilater d’un facteur réel sans
déplacer son centre de gravité.
2.14.5 Récursivité.
2.14.4 Pointeurs. fortran90 l’autorise. . . c’est parfois commode, rare-
ment efficace, du moins pour le calcul scientifique pur et
« Le fortran est un langage dépassé, vieillot, ob- dur. L’exemple que l’on donne toujours est le calcul de
solète. . . » : ce sont des propos que l’on entend depuis factorielles : la définition de n! est,
plus de vingt ans41 , or le fortran continue à être lar-
gement employé en calcul scientifique ; ce sont donc sans n! = n(n − 1)!
41 Dans les années 1980, il advint un jour que le laboratoire où productions et demandèrent quel langage on utilisait afin d’inclure
je travaillais dut acquérir une station de travail ; les représentants le compilateur dans leur devis. Quand la réponse fut : « fortran »,
d’un des fournisseurs pressentis vinrent vanter les mérites de leurs nous eûmes droit à des regards pour le moins. . . incrédules !
Physique numérique, Philippe Depondt 39
Cela se programme sans difficulté à condition de spécifier les bases doivent être impérativement
que la function est récursive : apprises et maı̂trisées, car sans cela, on
s’expose à patauger sans grand profit
program factorielle dans un bourbier de détails informa-
implicit none tiques sans intérêt !
integer :: n, fact
write(*,’("Entrer un entier : ",$)’) ; read(*,*) n
write(*,*)"Factorielle", n," vaut ",fact(n)
end Ces remarques achèvent la partie langage de ce cours.
Dans la suite, les exemples seront donnés en fortran,
recursive function fact(n) result(f)
mais les algorithmes étudiés ne dépendent évidemment
implicit none
pas du langage de programmation choisi.
integer, intent(in) :: n
integer :: f
if ( n > 1 ) then
f = n*fact(n-1) ! ici la fonction s’appelle
! elle-meme, c’est recursif
else
f = 1
endif
end function fact
Un prototype de TP
41
42 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
non-nulle, elle, n’existe que si r > 1 car on ne considère r = 4 n’a pas de comportement aisément caractérisable à
que les valeurs de x positives, s’agissant d’un nombre d’in- première vue.
sectes. Imaginons que l’on se trouve en xp à une distance δ,
Par ailleurs, comme xp+1 doit, comme xp , par définition, 1
petite, d’un point fixe 1 − tel que :
être inférieur à un, le maximum de la fonction f (xp ) = r
r xp (1 − xp ) doit être également inférieur à un. Il est situé 1
1 r xp = 1 − +δ
en xp = et vaut , autrement dit, r ≤ 4. Ainsi, on se r
2 4
restreindra à l’intervalle 1 < r ≤ 4 et les points fixes vont alors, en appliquant à xp l’équation logistique :
3
de 0 pour r = 1 à pour r = 4 (figure 3.1).
4 1 1
xp+1 = r (1 − ) + δ 1 − (1 − ) − δ
0.8 r r
0.7 1
= (1 − ) + δ (2 − r(1 + δ))
0.6
r
0.5 Le point xp+1 est-il plus proche du point fixe que xp ?
Point fixe
0.4
L’écart s’écrit :
0.3 1
xp+1 − (1 − ) = δ (2 − r(1 + δ))
0.2 r
≃ δ(2 − r)
0.1
0
1 1.5 2 2.5 3 3.5 4
puisqu’a priori δ est petit devant 1. Alors :
r – si r = 2, on obtient un écart nul, le système a
convergé,
Fig. 3.1 – Point fixe de l’équation logistique. – si r = 3, on obtient −δ, l’écart n’a pas diminué mais
change de signe
– si r = 4, on obtient −2δ, l’écart a augmenté en valeur
3.2.2.2 Y a-t-il convergence ? absolue et l’on peut donc s’attendre à des ennuis !
Plus généralement, si 1 < r < 3, l’écart diminue en va-
L’existence de points fixes ne signifie pas automati- leur absolue près du point fixe, et donc on s’attend à une
quement que le système doive converger vers l’un d’eux. convergence sans problème, mais si r > 3, l’écart tend à
Un façon de s’en convaincre est de faire quelques essais augmenter.
comme sur la figure 3.2 sur laquelle on a tracé les fonc- Voici donc un premier tour d’horizon sur ce problème :
tions f (x) = r x(1 − x) pour plusieurs valeurs de r et cela peut constituer la matière du TD qui précède le
g(x) = x : les points fixes sont donnés par l’intersection TP. S’il doit y avoir des subtilités de programmation à
des deux fonctions. connaı̂tre ou des algorithmes particuliers à appliquer (ce
1
r=1
qui n’est pas vraiment le cas ici), ils seront également
r=2
r=3
traités en TD.
0.8
r=4
x
Rien de ce qui précède ne doit obligatoirement figurer
dans votre compte-rendu, sinon pour vos propres ar-
0.6 chives : l’idée est qu’une séance de TP de 4 heures est
bien courte pour perdre du temps à recopier des notes
x(p+1)
0.4 prises en travaux dirigés, mieux vaut faire cela chez soi !
0.2
3.2.3 Étude numérique.
0
0 0.2 0.4 0.6 0.8 1 En revanche, le programme utilisé pour résoudre le
x(p)
problème doit impérativement être fourni, de préférence
avec des commentaires, éventuellement manuscrits, qui
Fig. 3.2 – Étude graphique de l’équation logistique. Voir permettent de savoir ce que ce programme est censé faire
le texte. et comment il le fait.
write(1,*) p, x 0.5
r=2
x0 = x
enddo 0.4
close(1)
end 0.3
x(p)
Si le résultat du calcul est juste un nombre, ce nombre 0.2
doit être fourni dans le compte-rendu et ce résultat dis-
cuté. Si le programme sert à une mise au point ou à 0.1
x(p)
mais de faire de la physique à l’aide de ce programme. . . 0.666
0.664
3 0.6
avec l’intuition que l’on en avait. 0.55
– pour r = 3, 5, le système est encore périodique, mais 0.5
deux « périodes » successives sont différentes, autre- 0.45
ment dit, la période est deux fois plus longue. 0.4
0.8
Lorqu’on modifie un programme, il faut expliquer ce que
0.7
l’on est en train de faire, et évidemment fournir le pro-
0.6
gramme modifié agrémenté des commentaires adéquats.
x(p)
0.5
0.4
On aimerait étudier le comportement de la population
0.3
d’insectes de façon plus systématique : pour cela, il suffit
0.2
d’ajouter au programme une boucle sur r et de tracer xp
0.1
non plus en fonction de p mais en fonction de r. On prend
0
soin de ne garder que la fin du calcul pour chaque valeur 950 955 960 965 970 975 980 985 990 995 1000
p
de r afin d’éliminer un éventuel transitoire.
Fig. 3.3 – Évolution de la population d’insectes pour r =
program logistic
2, 3, 3, 5 et 4. Condition initiale x0 = 0, 01.
implicit none
! equation logistique
! diagramme de bifurcations
real :: r, x, x0
integer :: i, p, n=2000, nsav
open(1,file=’logistic2.out’) do p = 1, n
! x = r*x0*(1.-x0)
do i = 200, 400 ! boucle sur r ! le calcul est identique au precedent, mais on
r = 0.01*i ! ecrit maintenant x en fonction de r
x0 = 0.01 ! reinitialisation de x0 if ( p > n-nsav ) write(1,*) r, x
! pour chaque nouvel r x0 = x
if ( r < 3 ) then ! quand le systeme enddo
nsav = 10 ! converge, on ne garde que !
else ! quelques pas mais quand ca enddo
nsav = 1000 ! devient irregulier, on doit !
endif ! en garder davantage close(1)
! end
44 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
1
Eq. logistique
0.9 Pt fixe
0.8
0.7
0.6
x(p)
0.5
0.4
0.3
0.2
0.1
0
2 2.5 3 3.5 4
r
Fig. 3.4 – Diagramme de bifurcations pour l’équation logistique. En bleu est représentée la courbe des points fixes
théoriques.
On obtient ce qu’on appelle un diagramme de bifurca- On constatera les poids respectifs de l’informatique et de
tions (figure 3.4). la physique (il est vrai qu’en l’occurence, il s’agit plutôt
d’éco-zoologie, mais peu importe) dans ce qui précède :
En premier lieu, on constate que pour r < 3 le résultat la balance penche fortement du côté de cette dernière et
coincide parfaitement avec la courbe des points fixes c’est ainsi qu’il doit en être. Parfois au cours d’un TP, on
théoriques, ce qui est rassurant quant au bon fonction- pourra rencontrer des aspects techniques plus délicats
nement du programme (mais ne démontre en aucun cas que dans cet exemple et il faudra s’assurer avec autant
qu’il est dépourvu d’erreur !). de soin que possible que la méthode utilisée est digne de
confiance, mais le principe de base reste : « n’oublions
jamais que nous sommes des physiciens ! »
On observe ensuite qu’à partir de r = 3 la courbe se di-
vise en deux : cela signifie que pour chaque valeur de r, xp
Toutefois, après cette belle déclaration de principes, il
oscille entre deux valeurs comme sur la deuxième courbe
faut quand même s’occuper des méthodes elle-mêmes. . .
de la figure 3.3. Puis, un peu avant r = 3, 5, on a un nou-
veau dédoublement et xp prend quatre valeurs distinctes.
On observe encore un autre dédoublement pour huit va-
leurs avant de tomber dans un continuum qui signifie que
xp prend toutes les valeurs entre 0 et 1. Au-delà, on ob-
serve quelques « fenêtres d’ordre » dans les zones moins
sombres qui correspondent au fait que xp n’explore pas
toutes les valeurs du domaine.
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 θ + 3
d’autres seraient sans doute mieux à même de réaliser, 4πε 0 mg [(ℓ sin θ − xq )2 + (ℓ(1 − cos θ) − yq )2 ] 2
chaque méthode est illustrée par un exemple de phy-
sique puisé dans la mesure du possible dans le bagage =0 (4.1)
d’un étudiant de licence de physique, quitte à anticiper ce qui n’est pas évident à résoudre analytiquement1 .
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)
Fig. 4.1 – Le pendule chargé
a x b
L’énergie potentielle de gravitation du pendule peut Fig. 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 θ,
45
46 Licence de physique L3 : Physique Fondamentale & 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] Fig. 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
a a
call f(x, y, d)
xp = x - y/d
if (abs(xp-x) < eps ) exit
i2
x y x = xp
enddo
n2
newton = xp
end
Fig. 4.5 – Loi de Descartes : notations pour utiliser la Cela donne : 0.36264408 -0.000014537249. On laissera
méthode de Newton le soin au lecteur de vérifier que c’est correct. . .
La méthode de Newton a plusieurs avantages par rap-
La loi de Descartes s’écrit évidemment port à la méthode de la dichotomie. Elle est en général
beaucoup plus rapide, ce qui dans certains cas peut
n1 sin i1 = n2 sin i2 s’avérer décisif. Elle a par ailleurs le très gros avantage
48 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
0.8
de pouvoir se généraliser aisément à plusieurs dimensions tanh(x)−0.3*x
tanh(x)/x−0.3
comme on le verra dans la suite. Elle a l’inconvénient 0.6
qu’il faut pouvoir calculer, ou au moins estimer la dérivée
de la fonction, ce qui est parfois un peu laborieux (voir 0.4
l’équation (4.1) par exemple).
Elle recèle toutefois quelques pièges parfois redoutables. 0.2
Si par exemple, l’un des points xn est tel que f ′ (xn ) ∼ 0,
0
le point xn+1 risque de se trouver projeté fort loin du
point de départ2 , un résultat contrariant alors qu’il s’agit −0.2
d’une recherche en principe locale puisque basée sur une
approximation linéaire. Un deuxième piège est que si la −0.4
fonction étudiée possède plusieurs zéros, rien ne permet
de choisir à coup sûr celui que l’on veut puisqu’il n’y a −0.6
−4 −2 0 2 4
pas d’intervalle de recherche pré-défini : on peut certes
forcer le résultat à rester dans un intervalle donné. Parfois, tanh(x)
Fig. 4.6 – Les courbes de tanh(x) − 0.3x et de −
enfin, l’algorithme ne converge pas, même si une solution x
existe, en cas de changement de courbure malencontreux 0.3 montrant que la deuxième permet d’éliminer la racine
par exemple : un choix plus judicieux du point de départ triviale pour x = 0 alors que les deux autres racines ne
peut régler le problème. sont pas affectées.
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 an-
−a=0
x glais. Un octet constitue généralement un emplacement
qui élimine la solution triviale si a 6= 1, puisque correspondant à 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
4.2 Représentation des nombres on aimerait pouvoir utiliser, d’une part, des nombres plus
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 à
Dans ce qui précède, on a introduit, sans trop insister, deux, soit, toujours sur un octet : 00000001 = 1 et
la notion de précision du résultat. Cette précision n’est 11111110 = −1 au lieu de 254. Ainsi de 00000000 = 0
jamais absolue pour plusieurs raisons. à 01111111 = 127 on code des nombres positifs et pour
2 Shot off to outer space comme disent joliment nos collègues les nombres négatifs, 11111110 = −1, 11111101 = −2,
américains. . . ., jusqu’à 11111111 = −128. On peut vérifier qu’avec
Physique numérique, Philippe Depondt 49
cette convention l’addition suivante est correcte : précision machine, vaut 1000 : peu importe que l’on répète
−4 11111011 l’opération un milliard de fois ! Finalement 1000 − 1000 =
+2 00000010 0. . . En déclarant s en double precision on obtient :
= −2 11111101 0.9999894254
Afin d’avoir une plage de nombres accessibles plus Il faut donc être assez méfiant lorsqu’on traite des
grande, les octets sont généralement regroupés par en- nombres qui prennent des valeurs très différentes. Il est
sembles de quatre (appelés mots), soit 32 bits3 . Ainsi les aussi prudent de se rappeler que lorsqu’on fait des calculs
nombres entiers peuvent aller de −231 = −2 147 483 648 à itératifs, ce qui est très souvent le cas, les erreurs peuvent
231 − 1 = 2 147 483 647, ce qui est largement suffisant pour s’ajouter les unes aux autres pour ne plus être négligeables
la plupart des applications, mais, évidemment, pas infini. du tout !
Un deuxième cas de figure classique est le suivant :
4.2.2 Les nombres réels. if( a == 0. ) then
où a est un réel. Le résultat d’une telle instruction est
Parler de nombres réels est un abus de langage puisque
aléatoire à cause des erreurs d’arrondi ! En effet, si a est le
l’on
√ ne peut traiter que les nombres rationnels. Ainsi, résultat de calculs longs et compliqués, va-t-il tomber pile
2 sera approximé par, par exemple, 1,414213562. De
sur zéro ou sur 0.1234567E-35 ? Il vaut bien mieux définir
plus, on est obligé de se restreindre encore davantage aux
a priori la précision souhaitée et donner l’instruction :
nombres rationnels à un nombre fini de chiffres : 1/3 de-
if( abs(a) < epsilon ) then
vient par exemple 0,3333333333. Un tel nombre rationnel,
si la valeur absolue de a est plus petite que ε, alors. . .
si l’on supprime la virgule, est un nombre entier : il suf-
fit de préciser l’emplacement de la virgule, par une puis-
Ainsi, une règle d’or à ne jamais oublier lors-
sance de 10, par exemple. Ainsi, 1,414213562 peut s’écrire
qu’on fait des calculs numériques est de vérifier
1414213562 10−9 . Une autre façon de s’y prendre serait :
sur des cas dont on connait la solution que les
0, 1414213562 101 . L’avantage de la deuxième est que l’ex-
programmes que l’on a écrits donnent bien la so-
pression des chiffres composant le nombre est comprise
lution attendue. . . tout en sachant qu’il ne s’agit
entre 0 et 1, chaque chiffre correspondant non plus à une
en aucun cas d’une garantie !
puissance positive de 10 mais à une puissance négative.
Il faut donc trois choses : le signe, la position de la vir-
gule (ou l’exposant), et les chiffres (la mantisse). Le raison- 4.3 Suites et séries.
nement mené jusqu’à présent avec une notation décimale
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 oc-
tets, soit 32 bits : 1 bit pour le signe, 8 bits pour l’exposant Une suite est définie par une relation de récurrence du
qui donne une puissance de 2 puisqu’il s’agit de nombres type :
binaires, 23 bits pour la mantisse ; or le premier bit de la un = f (un−1 , un−2 , . . . , un−p )
mantisse est toujours 1 (sinon, il faudrait diminuer l’expo-
sant de 1), donc on l’omet ce qui permet de gagner un bit où un est une fonction de l’élément de la suite précédent
significatif. ou de plusieurs éléments précédents. Par exemple, la fac-
Dans ces conditions, les nombres réels peuvent s’étendre torielle :
de ±1, 175494 10−38 à ±3, 402823 1038 avec sept chiffres n! = n(n − 1)! avec 1! = 1
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
de 2, 225074 10−308 à 1, 797693 10308 . Certaines machines n
X
acceptent aussi les real*16 sur 16 octets. . . sn = ui ou bien sn = sn−1 + un
i=1
4.2.3 Conséquence. Il n’est pas utile de faire un tableau contenant tous les
La conséquence de tout ceci est que les calculs se font termes de la suite ou de la série, car on n’a en général
avec une certaine précision intrinsèque (qui est a priori besoin que du dernier terme : c’est le reproche que l’on
bonne : sept chiffres significatifs. . .). Imaginons toutefois faisait à la récursivité. Dans le cas de la factorielle, il suffit
le programme, certes stupide, suivant : d’écrire quelque chose qui ressemble à
implicit none f = 1
integer :: i do i = 2, n ; f = f*i ; enddo
real :: s
s = 1000. en faisant croı̂tre i dans une boucle. Pour une série, cela
do i = 1, 1000000000 deviendrait :
s = s + 1e-9
enddo s = ... ! expression du premier terme
write(*,*) s-1000. do i = 2, n
end s = s + .... ! expression du terme general
enddo
Le résultat obtenu est 0. et non 1. ! La raison en est
4 Le résultat précis dépend du type de la machine utilisée, du
que l’on ajoute 1000 + 1 10−9 ce qui, compte tenu de la
compilateur : ici, il s’agit d’une machine Linux avec g77. Parfois il
3 Certaines machines, comme les Cray ou certaines stations de peut être judicieux d’essayer le même programme sur deux machines
travail, utilisent des mots de huit octets, soit 64 bits. différentes avec deux compilateurs différents.
50 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
on remplace le calcul de la surface par une approximation soit en regroupant les termes identiques :
constituée d’une somme de surfaces de rectangles. !
Z b n−1
X
1 1
f (x) dx ∼ δx f (a) + f (a + iδx ) + f (b)
a 2 i=1
2
4.3.2.2 Méthode des trapèzes. La grosse différence entre une intégration numérique et
l’expression mathématique est que le pas d’intégration δx
Une méthode moins primitive et à peine plus compliquée ne tend pas vers zéro, dans un calcul numérique, il prend
est la méthode des trapèzes (figure 4.9). une valeur finie non nulle : c’est une approximation, il
reste à choisir cette valeur de la façon la moins arbitraire
possible.
Une première méthode serait de choisir δx arbitraire-
ment, faire le calcul d’intégrale, puis choisir une autre va-
leur et refaire le calcul. Si les deux résultats diffèrent d’une
quantité moindre que la précision souhaitée, c’est que le
calcul est « indépendant » de δx .
Il n’est pas interdit d’essayer de systématiser un peu ce
genre de recherche. Commençons par choisir δx = b − a,
alors une première estimation de l’intégrale par la méthode
des trapèzes serait :
f (a) + f (b)
S0 = (b − a)
2
Pour une deuxième estimation, on peut alors diviser δx
Fig. 4.9 – La méthode des trapèzes. par deux, on obtient alors :
(b − a) f (a) a+b f (b)
La surface du i-ième trapèze s’écrit : S1 = +f +
2 2 2 2
1 S0
si = (f (a + (i − 1)δx ) + f (a + iδx )) δx = + R1
2 2
et donc : avec, en posant h = b − a :
Z b Xn
1 h a+b
f (x) dx ∼ (f (a + (i − 1)δx ) + f (a + iδx )) δx R1 = f
a i=1
2 2 2
52 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
ce qui évite d’avoir à recalculer les deux points extrêmes. sp = s/2 + r*hm
On redivise le pas par deux, puis de nouveau encore, ! ---> le test force au moins quatre iterations
etc. Un calcul simple donne alors le terme général de la if( abs(s-sp) < eps .and. n > 3 ) exit
récurrence : s = sp
enddo
Sn−1 trapeze = sp
Sn = + Rn
2 end
2n−1
h X h
Rn = f a + (2i − 1) n 4.3.2.4 Un exemple : le principe de Fermat
2n i=1 2
Imaginons un rayon lumineux qui circule dans une fibre
On arrête le calcul lorsque l’écart entre deux résultats suc- optique cylindrique, parallèle à x, dont l’indice dépend de
cessifs est inférieur à la précision requise : la distance à l’axe :
|Sn − Sn−1 | < ε r2
n = n0 1 − 2
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 à gra-
de danger : soit par exemple la fonction suivante (figure
dient d’indice qui permet de piéger, pour ainsi dire, le
4.11),
rayon lumineux au centre de la fibre. Si l’on se place dans
le plan xOy, r2 se ramène à y 2 et chercher le trajet du
1 rayon lumineux revient à chercher la fonction y(x). Une
incursion dans le cours d’optique fournit l’équation de pro-
0.8 pagation d’un rayon lumineux :
0.6
d~r
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 à
Fig. 4.11 – Si l’on ne prend pas de précautions, l’intégrale dx. On obtient :
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 d2 y n0 y
et donc inférieur à ε : le programme s’arrêtera. La même n 2 =− 2
dx ρ
mésaventure arrive si l’on cherche
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 :
−π
2π
y(x) = a sin x
on trouve le résultat correct (soit 0), mais complètement λ
par hasard ! Il vaut mieux restreindre le calcul de 0 à π.
pour obtenir :
Comme souvent dans ce genre d’activités, un minimum de
λ = 2πρ
circonspection s’impose.
Un sous-programme pourrait donner quelque chose qui On obtient alors une trajectoire sinusoı̈dale de période
ressemble à : 2πρ indépendante de l’amplitude des oscillations : c’est
intéressant pratiquement, car ainsi le rayon, même si, ini-
double precision function trapeze(f, a, b, eps)
tialement, il n’est pas parfaitement dans l’axe, se bornera
implicit none
double precision :: f, a, b, eps, s, h, r, sp, hm
à osciller autour de celui-ci au cours de sa propagation.
integer :: n, m, i Tout ceci reste cependant un peu formel et entaché d’ap-
proximations.
h = b-a ; m = 1 Un cours d’optique normalement constitué affirme
s = h*(f(a)+f(b))*0.5d0 généralement -voire même démontre- que l’équation 4.2
do n = 1, 20 ! 20 iterations max est une conséquence du principe de Fermat qui veut que
m = 2*m ! 2**n le chemin optique ne dépende pas d’un petit changement
hm = h/m ; r =0. de trajectoire, soit :
do i = 1, m/2 ! de 1 a 2**(n-1) Z l
r = r + f(a+(2*i-1)*hm)
enddo L = n ds est un extremum
0
Physique numérique, Philippe Depondt 53
L
Pour le vérifier, calculons dans le cas de la trajectoire 4.3.2.5 Intégrales indéfinies.
λ
sinusoı̈dale ci-dessus : Dans toutes les discussions ci-dessus, seules les
Z λ 2
intégrales définies ont été abordées. On ne peut pas calcu-
L n0 y
= 1 − 2 ds ler par ces méthodes des intégrales du type :
λ λ 0 2ρ
or Z ∞
s 2 f (x)dx
dy
ds2 = dx2 + dy 2 ⇒ ds = dx 1 + −∞
dx
On a essentiellement deux solutions :
soit l’intégrale suivante à calculer :
1. la fonction f (x) doit tendre vers zéro lorsque x →
L
= ±∞, sinon le résultat est infini, alors on peut faire
λ l’approximation :
Z λ !s 2
2 2 2πx
n0 a sin λ 2π 2πx Z ∞ Z b
1− 1 + a2 cos2 dx
λ 0 2ρ2 λ λ f (x)dx ∼ f (x)dx
−∞ a
(4.3)
Choisissons de nous intéresser au cas où a est petit par avec a et b suffisamment grands en valeur absolue
rapport à λ : on peut alors développer la racine carrée : pour que l’erreur soit négligeable. Par exemple,
L Z ∞ Z 5σ
∼ x2 x2
λ e− σ2 dx ∼ e− σ2 dx
Z ! 2 ! −∞ −5σ
n0 λ a2 sin2 2πx
λ a2 2π 2 2πx
1− 1+ cos dx n’est pas une mauvaise approximation.
λ 0 2ρ2 2 λ λ
peut ensuiteR éliminer le terme en a4 et sachant que 2. une méthode plus élégante est de découper l’intégrale
ROn2π 2 2π 2 Z ∞ Z a Z b Z ∞
0
sin x dx = 0 cos x dx = π, on finit par avoir :
f (x)dx = f (x)dx + f (x)dx + f (x)dx
L a2 a2 π 2 −∞ −∞ a b
∼ n0 1 − 2 + 2
λ 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-
tribution linéique de charges sur une pelote de ficelle
ce qu’on avait déjà trouvé auparavent : l’intérêt du se-
de forme compliquée mais dont les extrémités vont à
cond calcul étant de montrer que le chemin optique ne
l’infini. Le potentiel créé à l’origine pourrait s’écrire :
dépendant pas de a, une source de lumière cohérente
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’abs-
0
cisse curviligne s. Admettons qu’une approximation
serait que lorsque s > b alors σ ∼ sς et que
−0.01 p
−0.02 x (s) + y 2 (s) + z 2 (s) ∼ s. On obtient alors,
2
−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
La même approximation pour s < a donnerait en fin
−0.07
de compte :
−0.08
" Z b #
−0.09
1 ς σ(s) ς
−0.1 V = − + p ds +
0 0.2 0.4 0.6 0.8 1 4πε0 a a x2 (s) + y 2 (s) + z 2 (s) b
a
Fig. 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 tion.
qu’on n’aurait probablement pas deviné sinon.
7 prendre par exemple ρ = 1 et n = 1.5. On calculera en double
0
On a vu, pour le problème de l’intégration, l’impor-
precision. tance du pas d’intégration : c’est déjà une première forme
54 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
pn (x) =
n
X (x − x0 ) . . . (x − xℓ−1 )(x − xℓ+1 ) . . . (x − xn )
f (xℓ )
(xℓ − x0 ) . . . (xℓ − xℓ−1 )(xℓ − xℓ+1 ) . . . (xℓ − xn )
ℓ=0
où i est un entier et δx un pas d’intégration, similaire à ce d’invoquer la bibliothèque lors de la compilation : c’est en
qui a déjà été vu dans le chapitre 4.3.2. On note alors : général une option de compilation11 : le compilateur ira
puiser dans la bibliothèque ce dont il a besoin. . .
T (x) = T (i δx ) = Ti Il n’y a donc aucune raison de réinventer la roue ! C’est
en fait une démarche très courante en calcul scientifique :
dT
La dérivée peut être approchée par : on se pose un problème de physique, puis on se demande
dx comment le traduire de façon à le traiter avec un pro-
dT Ti+1 − Ti gramme de bibliothèque déjà existant.
∼ Dans le cas présent, un système d’équations linéaires se
dx δx
présente de la façon suivante :
ou bien
dT Ti − Ti−1
a11 x1 + a12 x2 + a13 x3 + · · · + a1n xn = b1
∼
dx δx
a 21 x1 + a22 x2 + a23 x3 + · · · + a2n xn = b2
a31 x1 + a32 x2 + a33 x3 + · · · + a3n xn = b3
ou encore :
dT Ti+1 − Ti−1
a41 x1 + a42 x2 + a43 x3 + · · · + a4n xn = b4
∼
dx 2δx
···
an1 x1 + an2 x2 + an3 x3 + · · · + ann xn = bn
On préfèrera la troisième forme plus symétrique. La
dérivée seconde, la dérivée de la dérivée, s’écrit : où l’on cherche les xi . Le problème peut se reformuler en
termes matriciels :
Ti+1 − Ti Ti − Ti−1 A·x=b
−
d2 T δx δx Ti+1 − 2Ti + Ti−1
∼ = avec
dx2 δx δx2 a11 a12 a13 · · · a1n
a21 a22 a23 · · · a2n
Cela donne donc, avec des notations évidentes :
a31 a32 a33 · · · a3n
A=
dκ Ti+1 − Ti−1 Ti+1 − 2Ti + Ti−1 a41 a42 a43 · · · a4n
+ κi = − Q̇ i (4.6) · · ·
dx i 2δx δx2
an1 an2 an3 · · · ann
Si L est la longueur du barreau, alors n = δLx est le nombre et
de segments sur le barreau : c’est a priori un nombre qui x1 b1
x2 b2
peut être grand, quelques centaines, milliers, voire plus ;
x3 b3
or, l’équation (4.6) se reécrit aisément : x= b=
x4
b4
··· ···
1 dκ κi κi
+ Ti+1 − 2 2 Ti + xn bn
2δx dx i δx2 δx
Pour ce qui est de la matrice A, il faut savoir que
1 dκ κi fortran stocke les matrices multicolonnes colonne par
− + Ti−1 = −Q̇i colonne : une colonne, puis une autre, puis une autre.
2δx dx i δx2
En mémoire, se succèdent ainsi : a11 , a21 , a31 , · · · an1
ou bien (première colonne), a12 , a22 ,. . .(deuxième colonne),. . . etc.,
c’est-à-dire que le premier indice « va le plus vite » (en
ai,i+1 Ti+1 + ai,i Ti + ai,i−1 Ti−1 = bi ∀i C, c’est l’inverse). Si l’on veut écrire des programmes effi-
caces, il faut tenter de privilégier les appels à des éléments
où les ai,j sont connus et où l’on cherche à calculer les successifs en mémoire12 , et donc dans les boucles im-
Ti . On vient de reformuler le problème comme un système briquées, mettre autant que possible, le premier indice
linéaire de n équations à n inconnues (les Ti ) : si on peut dans la boucle la plus interne. Par exemple :
trouver des méthodes pour résoudre de très gros systèmes do j = 1, n ! boucles dans le bon ordre
d’équations linéaires, alors le problème ci-dessus peut être a(1:n,j) = ...
considéré comme résolu. enddo
et non l’inverse :
4.5.2 Systèmes d’équations linéaires. do i = 1, n ! boucles dans le mauvais ordre
Au delà de n = 2 ou 3, il ne faut surtout pas tenter de a(i,1:n) = ...
enddo
résoudre le système linéaire en procédant par élimination
comme on le fait d’habitude pour une résolution à la main : Pour résoudre le système d’équations, on pourrait ima-
les problèmes de stabilité numérique deviennent très vite giner qu’il suffise de calculer l’inverse de la matrice A et
cruciaux. Il vaut bien mieux utiliser des sous-programmes faire le produit :
de bibliothèque : ce sont des programmes déjà écrits, sou- x = A−1 · b
vent depuis longtemps, éprouvés, dont les qualités et les mais il se trouve que les algorithmes de résolution directe
défauts sont connus, compilés et rassemblés dans des bi- du système d’équations sont plus efficaces.
bliothèques. Il suffit d’appeller le sous-programme choisi 11 généralement,l’option -l (pour library=bibliothèque), par
par un call dans le programme que l’on a écrit comme exemple avec la bibliothèque linpack : g95 machin.f90 -llinpack
n’importe quel autre sous-programme, en suivant toute- -o machin.
fois les indications fournies dans la documentation10 puis 12 Parce que le compilateur gère mieux les transferts entre mémoire
Il faut savoir cependant que les bibliothèques pro- nuls. On écrit plutôt
posent généralement un très grand nombre de sous-
d1 f1 0 0 0 ··· 0
programmes prévus pour des cas très divers : il est
donc conseillé de choisir le programme adapté. Toutefois, e2 d2 f2 0 0 ··· 0
0 e3 d3 f3 0 0
pour la plupart des problèmes « standards » du physi- ···
··· ··· ··· ··· ··· · · · · ··
cien, la méthode LU est très satisfaisante, mais pour les A=
··· 0 ei di fi 0 ···
problèmes exigeant d’énormes matrices creuses tels que les ··· ··· ··· ··· ··· ··· ···
méthodes d’éléments finis (pour la résolution de problèmes
0 0 · · · 0 en−1 dn−1 fn−1
de mécanique des fluides par exemple), des méthodes 0 0 ··· 0 0 en dn
spécialement prévues à cet effet doivent être utilisées.
qui ne nécessite que trois tableaux de n éléments, d pour
la diagonale, e pour la sous-diagonale et f pour la sur-
4.5.2.3 Matrice inverse. diagonale. Noter que e1 et fn ne sont pas définis.
Les équations (4.8) et (4.9) se réduisent à :
Une fois la décomposition achevée, il est facile de rem-
placer b par : i = j − 1 uj−1j = ej
i=j ujj = dj − ljj−1 uj−1j
1
0 fj
i = j + 1 lj+1j =
0 ujj
..
. Les équations ci-dessus ne constituent pas en elles-même
0 l’intérêt principal de ce paragraphe : le but est ici d’atti-
rer l’attention sur le fait que pour un type de matrice,
ce qui donne la première colonne de A−1 dans x, puis on la méthode de résolution que l’on choisira n’est pas tou-
procède colonne par colonne en posant : jours la même que pour un autre type de matrice. Les
bibliothèques sont parfois fort riches et il est de bon
0 ton de chercher un peu dans la documentation quel peut
.. être le sous-programme le plus adapté au cas particu-
.
lier envisagé. Il existe des solutions pour des matrices
b= 1
. « bande-diagonales » ou des solutions itératives par ap-
.. proximations successives pour des problèmes difficiles, des
0 décompositions en valeurs singulières quand le problème
se pose. . ., les ressources sont abondantes, parfois un peu
en plaçant le nombre 1 sur la i-ème ligne de b pour obtenir trop, même !
la i-ème colonne de A−1 .
4.5.3 Une généralisation de la méthode de
Newton à plusieurs dimensions.
4.5.2.4 Déterminant d’une matrice.
Au chapitre 4.1.2, on a mentionné le fait que la méthode
C’est encore plus simple : de Newton de recherche de zéro pouvait se généraliser à
plusieurs dimensions. Cela peut être utile, si par exemple,
Y n
au lieu d’un seul pendule comme dans l’exemple, on en
det A = ujj avait plusieurs couplés entre eux et non plus astreints à se
j=1
déplacer dans un plan : on aurait alors deux angles polaires
par pendule à trouver et donc un système de 2N variables
à rechercher.
4.5.2.5 Matrice tridiagonale.
C’est le moment de s’y attaquer. Soit donc n fonctions
Si l’on étudie l’équation (4.6), on s’aperçoit vite que de n variables
seuls les termes en i − 1, i et i + 1 sont non nuls. La
fj (x1 , . . . , xi , . . . , xn ), ∀j ∈ [1, n]
matrice A ne comporte alors que des termes diagonaux,
sous-diagonaux et sur-diagonaux : elle est donc tridiago- dont on suppose qu’elles possèdent un zéro et qu’elles sont
nale : raisonnablement « civilisées »14 : ces fonctions ne sont
toutefois évidemment pas linéaires.
a11 a12 0 0 0 ··· 0
a21 a22 a23 0 0 0
On démarre la recherche comme avant à partir d’un
···
0 a32 a33 a34 0 0 point de départ :
···
··· ··· ··· ··· ··· ··· ···
A=
(0) (0)
x1 , . . . , xi , . . . , x(0)
··· 0 aii−1 aii aii+1 0 ··· n
··· ··· ··· ··· ··· ··· ···
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 14 Le terme civilisé pour une fonction signifie en gros que l’algo-
A avec ses n2 éléments puisque, pour la plupart, ils sont rithme que l’on va utiliser marche. . .
Physique numérique, Philippe Depondt 59
= ce qui donne :
(0) (0)
fj (x1 , . . . , xi , . . . , x(0)
n )+ g C
2
ω a1 = a1 + (a1 − a2 )
∂fj ∂fj ∂fj ℓ1 m1 ℓ 1
dx1 + . . . + dxi + . . . + dxn
∂x1 ∂xi ∂xn
g C
ω 2 a2 = a2 + (a2 − a1 )
où dxi = xi −
(0)
xi . On cherche le point {xi } tel que ℓ2 m2 ℓ 2
fj (x1 , . . . , xi , . . . , xn ) = 0, ∀j, donc les équations ci- et :
dessus se reécrivent :
g C 2 C
∂fj ∂fj ∂fj
+ − ω a1 − a2 = 0
dx1 + . . . + dxi + . . . + dxn ℓ1 m1 ℓ 1 m1 ℓ 1
∂x1 ∂xi ∂xn
C g C
= − a1 + + − ω 2 a2 = 0
m2 ℓ 2 ℓ2 m2 ℓ 2
(0) (0)
−fj (x1 , . . . , xi , . . . , x(0)
n )
ce qui se résout aisément en écrivant que le déterminant
C’est un système d’équations linéaires dont les inconnues du système est nul, etc.15
sont les {dxi } : Cependant, on peut reécrire le problème matricielle-
J · dx(1) = −f (0) ment :
avec des notations sans surprise. La matrice J des dérivées D · a = ω2a
∂fj
partielles, Jij = , s’appelle la matrice jacobienne. avec évidemment :
∂xi
On résout donc le système, ce qui permet de calculer les
g C C
(1)
{xi } puis on recommence jusqu’à convergence, comme + −
ℓ1 m1 ℓ 1 m1 ℓ 1 a1
dans le cas à une dimension. D=
, a =
C g C a2
− +
m2 ℓ 2 ℓ2 m2 ℓ 2
4.5.4 Problèmes de vecteurs propres et de
valeurs propres ou eigenproblems. La matrice D s’appelle la matrice dynamique du système
et l’on s’aperçoit donc que ω 2 est une valeur propre de
Il s’agit de résoudre l’équation :
la matrice dynamique et que a en est un vecteur propre.
A · x = λx Pour un système 2 × 2 comme celui-ci, l’intérêt d’une telle
remarque n’est pas évident, mais pour un système 100 ×
où connaissant A, on en cherche les valeurs propres λ et 100 ? Par exemple, une molécule qui comporte ne serait-
les vecteurs propres x. ce que quelques dizaines d’atomes. . . il suffit alors d’écrire
la matrice dynamique du système, une matrice n × n où
4.5.4.1 Un exemple : les modes propres d’un n est le nombre de degrés de liberté du système, et d’en
ensemble d’oscillateurs harmoniques chercher valeurs et vecteurs propres.
couplés. Il se trouve qu’il y a des algorithmes très efficaces pour
calculer numériquement les valeurs propres et les vecteurs
Prenons un cas très simple : deux pendules simples propres de très grosses matrices.
couplés par un fil de torsion. L’énergie potentielle du Ici encore, la façon de procéder dépend du type de ma-
système s’écrit : trice que l’on veut étudier, et ici encore, il faut faire appel
1 à des programmes de bibliothèque.
V = −m1 g cos θ1 − m2 g cos θ2 + C(θ1 − θ2 )2
2
4.5.4.2 Matrices tridiagonales symétriques : la
avec des notations évidentes. Les équations du mouvement
méthode QL.
s’en déduisent sans difficulté :
La matrice dynamique du paragraphe 4.5.4.1 peut être
g C √
θ̈1 = − ℓ sin θ1 − m ℓ (θ1 − θ2 ) symétrisée √ en remplaçant a1 par α1 = m1 ℓ1 a1 et a2
1 1 1
par α2 = m1 ℓ2 a2 . De plus, si le nombre de pendules
g C
θ̈2 = − sin θ2 − (θ2 − θ1 ) est plus grand que deux, si les pendules sont alignés et
ℓ2 m2 ℓ 2 chaque pendule n’interagit qu’avec ses deux voisins les plus
Puisque l’on s’intéresse ici à un problème linéaire, on peut proches, la matrice D est tridiagonale symétrique. Il se
se restreindre à des oscillations de petite amplitude, et trouve que beaucoup de problèmes peuvent être ramenés
avec l’approximation habituelle, on obtient : au calcul des valeurs propres d’une matrice tridiagonale
symétrique qui est justement le cas le plus simple.
g C La plupart des programmes de bibliothèque utilise la
θ̈1 = − ℓ θ1 − m ℓ (θ1 − θ2 )
1 1 1 méthode QL qui consiste à faire une série de transforma-
g C tions orthogonales :
θ̈2 = − θ2 − (θ2 − θ1 )
ℓ2 m2 ℓ 2 15 C’est d’ailleurs un exercice conseillé : le déterminant donne une
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 ortho-
où Rs est une rotation plane judicieusement choisie et là normé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
l’équation (4.12), on obtient alors :
4.5.4.4 Problèmes aux valeurs propres généra-
lisés. δE = !
Ce sont des problèmes du type : X X X
δc∗k 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
Physique numérique, Philippe Depondt 61
avec des notations sans surprise. On reconnait là une 4.6 Problèmes autocohérents.
équation aux valeurs propres : la résoudre donne à la fois
les énergies propres et les coefficients correspondants du ou self-consistent problems en anglais.
développement de la fonction d’onde.
Pour des raisons diverses, il peut arriver cependant que 4.6.1 Qu’est-ce donc ?
la base de fonctions utilisée ne soit pas orthonormée : par
exemple, si l’on cherche des fonctions d’onde électroniques Imaginons, par exemple, un diélectrique constitué d’un
dans le champ d’un ensemble de noyaux, on peut vouloir ensemble d’atomes polarisables qui, lorsqu’ils sont sou-
utiliser des fonctions d’onde localisées sur les noyaux ato- mis à un champ électrique, voient leur nuage électronique
miques avec un certain recouvrement. Les produits sca- déformé. Ils portent alors un moment dipolaire dont on
laires : supposera ici selon l’approximation d’usage qu’il est pro-
< χℓ |χm >= sℓm portionnel au champ :
où les lettres en caractères gras représentent des vecteurs de notre fonction tend vers 1 lorsque x tend vers zéro :
de n éléments. On part d’une solution d’essai x[0] et l’on on est à la limite de la condition de convergence |a| < 1,
construit la séquence : ainsi, dans ce cas, plus on s’approche de la solution, plus la
convergence devient difficile. On en concluera néanmoins
x[k+1] = f (x[k] ) que le critère ci-dessus, a priori valable pour une fonction
linéaire, l’est également pour une fonction non-linéaire à
Le point fixe sera considéré comme atteint quand les
condition d’en connaı̂tre la dérivée au point fixe, ou du
x[k] n’évolueront plus de façon significative à chaque
moins d’être capable d’estimer si elle est, en valeur abso-
génération.
lue, inférieure à 117 .
Ce genre de raisonnement est généralisable à des
4.6.3 Est-ce que ça converge ? systèmes linéaires du type :
Rien n’est moins sûr ! Prenons un cas très simple pour x = Ax + b
lequel n = 1 et :
f (x) = ax On obtient évidemment que :
La solution est évidemment x = 0. Si l’on veut résoudre
[0] x[k] = Ak x[0] + I + A + A2 + . . . + Ak−1 b
ce problème par la méthode ci-dessus, on part d’un x
choisi arbitrairement et Pour que cela converge, on montre18 qu’il suffit que :
x[1] = a x[0] , x[2] = a x[1] = a2 x[0] ||A|| < 1
et bien sûr : où ||A|| est l’une des normes de A :
x[k] = ak x[0]
n
X
Si |a| < 1, la convergence est acquise, mais sinon ça di-
||A||m = max |aij |
verge ! i
j=1
Étudions maintenant le cas :
ou bien
f (x) = tanh x n
X
||A||l = max |aij |
j
là encore la solution x = 0 est connue. Le programme pour i=1
résoudre celà est d’une grande simplicité : ou encore v
uX
program autoco u n X
n
||A||k = t |aij |2
implicit none
i=1 j=1
real :: x=1. ! point de depart de la recherche
integer :: k, kmax=100000 En particulier, si l’on a :
open(1,file=’autoco.res’)
write(1,*) 0, x 1
aij < , ∀ i, j ∈ [1, n]
do k = 1, kmax n
x = tanh(x)
if( mod(k, 10) == 0 ) write(1,*) k, x la suite converge.
enddo Pour un système non-linéaire, la matrice A devient la
close(1) matrice jacobienne J à proximité du point fixe : cela sup-
end pose que l’on soit capable d’évaluer cette matrice au point
fixe qui est justement ce que l’on cherche !
1 Afin de tempérer cette note apparemment pessimiste,
l’on mentionnera -et le lecteur est chaleureusement in-
vité à le vérifier- que le problème du diélectrique converge
0.1 de façon très satisfaisante en moins de 10 pas de cal-
cul à la suite d’un effort de programmation modeste. Ces
méthodes peuvent ainsi se révéler extrêmement précieuses
x
0.001
10 100 1000 10000 100000
k 4.7 Recherche des minima d’une
Fig. 4.16 – Convergence plus que médiocre de la recherche fonction.
autocohérente de la solution de l’équation x = tanh x (les
Il arrive bien souvent que l’on ait besoin, par exemple,
échelles sont logarithmiques).
du minimum de l’énergie potentielle d’un système qui
17 C’est un problème similaire à celui que l’on avait recontré à
Le résultat est malheureusement assez décevant (figure
propos de l’équation logistique (§ 3.2.2, la recherche des points fixes
4.16) : après 105 pas, on en est encore à quelques millièmes est en fait une recherche de zéros) où l’on avait vu qu’un système non-
de la solution ! On était habitué à mieux. . . Si l’on essaie linéaire pouvait être susceptible d’un comportement chaotique. . .
d’appliquer le critère ci-dessus, on s’aperçoit que la dérivée 18 Voir par exemple la référence [2], p. 322.
Physique numérique, Philippe Depondt 63
dépend d’une ou plusieurs variables pour en obtenir f (x) une fonction d’un ensemble de n variables désignées
l’équilibre stable : mettons, un ensemble d’atomes qui par x = (x1 , . . . , xn ). Un extremum est donné par :
composent une molécule dont on veut la conformation à
l’équilibre compte tenu des potentiels d’interaction atome- ∂f
di (x) = =0 ∀i
atome. ∂xi
Un autre exemple, qui sera étudié plus en détail dans le cela donne un système de n équations dont on cherche les
chapitre 4.8, est celui de la recherche du minimum d’écart zéros, or la variation δdi (x) de di pour des variations δxi
possible entre des données expérimentales et les prévisions s’écrit :
d’un modèle théorique qui dépend lui-même d’un certain
nombre de paramètres : il faut donc chercher les valeurs X ∂di X ∂2f
δdi (x) = δxj = δxj (4.14)
de ces paramètres qui donne l’écart le plus faible possible. ∂xj ∂xi ∂xj
j j
On pourrait aussi, dans un autre ordre d’idées, chercher
le chemin optique le plus court pour un rayon lumineux, La matrice H telle que
encore que la résolution d’une équation différentielle or-
dinaire selon les méthodes du chapitre 4.9 paraisse plus ∂2f
Hij =
facile dans un bon nombre de cas. ∂xi ∂xj
f(b)
1X ∂2f X ∂f
f (x) ∼ xi xj + xi + f0 (4.16)
2 i,j ∂xi ∂xj i
∂xi
peu plus près la méthode de la plus grande pente : il s’agit aisément que x0 · H · r0 = r0 · H · x0 .
20 Volontiers confuses dans la littérature, en tous cas guère pas-
en fait d’une approximation de f par une fonction quadra- sionnantes. . . mais ce n’est qu’une opinion qu’il n’est pas obligatoire
tique : de partager ! On se reportera éventuellement à la référence [7].
Physique numérique, Philippe Depondt 65
en choisissant αi pour que la recherche donne un minimum or les dxi ne sont pas indépendants à cause de l’équation
sur la direction di , et (4.18) ; mais cette équation dit que g est une constante et
que donc sa différentielle doit être nulle :
di · H · dj = 0, ∀i 6= j
Xn
∂g
Il se trouve que contrairement aux apparences, on peut dxi = 0
i=1
∂xi
très bien se passer de la connaissance (et de l’espace
mémoire correspondant) de la matrice Hessienne en uti- ce qui introduit un lien entre les dx . Il suffit d’addition-
i
lisant le fait que les résidus ri doivent être justement les ner ces deux relations en multipliant la deuxième par un
gradients de f ! « multiplicateur de Lagrange » λ :
Moralité : une fois encore, ne pas chercher à réinventer
ce qui existe déjà, utiliser des sous-programmes de bi- X n
∂f ∂g
bliothèque ! Ce qu’il faut retenir de ces méthodes, c’est +λ dxi = 0 (4.19)
i=1
∂xi ∂xi
qu’elles sont proches de la méthode de Newton déjà étudiée
pour la recherche de zéros et qu’elles ont les mêmes Choisissons alors, par exemple, λ pour que :
défauts. Ainsi, il s’agit toujours d’une recherche locale d’un
minimum d’une fonction assimilée à une fonction quadra- ∂f ∂g
+λ =0
tique qui ne possède qu’un seul minimum. La « vraie » ∂xn ∂xn
fonction n’est en général pas quadratique et si elle possède
plusieurs minima, on en trouvera au mieux un, sans savoir alors les n − 1 variables x1 , . . . , xn−1 sont indépendantes.
s’il n’y en a pas un nettement plus profond juste à côté ! La relation (4.19) est donc vraie pour tout jeu de variables
La méfiance et la circonspection sont les deux mamelles x1 , . . . , xn−1 , en particulier, si
du calcul numérique. . .
On verra toutefois, dans le chapitre 4.11, des façons dxi = 0, ∀i 6= k
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
4.7.5 Minimisation avec contrainte : les ∂xk ∂xk
multiplicateurs de Lagrange. une relation vraie pour tout k, puisqu’il a été choisi arbi-
Imaginons que l’on doive chercher comme auparavent trairement. C’est aussi vrai pour k = n puisqu’on a choisi
un minimum d’une fonction de n variables : λ ainsi : on retrouve ainsi la symétrie un instant perdue. . .
Le résultat de tout ceci est que si l’on définit la fonction :
min(f (x))
Q = f (x) + λg(x)
mais que les variables représentées par x ne soient pas
indépendantes mais reliées par une relation : le problème revient à chercher le minimum de Q avec
la contrainte (4.18), mais ce qui est nouveau par rap-
g(x) = 0 (4.18) 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-
c’est ce que l’on appelle une contrainte. Imaginons par siques.
exemple que l’on cherche la configuration d’équilibre d’un Prenons, par exemple, un système de pendules couplés
ensemble d’atomes mais que deux atomes donnés soient dont l’énergie potentielle s’écrit :
liés par une liaison très rigide, covalente par exemple, et
X 1 X
que la distance entre ces deux atomes soit connue. On a V =− mi gℓi cos θi + Cij (θi − θj )
2
ainsi un système de n − 1 variables indépendantes et l’on i
2 i,j>i
pourrait reécrire l’équation (4.18) :
avec des notations standards. Admettons que l’on cherche
xn = g̃(x1 , . . . , xn−1 ) l’équilibre d’un tel système (en dehors évidemment de la
solution triviale : certains angles peuvent être supérieurs
et l’on rechercherait le minimum d’une fonction à n − 1 à π) avec la contrainte que la somme des angles soit nulle
variables : (mettons qu’un système d’engrenages plus ou moins com-
plexe impose cela) :
min(f (x1 , . . . , xn−1 , g̃(x1 , . . . , xn−1 )))
X
Outre le fait que la recherche de la fonction g̃ n’est pas θi = 0
i
toujours facile, cette méthode est discutable en ce sens que
l’on a choisi d’éliminer la variable xn , mais pourquoi pas L’on écrira donc :
plutôt xn−1 ou xi ? Dans certains cas le choix est évident, X
dans d’autres non. Q=V +λ θi
Si l’on est à un extremum de f , alors pour tout ensemble i
de variations infinitésimales des xi on doit avoir :
et en exprimant les dérivées :
X n
∂f ∂Q
dxi = 0 =0
i=1
∂xi ∂xk
66 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
attention que des détecteurs très sensibles peuvent être On peut alors introduire le « facteur de confiance
capables de répondre à un nombre de « coups » très faible pondéré » ou weighed reliability factor :
pour lequel ce genre de théorème n’est plus valable. Les v
u
méthodes décrites ici ne sont alors plus en toute rigueur u χ2
directement utilisables. R w = u n
u X (f (xi , {pj }))2
t
i=1
σi2
4.8.2 Ajustement d’une fonction linéaire.
4.8.2.1 Sans les incertitudes. c’est un écart quadratique ramené à la moyenne des carrés
de la fonction. Il s’exprime en général en % : si Rw vaut par
Prenons pour commencer le cas le plus simple : y = exemple 10%, cela signifie en gros que la fonction théorique
ax + b où les deux paramètres ajustables sont a et b. On est éloignée de 10% des valeurs expérimentales, en unités
cherche donc a et b tels que de σ.
Xn Ce que l’on aimerait avoir, c’est l’incertitude sur a et b
2
χ2 = (axi + b − yi ) puisque ce sont les résultats de tous ces calculs. Posons :
i=1
ei = f (xi , {pj }) − yi
soit minimum. Il faut donc que les dérivées de χ2 par rap-
port aux deux paramètres soient nulles : c’est l’écart entre théorie et expérience pour le point i. Si
n l’on estime que cet écart est entièrement dû au paramètre
∂χ
2 X
2xi (axi + b − yi ) = 0 n˚ 1, on obtient
∂a =
i=1
Xn ∂ei ∂f (xi , {pj })
∂χ 2
ei = δp1 = δp1
= 2 (axi + b − y i ) = 0 ∂p ∂p1
∂b 1
i=1
une majoration de l’incertitude δp1 sur le premier pa-
Quelques lignes de calculs sans difficulté donnent : ramètre, or
n n n
X X X n
X n
X 2
n x y − x yi 2 ∂f (xi , {pj }
i i i χ = e2i = )δp1
i=1 i=1 i=1 ∂p1
a = !2 i=1 i=1
X n Xn
2
n xi − xi et en généralisant ceci à tous les paramètres pj :
i=1 i=1
Xn Xn Xn Xn v
u
2
xi yi − xi yi xi u χ2
δpj = u n
i=1 i=1 i=1 i=1 u X ∂f (xi , {pj })
b = !2 t
X n X n
∂pj
2
n xi − xi i=1
i=1 i=1
C’est ce que l’on appelle « déviations standards estimées »
Lire dans un fichier les n valeurs de x et de y et faire ce (estimated standard deviations ou esd ) et ce sont des esti-
calcul pour obtenir l’équation de la droite est extrêmement mations de majorants aux incertitudes sur les paramètres.
simple (c’est d’ailleurs un petit exercice de programmation Dans le cas d’une fonction linéaire, évidemment, ces for-
conseillé25) : on comprend que les éditeurs de logiciels ne mules se simplifient aisément, mais elles s’appliquent26 aux
se privent pas de l’inclure dans leurs productions. autres cas aussi.
où, donc, ṁ et m0 sont des constantes. Ces nombres n’ont, bien sûr, aucun sens.
-Étape n˚5 : déterminer ṁ et m0 selon les méthodes Moralité : ce n’est pas parce qu’un programme d’ajuste-
ci-dessus, ainsi que les déviations standards. Tracer ment donne un résultat que le modèle est validé et que les
les courbes expérimentale et théorique sur un même paramètres qu’il donne sont bons.
graphe ainsi que les écarts entre courbe théorique et Il ne faut pas oublier d’être physicien : quand on ajuste
expérimentale. un modèle, c’est qu’on pense qu’il est adapté, puis on
-Étape n˚6 : s’interroger sur les résultats obtenus. doit discuter les valeurs obtenues pour les paramètres
-Étape n˚7 : changer la valeur affichée sur le thermostat et
en les considérant comme des grandeurs physiques et
recommencer l’expérience. en se posant par exemple la question des conséquences
-Étape n˚8 : tracer la courbe ṁ(T ) pour 253 < T < 333K. qu’entraı̂nent les valeurs obtenues. Si, par exemple, dans
le cas de la loi d’Arrhenius, on trouve ∆E ∼ 106 joules
4.8.2.4 Une généralisation possible. (au lieu de quelques eV), on est en droit de se demander
si l’on a bien mesuré de la sorte l’énergie pour arracher
Ces méthodes qui ont le grand mérite d’être simples et
un atome d’une surface comme on le pensait initialement.
faciles à programmer ne sont pas limitées strictement aux
fonctions linéaires. Reprenons l’exemple de la loi d’Arrhe-
nius : 4.8.3 Ajustement d’un polynôme.
∆E
P = P0 e− kT On peut généraliser facilement les équations du para-
Si l’on fait les changements de variable : graphe 4.8.2.1 au cas d’un polynôme de degré p :
p
X
1
y = ln P x=− P (x) = c0 + c1 x + c2 x2 + . . . + cp xp = cj xj
kT
j=0
on obtient
y = ∆E x + ln P0 On cherche, bien sûr, les p + 1 coefficients cj , et donc,
!2
où ∆E et ln P0 tiennent le rôle de a et b dans le problème p
X
précédent. Ainsi, si l’on peut exprimer le problème de la n ck xki − yi
∂χ2 ∂ X
façon suivante : k=0
= =0
g(y) = a h(x) + b ∂cj ∂cj σi2
i=1
où g et h sont des fonctions connues sans paramètre ajus-
table (ici, k est la constante de Boltzmann, connue), tout
ce qui est ci-dessus est utilisable sans difficulté. Il est aisé de se rendre compte que si l’on pose :
Xn
4.8.2.5 Un caveat.
xj+k
i
Ajk = 2
i=1
σ i
n
X yi xj
Bj = 2
i
i=1
σ i
et : s
χ2
δck =
Akk
Les généralisations du type :
Fig. 4.19 – L’ajustement d’une fonction linéaire à des
données aléatoires donne un résultat. Ici : 0.79875 − g(y) = P (h(x))
0.24841 × x. Quel sens donner à ces nombres ? Aucun !
où g et h sont des fonctions connues sont évidemment
Malheureusement, tout ceci est un peu trop beau. En possibles.
effet il suffit de considérer les équations de ce chapitre À condition de disposer d’un sous-programme de
pour constater que ces méthodes donneront toujours un résolution de systèmes linéaires, tout ceci est très simple à
résultat, si absurde soit-il. La figure 4.19 montre l’ajuste- programmer, ça marche très bien et c’est rapide car il n’y
ment d’une droite sur un nuage de points aléatoires. a pas à converger plus ou moins laborieusement vers une
On obtient des nombres. solution.
Physique numérique, Philippe Depondt 69
¯ + µ sin 2π t
ṁ = ṁ
τ Exercice : essayer de calculer ṁ(t) à partir des données
de mesure. On constatera qu’il faut choisir un intervalle
Évidemment, c’est plus difficile parce qu’il ne s’agit plus
de mesure sensiblement plus court que la durée des va-
d’un polynôme et il faudra recourir aux méthodes du para-
¯ riations quotidiennes de la température : l’idéal étant un
graphe 4.8.6, mais c’est peut-être plus réaliste, puisque ṁ
enregistrement toutes les heures par exemple.
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- 4.8.5 Lissage : a dirty trick !
tionnel à la pression laquelle obéit probablement à une loi Il arrive que les informations intéressantes d’une
d’Arrhenius en fonction de la température. . . expérience soient difficilement visibles sur la courbe
expérimentale obtenue à cause du bruit. La plupart des
4.8.4 Dérivée locale d’une courbe logiciels d’acquisition offrent des options de smoothing ou
expérimentale. lissage visant à réduire le bruit. Il s’agit d’ajuster locale-
ment un polynôme comme précédemment, par exemple un
On peut aussi prendre la question différemment : l’in- polynôme d’ordre 2 :
connue « intéressante » de l’expérience est la vitesse
d’évaporation ṁ : c’est cela que l’on cherche à mesurer. Lij = c2i δx2 j 2 + c1i δxj + c0i
On voudrait calculer la dérivée locale de la mesure et c’est
à cette grandeur là que l’on tentera d’appliquer quelque mais seul la valeur en xi de l’ajustement local nous
théorie. intéresse :
Il suffit d’ajuster localement une fonction linéaire : Li0 = c0i
f (x) = c1i x + c0i car on remplacera les xi par les valeurs lissées Li0 . À la
suite de calculs sans difficulté, on obtient, toujours par les
à condition de rester proche de xi . Le χ2 devient local mêmes méthodes :
autour du point xi : q
X
+q
X J y
4 i + (J4 − J2 k 2 )(yi+k + yi−k )
2
χ2i = (c1i xk+i + c0i − yi+k ) Li0 = c0i = k=1
(4.20)
k=−q J0 J4 − J22
où q détermine la largeur de l’intervalle autour de xi où ce où q
calcul est fait. Le coefficient c1i est donc la dérivée locale X
Jℓ = jℓ
recherchée : un calcul sans difficulté donne :
j=−q
+q
X
3 soit :
c1i = k yi+k q(q + 1)(2q + 1)
δx q(q + 1)(2q + 1) J0 = 2q + 1, J2 = ,
k=−q
3
dans le cas où xi = x0 + iδx 27 . Évidemment, le résultat q(q + 1)(2q + 1)(3q 2 + 3q − 1)
J4 =
que l’on trouve dépend de q : si l’on choisit une valeur 15
de q petite, le résultat risque d’être sensible au bruit, en (les Jℓ pour ℓ impair sont bien sûr tous nuls) et
revanche, si q est trop grand, on perdra les fluctuations
rapides (voir la figure 4.20). Il faut choisir autant que pos- q(q + 1)(2q + 1)2 (4q 2 + 4q − 3)
J0 J4 − J22 =
sible qδx < ∆x l’ordre de grandeur des variations que l’on 45
cherche à détecter. C’est encore extrêmement facile à programmer et ra-
P+q 2 q(q+1)(2q+1)
27 Il faut se rappeler au passage que
−q
k = 3
. pide à l’exécution. Il faut cependant réaliser que 1˚ le
70 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
résultat dépend de q et 2˚ il ne s’agit en fait que d’une que ces méthodes deviennent infaillibles, elles conservent
moyenne pondérée de points voisins. Il y a ici une hy- les défauts déjà vus. Si le point de départ de la recherche,
pothèse sous-jacente très importante : c’est que les varia- les paramètres initiaux, est trop éloigné d’une solution, le
tions intéressantes sont de longueur d’onde ou de dimen- résultat obtenu risque d’être absurde, si le modèle com-
sion caractéristique grande par rapport aux fluctuations porte un trop grand nombre de paramètres ajustables
dues au bruit et donc à l’intervalle balayé dans l’équation (chaque paramètre ajoute une dimension à l’espace de re-
(4.20). C’est pour cela qu’il vaut généralement mieux, sauf cherche) la signification du résultat final risque d’être assez
pour des raisons « cosmétiques » ne pas faire de lissage, et, discutable. . .
au contraire, ajuster une fonction physiquement justifiée Ainsi, lorsqu’on ajuste un modèle théorique à une
aux résultats non lissés : si l’information intéressante est expérience, on est donc confronté à deux types de diffi-
là et si le modèle choisi est susceptible de la révéler, l’ajus- cultés :
tement devrait la faire apparaı̂tre. – la recherche du minimum de χ2 , il est parfois difficile
de se convaincre que le minimum trouvé est bien le
4.8.6 Ajustement non-linéaire. minimum de la fonction
– le fait que d’avoir trouvé le minimum de χ2 ne valide
Ce qui rend l’ajustement de polynômes si simple, c’est en aucun cas le modèle utilisé.
que la dépendance d’un polynôme par rapport aux pa-
Ces mises en garde ne doivent toutefois pas être vues
ramètres, c’est-à-dire aux coefficients, est linéaire : ax2 +
comme devant dissuader d’utiliser ces outils : il faut les
bx + c est une fonction linéaire de a, b et c, même si ce
utiliser, ils sont d’une grande puissance ! Parfois, un ajus-
n’est pas une fonction linéaire de x. En revanche, on peut
tement difficile ou qui paraı̂t donner des résultats douteux
vouloir chercher à ajuster une fonction comme :
est une indication qu’un autre modèle (pas forcément plus
L0 compliqué, d’ailleurs) serait peut-être meilleur. Il faut sim-
L(x) = 2 plement se rappeler que l’ordinateur qui fait le calcul est
x − x0
1+ un serviteur puissant mais. . . stupide ! Au physicien de
γ
faire son métier et de garder un regard critique.
C’est une lorentzienne comme sur la figure 4.21 où, comme Il existe, au reste, de bonnes habitudes qui peuvent ai-
le montre une analyse élémentaire, L0 est la hauteur de der à éviter des mésaventures. La première est de tracer
la courbe, x0 la position de son maximum et γ sa demi- sur un même graphe la courbe théorique et les résultats
largeur à mi-hauteur. Il est facile de montrer que la lo- expérimentaux pour voir si ça ressemble ! L’œil humain
rentzienne est le module au carré de la transformée de est un bon juge en la matière. On peut pousser un peu
t
Fourier de eiωt− τ et donc la réponse spectrale des oscilla- plus loin en traçant la courbe des écarts entre fonction
tions amorties, ce qui en fait une courbe très répandue en théorique et expérience : en principe, on ne devrait voir
spectroscopie, par exemple optique : la position du som- que du bruit, c’est-à-dire un signal aléatoire, symétrique
met de la courbe donne la fréquence de l’oscillateur et sa par rapport à l’axe des abscisses. Si des zones où les écarts
largeur, l’amortissement. sont systématiquement positifs ou négatifs apparaissent,
c’est peut être le signe qu’il y a là à chercher davan-
1
tage. On peut aussi refaire l’ajustement à partir de jeux
0.9 de paramètres initiaux différents : il vaudrait mieux que
0.8 le résultat final n’en dépende pas trop ! Si certains pa-
0.7 ramètres se retrouvent affectés d’une déviation standard
estimée très élevée (par exemple d’un ordre de grandeur
0.6
comparable au paramètre lui-même), on se demander s’il
0.5 est vraiment utile de le garder : ne pourrait-on pas ima-
0.4 giner un modèle dont il est absent ? Si oui, est-ce que le
0.3 résultat obtenu est très différent du précédent ?
0.2 Voici un exemple authentique : il s’agissait d’une
expérience de diffusion Raman, c’est-à-dire de diffusion
0.1
inélastique de la lumière. On éclairait un échantillon avec
0
−5 0 5 10 de la lumière monochromatique de longueur d’onde connue
5145Å, et on analysait la lumière diffusée par l’échantillon
Fig. 4.21 – Lorentzienne avec L0 = 1, γ = 0.5 et x0 = 2. à l’aide d’un ensemble de réseaux. Le résultat expérimental
était l’intensité lumineuse en fonction de la pulsation
Les paramètres que l’on veut ajuster sont L0 , x0 et γ, I(ω) et la courbe obtenue ressemblait à la figure 4.21
or L n’est linéaire ni en x0 ni en γ ; alors on linéarise le avec du bruit. On connaissait les propriétés du disposi-
problème en sachant que le résultat ne sera pas correct tif expérimental et la théorie disait que le résultat devait
mais en espérant qu’il sera moins mauvais que le point être le produit de convolution d’une lorentzienne par une
de départ et l’on répète l’opération jusqu’à ce qu’une so- « fonction d’appareil » qui reproduisait les caractéristiques
lution acceptable soit trouvée. Il s’agit donc, une fois de du dispositif. L’ajustement donna, sans surprise, hauteur,
plus, de rechercher un minimum de χ2 en fonction de ses position et largeur de la lorentzienne. On traça alors la
paramètres, seulement, il n’y a plus de solution simple, courbe des écarts pour s’apercevoir qu’il y avait une bosse
il faut utiliser une méthode du type Newton ou gradient systématiquement positive au pied de cette lorentzienne.
conjugué avec les précautions qu’imposent ces méthodes : On tenta alors de reprendre l’ajustement avec d’autres pa-
ce n’est pas parce que cela fait partie d’un logiciel tout fait ramètres initiaux, et/ou en bloquant à des valeurs « rai-
Physique numérique, Philippe Depondt 71
sonnables » l’un ou l’autre paramètre sans jamais réussir Il suffit d’ajouter une deuxième lorentzienne :
à réduire cette bosse. . . Finalement, l’on décida d’intro- f(x) = l1/(1+((x-x1)/g1)**2)+l2/(1+((x-x2)/g2)**2)
duire dans le modèle une deuxième lorentzienne, toujours x1 = 940 ; x2 = 950 ; l = 1000
convoluée avec la fonction d’appareil : le résultat devint fit f(x) ’lorentz.out’ u 1 :2 :(1) via l1, l2, x1,
excellent ! La lumière diffusée comportait donc deux pics x2, g1, g2
à deux fréquences différentes et non un : le premier était et l’on obtient :
2500
celui que l’on voyait à l’œil nu, le deuxième, beaucoup plus f(x)
’lo2’
faible en intensité, à une fréquence légèrement supérieure,
était caché dans le pied du premier : l’analyse attentive du 2000
500
1500
début de l’intervalle dx : il y a là une dissymétrie génante, d’Euler et obtenir de nouvelles valeurs des yp : on ne trou-
car il n’y a pas de raison d’évaluer les dérivées au début vera pas le même résultat puisqu’on n’utilise pas les mêmes
plutôt qu’à la fin ou au milieu de l’intervalle. On retrouve dérivées, il ne s’agit toujours que d’estimations. Cela per-
les questions abordées pour l’intégration dans le chapitre met d’obtenir une troisième estimation de dérivées. Cette
4.3.2 par la méthode des rectangles, à gauche, à droite troisième estimation est utilisée pour faire un pas complet,
ou centrés. La différence est qu’alors, on pouvait calculer cette fois-ci, d’Euler, toujours à partir du même point de
la fonction à intégrer n’importe où : ce n’est plus le cas départ : quatrième estimation des yp et des dérivées. . .
puisque les valeurs des fonctions sont les réponses que l’on
cherche justement. On ne connait que les dérivées en fonc-
tion des valeurs prises par ce que l’on cherche, puisque les
(4)
fℓ dépendent des yp : on tourne en rond !
(2) (3)
(1)
(3)
y(x) première estimation de la dérivée (2)
deuxième estimation
y(x+dx)
sorties et un autre sous-programme qui contient la phy- Un autre exemple célèbre est l’équation de Schrödinger
sique du problème, soit le calcul des dérivées : dans le cas dépendant du temps : si l’on ne fait pas très attention, on
des lignes de champ, il doit calculer les composantes du obtient que la norme de la fonction d’onde diverge expo-
champ, sa norme et faire les rapports. nentiellement avec le temps, ce qui est fâcheux !
Cela ressemble certes à une recette de cuisine, mais Dans les deux cas, la méthode de Cranck et Nicholson
c’est un des chevaux de bataille des physiciens : c’est une peut être une solution.
méthode remarquablement efficace ! Une illustration en est Si l’on revient à la méthode d’Euler, la critique qui en
donnée figure 4.26. avait été faite était qu’elle est dissymétrique :
(k+1) (k) (k)
yℓ = yℓ + fℓ (xk , {yℓ′ })dx
la variation des fonctions étant entièrement calculée à par-
tir des valeurs des dérivées au début de l’intervalle : on
pourrait tout aussi bien faire le même calcul en utilisant
les dérivées à la fin de l’intervalle :
(k+1) (k) (k+1)
yℓ = yℓ + fℓ (xk+1 , {yℓ′ })dx
La méthode de Heun faisait une estimation des dérivées
en fin de l’intervalle par la méthode d’Euler, mais il y a
là encore une part d’arbitraire : on peut remarquer tou-
tefois que l’équation ci-dessus est une équation implicite,
(k+1)
les inconnues yℓ figurant dans le deuxième membre ;
il faut donc résoudre un système d’équations (en général
non-linéaires) :
(k+1) (k) (k+1)
yℓ − yℓ − fℓ (xk+1 , {yℓ′ })dx = 0
Il s’agit d’une équation différentielle qui se résoud analyti- Heun et Runge-Kutta, l’application est facile : il suf-
quement à la main avec un peu de travail31 , ou alors grâce fit de décomposer l’équation du deuxième ordre en deux
à un logiciel de calcul formel, et l’on obtient : équations du premier ordre, en introduisant une variable
supplémentaire v :
(r − 1)x0
x(t) =
rx0 + (r(1 − x0 ) − 1) e−(r−1)t ẋ = v
v̇ = − sin x
où x0 = x(t = 0). Pour r > 1, cette expression converge
exponentiellement vers son point fixe : plus de chaos ! Pour Cranck-Nicholson, il y a un peu plus de travail ;
On obtient donc un énorme changement qualitatif (figure soient, pour simplifier les notations, x = x(t) et v = v(t)
4.28)32 . x+ = x(t + δt) et v + = v(t + δt). Cela s’écrit :
1
v + v+
x+
dt=1
0.9 continu = x+ δt
2
0.8
sin x + sin x+
0.7 v+ = v− δt
0.6
2
0.5 où x+ et v + sont les inconnues. On a donc deux fonction
x
0.2 v + v+
f (x+ , v + ) = x − x+ + δt
0.1 2
0 sin x + sin x+
0 5 10 15 20 25 30 35 40 45 50 g(x+ , v + ) = v − v+ − δt
t 2
Fig. 4.28 – Résolution numérique avec dt = 1 et résolution On doit appliquer à x+ et v + des variations dx+ et dv + de
analytique de l’équation logistique pour r = 4 : qui a rai- façons à ce que ces fonctions s’annulent, c’est-à-dire que
son ? df = −f et dg = −g ; or, en linéarisant, comme d’habitude
Comme chaque fois que l’on dispose de plusieurs Le programme qui fait tout cela et calcule la variance de
méthodes pour résoudre un problème se pose la question : l’énergie en fonction du pas de temps peut s’écrire :
laquelle choisir ? Il serait bien sûr tellement agréable de
pouvoir répondre de façon univoque et définitive ! C’est, program pendule
hélas, trop demander. implicit none
integer, parameter :: n = 2
À titre indicatif, on a tenté de comparer les méthodes
real, dimension(n) :: theta
exposées ci-dessus dans le cas d’un pendule simple, dont real :: t, dt, tmax
l’équation du mouvement s’écrit : double precision :: e, em, e2m, e0
integer :: nstep, step, it
ẍ = − sin x character (len=1) :: ode
external :: d
où x est l’angle que fait le pendule avec la verticale.
Comme il s’agit d’un système non-dissipatif (sans force write(*,’("Runge-Kutta, Euler, Heun, Verlet, &
de frottement), l’énergie doit rester constante ; ainsi la & Cranck-Nicholson ? ")’,advance=’no’)
variance de l’énergie au cours d’une simulation devrait read(*,*) ode
être nulle : voilà donc un test pour mettre ces algo- open(1, file = ’pendule.var’)
rithmes à l’épreuve. Pour les méthodes d’Euler, Verlet, tmax = 157. ! 25 periodes
do it = -24, 4 ! boucle sur la valeur du
31 On a dt = 10.**(0.25*it) ! pas de temps
peut faire le changement de variable x(t) = b+cy(t) où a, b
et c sont des coefficients à déterminer et y(t) la nouvelle variable. nstep = nint(tmax/dt)
32 Voir H. Krivine, J. Treiner, A. Lesne, soumis Am. J. Phys. em = 0. ; e2m = 0.
Physique numérique, Philippe Depondt 77
Dans ce chapitre, nous verrons de façon aussi concrète Imaginons, par exemple, que l’on allume une lumière
que possible ce qu’est une transformée de Fourier pour à l’aide d’un interrupteur à un instant t0 − τ2 et que la
un physicien, sans que cela remplace un cours plus for- maintienne allumée pendant un temps τ , puis on l’éteint.
mel, puis l’on étudiera ce qu’en font les logiciels et sous- 34 À ne pas confondre avec Charles Fourier, philosophe, auteur de
programmes de transformée rapide afin de tenter de saisir l’utopie sociale fouriériste et des phalanstères.
la puissance mais aussi les limites de cet outil extraordi- 35 On peut considérer, pour se fixer les idées, t comme un temps
naire. et ν comme une fréquence, mais les relations données ici sont plus
générales : coordonnées spatiales et vecteur d’onde, par exemple,
sont susceptibles du même traitement, c’est d’ailleurs le cas pour la
33 « Que l’acheteur ouvre l’œil ». relation de Fourier.
Physique numérique, Philippe Depondt 79
Mettons, pour simplifier, que la lumière soit monochroma- durée du paquet d’onde devient petite, la distribution des
tique de fréquence ν0 . On a ainsi produit une onde plane fréquences s’élargit jusqu’à devenir infinie.
interrompue, pour ainsi dire de durée finie, dont l’ampli- Concrètement, si en actionnant à la main un inter-
tude peut s’écrire, au point ~r = 0 : rupteur, l’on allume une lumière ou un laser, puis on
l’éteint une seconde plus tard, la largeur de la distribu-
E(t) = E0 e−2πiν0 t si t0 − τ2 < t < t0 + τ2 tion de fréquences sera de l’ordre de 1Hz ; or la fréquence
E(t) = 0 sinon de la lumière visible est plutôt dans le domaine des
1014 Hz : l’élargissement en fréquences est complétement
La transformée de Fourier d’un tel signal donne, à la négligeable, le paquet d’ondes peut être considéré comme
suite d’un petit calcul : infini sans inconvénient, c’est d’ailleurs l’approximation
Z t0 + τ2 habituelle en optique. En revanche, si l’on choisit d’utiliser
E0 e2πi(ν−ν0 )t dt = un laser à impulsions, chaque impulsion37 durant quelques
t0 − τ2 centaines de femtosecondes38 (ça s’achète dans le com-
merce), la largeur spectrale est de l’ordre de 1013 Hz ce
E0 τ e2πi(ν−ν0 )t0 sinc π(ν − ν0 )τ (4.25) qui n’est plus du tout négligeable comme le montrera le
donc, essentiellement un sinus cardinal36 représenté sur la cours d’optique.
figure 4.30. Ces considérations ne se limitent bien sûr pas à l’op-
tique : un instrument de musique capable de « tenir »
1 une note, comme un orgue, un violon ou une trompette,
0.8 produira un son dont la hauteur ou la fréquence est bien
0.6 définie, alors que pour une percussion, timbale ou tam-
0.4 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
maine des communications, en général, on utilise une onde
−0.2 porteuse d’une certaine fréquence : il faut que la durée
−0.4 des impulsions qui codent l’information soit relativement
−0.6 longue par rapport à la période de la porteuse afin d’éviter
−0.8 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 2 4 6 8 10 de la transmission.
frequences
1
0.9 4.10.1.2 Quelques propriétés importantes.
0.8 4.10.1.2.1 Notations. La notation utilisée jusqu’ici
0.7 prend la convention temps-fréquence, or on pourrait tout
0.6 aussi bien éviter le facteur 2π grâce à la pulsation ω =
0.5 2πν : Z ∞
0.4 F (ω) = f (t) eiωt dt
−∞
0.3
et Z ∞
0.2 1
f (t) = F (ω) e−iωt dω
0.1 2π −∞
0
0 2 4 6 8 10 Évidemment, le changement de variable introduit le fac-
frequences teur de 1/2π dans la transformée inverse. Les notations
sont parfois diverses : il arrive de√trouver ce facteur réparti
Fig. 4.30 – Transformée de Fourier d’une onde plane in- équitablement sous forme de 1/ 2π dans les expressions
terrompue : en haut partie réelle de l’équation (4.25) pour de la transformée directe et inverse, ou purement et sim-
ν0 = 5, τ = 1 et t0 = 10. En bas, module au carré (i.e. plement supprimé. . . Il est vrai que cela n’a guère d’impor-
produit par son complexe conjugué) de la même chose : tance puisqu’il ne s’agit « que » d’un facteur multiplicatif !
c’est ce que l’on appelle le « spectre ». On a raisonné ici en termes de temps et de fréquence
mais rien n’oblige à ce que t soit un temps : il peut très bien
On constate que l’onde plane interrompue, au lieu de s’agir d’une coordonnée spatiale z et dans ce cas, on rem-
n’avoir qu’une fréquence bien définie ν0 comme une onde placera la pulsation par le vecteur d’onde k = 2π λ où λ peut
plane infinie, s’étale sur tout un spectre de fréquences. Ce être considéré comme une longueur d’onde, par exemple,
spectre est centré sur ν0 , la fréquence de l’onde plane de si ρ(z) est la densité électronique dans un matériau :
départ. Le premier zéro du sinus cardinal donne une esti- Z ∞
mation de la largeur du spectre : on trouve ν − ν0 = ± τ1 . S(k) = ρ(z) eikz dz
Ainsi, si la durée τ du paquet d’ondes devient grande jus- −∞
qu’à tendre vers l’infini, le spectre de fréquence se resserre la quantité S(k) s’appelle le facteur de structure et c’est
autour de ν0 jusqu’à ne plus comporter que la fréquence ce que l’on mesure (ou du moins son module au carré)
ν0 : on retrouve l’onde plane infinie. Au contraire, si la
37 Ou pulse en bon franglais.
36 sinc x sin x 38 1fs=10−15 s.
= x
.
80 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
lors d’expériences de diffraction de rayons X : c’est une c’est que l’onde plane infinie a une distribution spectrale
grandeur d’une considérable importance en physique de la qui ne comporte qu’une seule fréquence.
matière condensée : à partir de la connaissance du facteur La distribution de Dirac est parfois fort utile, si , par
de structure, on peut remonter39 à la densité électronique, exemple, on a une distribution de charge ρ(z) qui ne com-
et en admettant que les électrons se situent à proximité porte qu’une charge ponctuelle q située en z0 , on peut
des noyaux, la structure atomique du matériau considéré. écrire :
C’est donc un moyen très puissant d’investigation de la ρ(z) = q δ(z − z0 )
matière.
De façon plus générale, les mathématiciens ne se et introduire ceci sans arrière-pensée dans les intégrales
préoccupent pas toujours du sens physique des variables et transformées de Fourier que l’on choisira afin d’utiliser
utilisées pour s’intéresser à l’objet mathématique « trans- tous les théorèmes habituels.
formée de Fourier » qui peut s’écrire : La distribution de Dirac permet également de vérifier
Z ∞ que l’expression de la transformée de Fourier inverse
ϕ(u) = f (x) eiux dx donnée au début de ce chapitre est correcte : il suffit d’in-
−∞ jecter l’expression :
et la transformée inverse : Z ∞
Z ∞ F (ν) = f (t) e2πiνt dt
1
f (x) = ϕ(u) e−iux du −∞
2π −∞
dans l’équation (4.24) :
4.10.1.2.2 La distribution de Dirac. Intuitive- Z ∞ Z ∞
ment, il s’agit d’une « fonction »40 δ(x) qui vaut zéro par- f (t) =
′
f (t′ ) e2πiνt dt′ e−2πiνt dν
tout sauf en x = 0 où. . . elle est infinie. Soit une fonction −∞ −∞
Z ∞ Z ∞
f (x), alors, la propriété fondamentale de la distribution ′
de Dirac est : = f (t ′
) e2πiν(t −t) dν dt′
−∞ −∞
Z ∞
f (x) δ(x) dx = f (0) après inversion de l’ordre des intégrations. L’intégrale sur
−∞ ν donne δ(t′ − t) et finalement :
ou bien à l’aide d’un changement de variable trivial : Z ∞
Z ∞ f (t) = f (t′ ) δ(t′ − t) dt′
−∞
f (x) δ(x − x0 ) dx = f (x0 )
−∞
ce qui est vrai.
Si l’on applique ceci à la transformée de Fourier, on
obtient : Z ∞ 4.10.1.2.3 Linéarité. La transformée de Fourier est
δ(x) eiux dx = 1 une transformation linéaire : il est facile de se convaincre
−∞
que la transformée de Fourier d’une somme est la somme
la transformée de Fourier d’une Dirac est une constante des transformées de Fourier et que la transformée de Fou-
(un, en l’occurence) : c’est le cas extrême du paquet rier d’une fonction multipliée par une constante est le pro-
d’ondes infiniment court : sa largeur spectrale est infinie, duit de la transformée de Fourier par cette constante,
sa transformée de Fourier non seulement infiniment large Z Z ∞ Z ∞
∞
mais constante.
(f (x) + g(x)) eiux dx = f (x) eiux dx + g(x) eiux dx
Inversement, −∞ −∞ −∞
Z ∞
1 et
C e−iux dx = C δ(x) Z ∞ Z ∞
2π −∞
Cf (x) eiux dx = C f (x) eiux dx
−∞ −∞
la transformée de Fourier d’une constante est la distribu-
tion de Dirac. On peut s’en convaincre en remarquant que, Cela est vrai bien sûr aussi pour les transformées in-
tant que x est non nul, l’intégrale s’effectue sur un nombre verses. Les propriétés suivantes sont tout aussi faciles à
infini de périodes des cosinus et sinus de l’exponentielle démontrer :
complexe, or, bien évidemment : Si. . . alors. . .
Z 2π Z 2π f (x) est réel ϕ(−u) = [ϕ(u)]∗
f (x) est imaginaire pur ϕ(−u) = −[ϕ(u)]∗
sin x dx = cos x dx = 0
0 0 f (x) est paire ϕ(u) est paire
f (x) est impaire ϕ(u) est impaire
et le résultat final est nul. En revanche, quand x = 0, f (x) est réelle et paire ϕ(u) est réelle et paire
l’exponentielle vaut 1 et le résultat est infini. Si donc, la f (x) est réelle et impaire ϕ(u) est imag. et impaire
transformée de Fourier d’une constante donne une Dirac, f (x) est imag. et paire ϕ(u) est imag. et paire
39 En principe. . . toutefois, la grosse difficulté vient de ce qu’on f (x) est imag. et impaire ϕ(u) est réelle et impaire
mesure le module de S(k) seulement et donc on perd la phase de la
fonction complexe.
Par ailleurs, si ϕ(u) est la transformée de Fourier de
40 Ce n’est pas une fonction au sens mathématique, mais une dis- f (x), celle de f (ax) est a1 ϕ( ua ) et celle de f (x − x0 ) s’écrit
tribution. La nuance sera explicitée en mathématiques. ϕ(u) eiux0 .
Physique numérique, Philippe Depondt 81
4.10.1.2.4 Produit de convolution. Imaginons que La transformée de Fourier d’un produit de convolution
l’on fasse une expérience pour mesurer une grandeur y en est le produit des transformées de Fourier.
fonction d’une autre grandeur x, mais l’appareil de me-
sure n’est évidemment pas parfait : si on le règle sur une Le produit des transformées de Fourier est souvent
certaine valeur x = x0 , il « bave » un peu et le résultat beaucoup plus facile à faire que le produit de convolution
obtenu sera une superposition de contributions issues de lui-même, et quand on verra l’efficacité des transformées
points voisins de x0 : de Fourier rapides numériques. . .
Z
ymesure (x0 ) = y(x) a(x0 − x) dx (4.26) 4.10.1.2.5 Quelques transformées de Fourier
« célèbres ». On a déjà vu que la transformée de Fou-
où a(x) est la « fonction d’appareil » dont on peut espérer rier d’une fonction créneau donnait un sinus cardinal et
qu’elle a un maximum relativement marqué en x = 0. . . Le que la distribution de Dirac donnait une constante.
cas arrive, par exemple, si l’on fait une mesure de disper- -La gaussienne. La fonction de Gauss s’écrit :
sion de la lumière à l’aide d’un prisme avec un faisceau de
lumière incident qui ne serait pas parfaitement fin (figure C (x−x0 )2
√ e− 2σ2
4.31). 2π
ν1 où x0 est l’emplacement du sommet et σ sa variance.
ν2 0.4
0.35
0.3
0.25
A 0.2
0.15
0.1
0.05
Fig. 4.31 – Au point A, on reçoit une superposition de
0
lumière de deux fréquences différentes ν1 et ν2 parce que −2 −1 0 1 2 3 4
le faisceau incident n’est pas parfaitement fin. En fait, on
reçoit aussi toutes les fréquences intermédiaires ce qui fait Fig. 4.32 – Gaussienne pour C = 1, x0 = 1 et σ = 0.5.
que le résultat est la superposition de toutes ces contribu-
tions comme dans l’équation (4.26). C’est une courbe (figure 4.32) qui ressemble beaucoup à
la lorentzienne si ce n’est que les « pieds » en sont moins
L’équation (4.26) est un produit de convolution de la large à cause de l’exponentielle qui décroı̂t plus vite que
fonction y par la fonction a. C’est un objet que l’on re- la fraction rationnelle. Si l’on en calcule la transformée de
trouve fréquemment, dans les problèmes de fonction d’ap- Fourier dans le cas le plus simple (x0 = 0, σ = 1), l’on
pareil comme on l’a vu, mais aussi par exemple lorsqu’un obtient :
système répond avec retard à une sollicitation et que son Z ∞ Z ∞
état est le produit de convolution de la sollicitation aux 1 x2 1 x2
ϕ(u) = √ e− 2 eiux dx = √ e− 2 cos ux dx
instants précédents par une « fonction mémoire ». −∞ 2π π −∞
Le produit de convolution d’une fonction f par une fonc-
parce que le sinus de la partie imaginaire de l’exponen-
tion g se note par un astérisque :
Z ∞ tielle est impair et donc l’intégrale correspondante nulle.
f ∗g = ′ ′
f (x ) g(x − x ) dx′ En supposant que tous les théorèmes de convergence sou-
−∞ haitables s’appliquent ici, une dérivation par rapport à u
et c’est une fonction de x. Par un changement de variable, sous le 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 ∞
[f ∗ g](x′ ) eiux dx′ = f (x)g(x′ − x) eiux dxdx′ 1 x2 x2
−∞ −∞ −∞ ϕ′ (u) = √ e− 2 sin ux −u e− 2 cos ux dx
Z ∞Z ∞ 2π −∞ −∞
= f (x)g(X) eiu(X+x) dxdX
−∞ −∞ soit :
Z ∞ Z ∞
ϕ′ (u) = −uϕ(u)
= f (x) eiux dx g(X) eiuX dX
−∞ −∞ une équation différentielle qui donne :
soit le produit des transformées de Fourier. C’est un
u2
théorème important : ϕ(u) = K e− 2
82 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
et, donc, la transformée de Fourier de p(t) s’écrit facile- Si l’on s’intéresse maintenant à une hélice superso-
ment42 : nique45 pour laquelle L = 0, 2m et ℓ = 1mm, on obtient
Z ∞ ∆ν ∼ 35 000Hz et ν0 ∼ 850Hz.
(t−t )2 (t−t )2
p̃(ω) = p0 e − 2δt1
−e − 2δt2 iωt
e dt Les choses deviennent alors qualitativement assez
−∞ différentes : l’enveloppe du spectre s’étend largement au-
r r delà de la limite perceptible, mais la fréquence fonda-
π ω2 2δt2 π ω2 2δt2 mentale (850Hz) est parfaitement audible puisqu’elle est
= p0 eiωt1 e− 4 − eiωt2 e− 4
2δt 2 2δt 2 proche du La situé une octave au-dessus du diapason
r (880Hz). Ainsi, on percevra un son dont la fréquence est
π iωt1 − ω2 δt2 relativement bien définie et toutes ses harmoniques. On
= p0 e e 2 1 − e−iω∆t
δt 2 peut évidemment ajouter à cela le fait qu’une hélice tourne
et donc ce signal est répété à chaque passage d’une pale
La densité spectrale correspondante s’écrit : et le son sera donc perçu comme continu (la fréquence de
π 2 2 passage des pales est de l’ordre de 100Hz).
I(ω) = p̃(ω)p̃∗ (ω) = p20 2 e−ω δt (1 − cos ω∆t) (4.29) Ce modèle est bien sûr simpliste et les valeurs
δt
numériques sont à prendre comme des ordres grandeur,
tout au plus, mais il montre assez bien la puissance d’une
2
analyse en transformée de Fourier d’un phénomène somme
ν 0 toute assez compliqué.
1.5
enveloppe gaussienne
4.10.1.4 Un deuxième exemple : résolution de
l’équation de Poisson.
1 ∆ν
Il peut arriver que l’on ait intérêt à résoudre un
problème en passant par les transformées de Fourier plutôt
0.5
que directement.
Ainsi, l’équation de Poisson de l’électrostatique s’écrit :
0
0 5 10 15 20 25 ∂2V ∂2V ∂2V ρ(x, y, z)
freq ∇2 V = + + =−
∂x2 ∂y 2 ∂z 2 ε0
Fig. 4.34 – Densité spectrale du double bang, eq.(4.29). En où ρ est une distribution de charges et V (x, y, z) le poten-
noir, l’enveloppe gaussienne, en bleu la courbe complète. tiel électrostatique associé. En général, on est confronté
Les unités sont arbitraires. au problème qui consiste à calculer V connaissant ρ. On
peut utiliser des méthodes similaires à celle décrite au pa-
La figure 4.34 montre l’allure de cette courbe. L’enve- ragraphe 4.5.1, mais celles-ci ont souvent l’inconvénient
1
loppe gaussienne a une largeur en fréquence ∆ω = √ , d’être assez consommatrices de ressources de calcul, au-
2δt delà parfois de celles dont on dispose. On peut également
1
soit en fréquence ∆ν = √ . La pulsation ω0 qui tenter l’intégration directe :
2π 2δt
correspond au premier maximum de la partie périodique 1
π V (x, y, z) = ×
(cos ω∆t = −1 ⇒ ω∆t = π) est donnée par ω0 = ou 4πε0
∆t Z ∞Z ∞Z ∞
1 ρ(x′ , y ′ , z ′ )
la fréquence correspondante ν0 = . p dx′ dy ′ dz ′
2∆t ′ )2 + (y − y ′ )2 + (z − z ′ )2
Que signifient ces résultats ? Admettons qu’il s’agisse −∞ −∞ −∞ (x − x
d’un avion assez gros (Concorde peut-être) avec L = 100m Si, toutefois, on discrétise l’espace par n points dans
et ℓ = 0, 1m qui se déplace à peu près à la vitesse du son, chaque direction, V (x, y, z) sera représenté par n3 valeurs
soit v = 300m/s (ce sont des ordres de grandeurs, sans qu’il faudra calculer en sommant sur n3 valeurs de ρ, soit
plus). Cela donne ∆t = 0, 3s, ν0 ∼ 1, 7Hz et ∆ν ∼ 380Hz. n6 termes. . . le processus risque de se révéler laborieux si
La gamme de fréquences auxquelles l’oreille humaine43 est n est grand !
sensible s’étend de 20Hz à 20 000Hz, le La du diapason se Une autre façon de procédre consiste à utiliser une triple
situant à 440Hz. transformée de Fourier, ainsi, V (x, y, z) est la transformée
L’intervalle de temps ∆t est assez long pour que les de Fourier inverse de Ṽ (kx , ky , kz ) :
deux chocs soient perçus séparément. La largeur totale du
1
spectre présentant une intensité audible s’étend en gros V (x, y, z) = ×
(2π) 3
jusque vers 500Hz et l’écart entre les harmoniques est
très faible (1,7Hz) : on percevra donc deux détonations Z ∞ Z ∞ Z ∞
séparées assez graves dont le spectre est essentiellement un Ṽ (kx , ky , kz ) e−i(kx x+ky y+kz z) dkx dky dkz
44 −∞ −∞ −∞
continuum qui va du seuil inférieur de 20Hz à quelques
45 pendant la deuxième guerre mondiale, alors que les moteurs à
centaines de Hertz.
réaction offraient des performances très médiocres au prix d’une
42 C’est le gros avantage des gaussiennes ! consommation de carburant gargantuesque et d’une fiabilité catas-
43 jeune et en bonne santé. . . trophique, l’option de fabriquer des hélices supersoniques pour ga-
44 les fréquences plus basses que 20Hz sont également perçues par gner en vitesse ne paraissait pas absurde. Les ingénieurs s’aperçurent
le corps humain, mais par l’intermédiaire de la cage thoracique et toutefois assez rapidement qu’ils avaient fabriqué là un dispositif très
non les oreilles. efficace pour, disaient-ils, « transformer de l’énergie en bruit » !
84 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
avec :
avec évidemment des expressions similaires pour y et z. xℓ = xmin + ℓ δx
On définit ρ̃ de la même façon :
et
xmax − xmin
ρ(x, y, z) = δx =
n
ZZZ ainsi, x0 = xmin et xn−1 = xmax − δx , on est dans la
1 même situation que celle de l’intégration par la méthode
ρ̃(kx , ky , kz ) e−i(kx x+ky y+kz z) dkx dky dkz
(2π)3 des rectangles.
On remplace donc l’intégrale de −∞ à ∞ par une série
En appliquant l’équation de Poisson, on obtient alors :
discrète sur un échantillonnage de points pris sur un in-
ZZZ tervalle borné.
Ṽ (kx , ky , kz ) k 2 e−i(kx x+ky y+kz z) dkx dky dkz = En fait pour des raisons de généralité des programmes,
on se borne à calculer la série :
ZZZ n−1
1 X
ρ̃(kx , ky , kz ) e−i(kx x+ky y+kz z) dkx dky dkz Fk = fℓ e
2πikℓ
n (4.30)
ε0
ℓ=0
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 )
Ṽ (kx , ky , kz ) = L’expression (4.30) est celle de la transformée de Fou-
ε0 k 2 rier 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,
pourtant extrêmement courants et indéniablement très
donne en transformée de Fourier :
utiles.
Ẽx (kx , ky , kz ) = ikx Ṽ (kx , ky , kz )
4.10.2.1.1 Périodicité. La première remarque que
Ẽy (kx , ky , kz ) = iky Ṽ (kx , ky , kz ) 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.
1
On risque bien sûr de rencontrer quelques difficultés
0.9
quand k = 0, mais il suffit de noter que :
0.8
ZZZ
0.7
Ṽ (k = 0) = V (x, y, z) dx dy dz
0.6
0.5
pour voir que le choix de la valeur de Ṽ (k = 0) n’est qu’un 0.4
choix de la constante arbitraire du potentiel : Ṽ (k = 0) = 0.3
0 peut être une bonne option.
0.2
La méthode peut paraı̂tre assez lourde, mais en fait, la
grande rapidité des transformées de Fourier numériques 0.1
permet de résoudre ainsi bien des problèmes qui n’au- 0
0 1 2 3 4 5 6 7 8 9
raient pas de solution sinon. Il faut cependant maintenant
se préoccuper de ce que font réellement les transformées Fig. 4.35 – Une gaussienne « périodique » et mal coupée !
de Fourier numériques proposées dans les bibliothèques de
calcul car il s’agit bien sûr d’approximations et cela peut En principe, ce n’est pas bien grave parce qu’on peut
avoir des conséquences, parfois imprévues. choisir une très grande période, « infinie » en pratique par
Physique numérique, Philippe Depondt 85
rapport aux dimensions ce que l’on veut étudier : c’est Ainsi, la longueur de l’intervalle dans l’espace de la
d’ailleurs généralement ce que l’on fait. Toutefois, il y a transformée de Fourier est l’inverse du pas dans l’espace
parfois des choix maladroits : par exemple, si l’on veut cal- direct.
culer la transformée de Fourier d’une gaussienne centrée Ces deux théorèmes qui ont l’air, il est vrai, tri-
en zéro, on sait que la partie imaginaire doit être nulle viaux, sont très importants car c’est ainsi que l’on choi-
puisque la gaussienne est paire ; or, si par malheur, on a sit l’intervalle d’intégration en fonction, par exemple, de
choisit pour faire le calcul, l’intervalle [0, X], X > 0 et la résolution fréquentielle voulue ou de l’intervalle de
grand par rapport à la variance, on est en train de cou- fréquences désiré. Ainsi, si l’on s’intéresse à un système
per en deux la gaussienne à son maximum en x = 0 et à d’oscillateurs pour lesquels les phénomènes intéressants se
l’autre extrémité de l’intervalle, la valeur de la gaussienne
produisent aux environs de 10Hz, on peut vouloir un in-
sera presque nulle (figure 4.35). Mais, en x = X, subite- tervalle de fréquences qui va de 0 à 20Hz : cela signifie que
ment à cause de la périodicité, la fonction retrouvera une le pas de temps doit être obligatoirement de l’ordre de
valeur non négligeable : une variation rapide qui donnera 1/20=0,05s (ici, l’on raisonne en temps-fréquence, donc
des contributions de haute fréquence. De plus, notre fonc- le facteur 2π disparaı̂t). De plus, si l’on veut pouvoir
tion n’est plus paire : la partie imaginaire n’a plus de raison
distinguer des phénomènes dont les fréquences diffèrent
d’être nulle ! Un intervalle [−X, X] serait plus judicieux. . .
de 0,1Hz, cela entraı̂ne que la longueur de l’intervalle de
temps est au minimum de 1/0,1=10s. Donc, n, le nombre
On peut certes tenter d’être habile, mais alors, il faut être
sûr de soi : on peut garder l’intervalle [0, X] (et donc di- de pas est égal, au minimum à 10s/0,05s = 200. Quitte à
viser par deux le nombre de points nécessaires), et forcer se répéter, ces relations très simples entre pas de temps
la partie imaginaire à zéro. On perdra alors toutefois une et fréquence sont fondamentales dès que l’on faire un
possibilité de détecter des erreurs ! usage pratique de cet outil, en particulier, quand (comme
expérimentateur, par exemple) on a affaire au monde réel
4.10.2.1.2 Pas de calcul. La discrétisation de qui a pour défaut principal que l’on ne peut pas considérer
l’équation (4.30) a aussi des conséquences. Pour faire la toutes les constantes comme valant 1 (m = e = c = h̄ =
correspondance entre l’intégrale et la somme discrète, on kB = 1) !
doit faire l’égalité :
4.10.2.1.3 Une « fausse » symétrie. Calculons le
2πikℓ
eiuk xℓ = e n terme Fn−k de la DFT, c’est-à-dire le symétrique de Fk
par rapport au milieu de l’intervalle :
sachant que :
n−1
X n−1
X
xℓ = xmin + ℓ δx 2πiℓ(n−k) 2πiℓk
Fn−k = fℓ e n = fℓ e2πiℓ e− n
et en posant : ℓ=0 ℓ=0
uk = umin + k δu
or e2πiℓ = 1, et donc :
soit :
n−1
X
2πikℓ 2πiℓk
ei(umin +k δu )(xmin +ℓδx ) = e n Fn−k = fℓ e− n = F−k
2πikℓ
ei(umin xmin +umin ℓδx +xmin k δu ) eikℓδx δu = e n ℓ=0
1
on a déjà utilisé une FFT de bibliothèque et que l’on a
déjà déchiffré la documentation correspondante, et donc 0.9
connaissant sa position et sa vitesse à un instant donné, de rayon a2 vaut π4 , on peut lancer des flèches, cailloux ou
on peut prédire sa trajectoire dans le futur. tout autre projectile et compter le nombre de fois où le
Une chaı̂ne de Markov est une séquence d’événements projectile tombe dans le cercle et le diviser par le nombre
soumis au hasard comme ci-dessus, mais sans mémoire : le total de tirs. Cela donne des estimations successives de
π
dé ne se rappelle pas le nombre sorti lors du jet précédent, 4 (figure 4.37). Evidemment, plus les tirs sont nombreux,
ce n’est pas parce que j’ai obtenu un six au coup précédent meilleure est l’estimation.
que je peux dire quoi que ce soit sur le résultat du coup sui- Même si l’on peut imaginer d’autres méthodes plus
vant (si le dé se rappelait le six et interdisait par exemple économiques pour déterminer π, ces remarques montrent
d’obtenir deux fois de suite le même résultat, le processus que l’on peut tenter de résoudre des problèmes qui ne
serait stochastique mais non-Markovien). comportent a priori aucun caractère aléatoire à l’aide
En physique, il y a bien sûr des processus imprévisibles de méthodes probabilistes. On notera que pour que les
(les trajectoires individuelles de chaque atome d’un gaz en théorèmes probabilistes, comme la limite centrale, puissent
thermodynamique statistique, par exemple) mais on peut s’appliquer, il faut un grand nombre de tirages au sort,
aussi avoir intérêt à utiliser des méthodes de tirage au sort comme dans la figure 4.37, et que donc la capacité des or-
pour calculer des grandeurs qui n’ont rien d’aléatoire. dinateurs à répéter de nombreuses fois la même opération
sans se lasser n’est pas à négliger.
4.11.2 Les vicissitudes de π.
Le chapitre « Nombres aléatoires » des Numerical Re- 4.11.3 La production de nombres
cipes (ref. [3]) commence par la remarque (p. 266) : « aléatoires ».
« Il peut paraı̂tre pervers d’utiliser un ordinateur, la
plus précise et la plus déterministe de toutes les ma- Mais comment une machine déterministe comme un or-
chines conçues par l’esprit humain pour produire des dinateur peut-elle produire des nombres aléatoires ?
nombres “aléatoires”. » En effet, mais nous nous gar- En fait, un ordinateur est incapable de produire des
derons d’affirmer que la perversité n’a jamais fait re- nombres aléatoires et donc il n’en produit pas. . .
culer un mathématicien appliqué. . . Toujours est-il que Un ordinateur produit des séquences de nombres arbi-
bien avant l’invention des ordinateurs, au XVIIIe siècle, traires dont on espère qu’ils sont non-corrélés au problème
Georges Louis Leclerc comte de Buffon, un individu par que l’on souhaite résoudre. C’est que l’on appelle sou-
ailleurs honorablement connu, calcula que, si on lance au vent des « nombres pseudo-aléatoires ». Pour illustrer
hasard une aiguille de longueur ℓ sur un réseau de droites ceci, imaginons qu’un touriste un peu obsessionnel décide
parallèles distantes d’une distance a, la probabilité que de visiter les musées parisiens par ordre alphabétique :
l’aiguille rencontre une droite s’écrit : c’est un ordre parfaitement déterminé, et si l’on recom-
mence un peu plus tard, en appliquant la même règle,
2ℓ l’ordre sera strictement le même48 . Cependant, si l’on
p=
aπ s’intéresse aux thématiques de ces musées, on tombera sur
une méthode probabiliste de détermination expérimentale une séquence du type : Musée de l’Arc de Triomphe, Musée
du nombre π. En effet, plusieurs tentatives de ce genre des Armées, Musées des Arts Africains et Océaniens, etc. :
eurent lieu au XIXe siècle malgré le caractère quelque une séquence complètement arbitraire et qui peut être
peu fastidieux de l’opération consistant à lancer un grand considérée pratiquement comme. . . aléatoire car les arts
nombre de fois une aiguille et à compter le nombre de fois africains et océaniens n’ont pas grand-chose à voir avec
qu’elle recontre une droite47 . les armées49. Bien sûr, l’ordre alphabétique introduit des
corrélations parasites : tous les Musées des Arts xxx se
4
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
ordinateurs.
3.6
Comment cela fonctionne-t-il ? Un générateur de
3.4 nombres pseudo-aléatoires produit une séquence de
nombres entiers I1 , I2 , I3 ,. . ., compris entre 0 et m − 1 par
3.2 la réccurence :
3
Ij+1 = aIj + b, modulo m
2.8
où m est un nombre entier « grand » et a et b des entiers
2.6
1 10 100 1000 10000 100000 positifs appelés « multiplicateur » et « incrément ».
1e+06
A priori, cette séquence se répète puisqu’il n’y a que m
Fig. 4.37 – Calcul du nombre π par tirage au sort. En abs- valeurs possibles pour les Ij , ainsi, si l’on a plus que m
cisse le nombre de tirages en échelle logarithmique. En or- tirages, on doit retomber sur les mêmes nombres : c’est
donnée, les estimations de π correspondantes. Le résultat un système périodique. On note qu’il faut initialiser la
obtenu pour un million de tirages est 3,1428721 séquence avec une « graine » I0 50 . Finalement, si l’on fait
48 À condition, évidemment, que la liste des musées n’ait pas
Plus simplement encore, on peut remarquer que comme
le rapport des surfaces d’un carré de coté a et d’un cercle changé entre-temps.
49 Sauf, bien sûr, si l’on se rappelle qu’il s’agit de l’ancien Musée
47 Ainsi, l’expérience faite en 1901 par Lazzerini, en jetant une des Colonies, héritage des conquêtes militaires du XIXe siècle.
aiguille 3407 fois, donna : π = 3,1415929 (au lieu de 3,14159265). 50 seed en anglais.
88 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
I
le rapport mj on obtiendra une séquence de nombres réels i est un entier permet de le faire : il suffit d’une instruction
dans l’intervalle [0, 1[. call srand(i) avant le premier appel à rand(). Quelle
On a clairement intérêt à choisir m aussi grand que pos- valeur donner à i ? Soit l’on veut en garder la maı̂trise,
sible, soit, compte tenu de la représentation des nombres alors, il faut prévoir de lire au clavier la valeur de i, soit,
entiers sur quatre octets : m = 231 − 1 = 2 147 483 647. on peut choisir la fonction time qui donne l’heure sous
Le choix de a et b (par exemple a = 75 = 16 807 et forme d’un nombre entier : call srand(time()) don-
b = 0) fait l’objet de débats infinis et dépend parfois de nera. . . n’importe quoi, ce qui est ce qu’on voulait !
la machine utilisée. Dans la grande majorité des cas, on a
intérêt à se servir du générateur fourni avec l’ordinateur
que l’on utilise plutôt que de tenter d’écrire quelque chose ?
soi-même : il se trouve que le langage fortran fourni une
fonction intrinsèque rand()51 qui en général donne satis-
faction. Si la variable x est déclarée en real, l’instruction x
= rand() donnera un nombre pseudo-aléatoire. Si l’on fait
plusieurs tirages, on obtiendra une séquence de nombres
compris entre 0 et 1 avec une distribution uniforme (figure
4.38). Il existe aussi le sous-programme random number :
call random number(x) remplira le tableau x de nombres
pseudo-aléatoires. 60
seed=1
seed=2
50 seed=3
1
0.9 40
0.8 30
0.7 20
0.6 10
0.5 0
0.4 −10
0.3 −20
0.2 −30
0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000
0.1
0 Fig. 4.39 – Marche au hasard ou drunkard’s walk (marche
0 10 20 30 40 50 60 70 80 90 100
1.03 de l’ivrogne) avec trois graines différentes.
0.45
des nombres qui ont une probabilité p0 (x)dx d’apparaı̂tre Generated distribution
Normal distribution
0.4
entre x et x + dx qui s’écrit :
0.35
dx si 0 ≤ x < 1
p0 (x)dx = 0.3
0 sinon
0.25
p(x)
ce qui respecte la condition de normalisation : 0.2
Z ∞
0.15
p0 (x) dx = 1
−∞ 0.1
Mais si l’on veut autre chose qu’une telle distribution uni- 0.05
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 Fig. 4.41 – Un domaine d’intégration un peu compliqué. . .
v = sqrt(-2.*log(rand()))
phi = tpi*rand() Imaginons, par exemple, que l’on veuille calculer la fi-
x1 = v*cos(phi) ; x2 = v*sin(phi) gure d’interférences donnée par deux fentes d’Young, mais
end la source lumineuse, au lieu d’être ponctuelle, est un fila-
C’est, certes, de l’ordre de la recette de cuisine et c’est ment d’ampoule électrique épais, torsadé et courbé (figure
bien pour cela qu’il existe des ouvrages spécialisés et des 4.41), ou, pire, une galaxie vue à travers un télescope :
bibliothèques de programmes tous faits ! comme la source est incohérente, il faut donc intégrer les
90 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
-0.0885 -0.088
-0.08875
-0.0882
-0.089
-0.08925 -0.0884
-0.0895 -0.0886
-0.08975
-0.0888
-0.09
-0.09025 -0.089
-0.0905
-0.0892
-0.09075
-0.091 -0.0894
-0.09125 -0.0896
-0.0915
-0.0898
-0.09175
-0.092 -0.09
100000 1e+06 1e+07 1e+08 1e+07 2e+07 4e+07 8e+07
n_t n
Fig. 4.44 – Valeurs obtenues pour ID avec le domaine Fig. 4.45 – Valeurs obtenues pour ID avec le domaine
(4.31) en fonction du nombre de tirages (l’axe des x a une (4.31) en fonction du nombre de tirages (l’axe des x a une
échelle logarithmique). échelle logarithmique) comme dans la figure 4.44, mais
cette fois-ci par une marche au hasard dans le domaine
d’intégration D.
4.11.5.3 Marche au hasard dans D
4.11.5.4 Échantillonnage par l’importance (im-
portance sampling )
Dans le calcul précédent, on a tiré au sort des nombres
dans un domaine plus grand que le domaine d’intégration Pourrait-on, pour ainsi dire, « guider » le hasard ? Il
D et on a simplement éliminé tous les tirages qui tom- faudrait pouvoir « dire » au hasard quand ça vaut le coup
baient en-dehors de D. On est en droit de se dire que c’est de faire le calcul, car calculer l’intégrale d’une fonction en
inefficace et qu’il vaudrait mieux tenter de ne tirer des sommant au hasard partout, y compris là où elle est nulle
nombres que dans le bon domaine : c’est en toute rigueur ou presque n’a pas grand intérêt. Autrement dit, il serait
impossible, mais, si, partant d’un point choisi dans D (par peut-être habile d’utiliser des tirages au sort, non pas avec
exemple (0.5, −0.5) dans la figure 4.43), au lieu de tirer des distributions uniformes comme jusqu’à présent, mais
d’autres nombres de façon indépendante, on se borne à se avec des distributions qui favorisent les endroits où la fonc-
déplacer au hasard dans le domaine, soit tirer au sort, non tion a des contributions non négligeables. Formellement,
pas un point, mais un petit déplacement (dx, dy), quitte cela donne, avec l’exemple du calcul « naı̈f » ci-dessus (§
à rejetter les déplacements qui font sortir du domaine, on 4.11.5.2) :
devrait passer l’essentiel du temps (ou plutôt des tirages
au sort) dans le bon domaine. Z Z
sin(xy)
ID = sin(xy) dx dy = p(x, y) dx dy
Ainsi, on peut commencer par fixer un point de départ D D p(x, y)
dans D :
x0 = 0.5 ; y0 = -0.5 dans l’exemple ci-dessus, puis où p(x, y) est une densité de probabilité choisie de façon
calculer des déplacements −δx < dx < δx et −δy < dy < à avoir des valeurs plus importantes là où la fonction a
δy : elle-même des valeurs plus importantes.On sommera alors
sin(xy)
dx = 2*delta_x*(rand()-0.5) les valeurs prises par , où maintenant x et y sont
dy = 2*delta_y*(rand()-0.5) p(x, y)
et ajouter cela aux anciennes valeurs de x et y. Si le nou- choisis avec la densité de probabilité p(x, y). On pourrait
veau point obtenu est dans D le déplacement est conservé, évidemment choisir comme distribution la fonction elle-
sinon, il est rejetté (c’est-à-dire que l’on revient à la po- même, toutefois produire des nombres aléatoires avec une
sition précédente). Dans tous les cas (voir une discussion distribution de probabilité sin(xy) comme ici n’est peut-
détaillée de ce point dans la réf. [21]), on ajoute la valeur être pas si facile que cela. Une approximation de la fonc-
de la fonction à la somme que l’on aura déjà initiée. tion peut suffire : ici, il suffit de poser,
-0.0855
-0.086
4.11.6.1 Faire de la thermodynamique statistique
-0.0865
avec un ordinateur.
-0.087
Soit donc un système dans l’ensemble canonique (c’est-
-0.0875
-0.088
à-dire en interaction avec un thermostat à température
-0.0885
T ) et une grandeur A dont on veut calculer la valeur
-0.089
moyenne :
-0.0895 Z E(q1 ,q2 ,...,qn )
−
-0.09 A(q1 , q2 , . . . , qn ) e kB T
dq1 dq2 . . . dqn
-0.0905
hAi = Z E(q1 ,q2 ,...,qn )
-0.091 −
e kB T
dq1 dq2 . . . dqn
-0.0915
-0.092
100000 1e+06 1e+07
(4.32)
n Les q1 . . . qn sont les variables microscopiques du système
(typiquement les positions, vitesses, etc., de tous les
Fig. 4.46 – Valeurs obtenues pour ID avec le domaine atomes ; n est, on l’aura compris, très grand et les
(4.31) en fonction du nombre de tirages (l’axe des x a une intégrales très multidimensionnelles) ; E(q1 , q2 , . . . , qn ) est
échelle logarithmique) par une méthode d’échantillonnage l’énergie du système dans l’état microscopique défini par
par l’importance. L’échelle de l’axe des y est la même que les valeurs de ces variables, A(q1 , q2 , . . . , qn ) la valeur de
pour la figure 4.44. la grandeur A dans les mêmes conditions. La probabilité
d’atteindre un état d’énergie E est proportionnelle à l’ex-
très comparables, voire meilleurs que ceux de la figure 4.44, ponentielle (dans une statistique de Maxwell-Boltzmann)
on a fait dix fois moins de tirages au sort (107 au lieu de et le dénominateur de l’expression est la fonction de par-
108 ) : on a gagné un ordre de grandeur en temps de calcul ! tition qui sert ici à la normalisation.
Ça méritait un petit effort. . . Il est bien sûr hors de question de calculer directement
l’expression (4.32), mais nous avons vu qu’il existe des
4.11.6 Simulation de Monte-Carlo- chemins de traverse plus ou moins tortueux pour ce genre
Metropolis. de situations.
54 la somme discrète ci-dessus, peut être remplacée par une
À quoi tous les calculs d’intégrale plus ou moins com- intégrale multiple sur toutes les variables microscopiques du système,
pliqués ci-dessus peuvent-ils bien servir à part meubler la si celles-ci varient continûment.
conversation d’un vieil enseignant ? 55 voir à ce sujet le cours de thermodynamique statistique.
Physique numérique, Philippe Depondt 93
V
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 0
l’état 1 :
−0.5
π1→2 = p1 p1→2
−1
De même, en sens inverse : 1 1.2 1.4 1.6 1.8 2
r
π2→1 = p2 p2→1
Fig. 4.47 – Le potentiel de Lennard-Jones, pour ε = 1
Le principe dit « de la balance détaillée » stipule que et σ = 1. Le potentiel est fortement répulsif pour r < σ
ce qui correspond à la répulsion dite de « cœur dur »,
π1→2 = π2→1 ⇒ p1 p1→2 = p2 p2→1 attractif dans le cas contraire.
Cela signifie que si, par exemple, l’état 1 est très probable Appliquons la méthode ci-dessus : à partir d’une confi-
et l’état 2 très improbable, le système étant déjà dans l’état guration initiale qui est, soit choisie, soit prise au hasard,
2 aura une forte probabilité d’aller dans l’état 1, alors que on tire au sort un déplacement atomique, et l’on calcule
s’il est dans l’état 1, il aura une faible probabilité d’aller la variation d’énergie correspondante ∆V . Si ∆V < 0,
dans l’état 2. En revanche, si l’on regarde le système « de p1→2 = 1, on garde la nouvelle configuration et l’on reo-
loin », d’un point de vue macroscopique, on ne sait pas commence. Si, en revanche ∆V > 0,
dans quel état microscopique il est, et les probabilités de p1→2 = e
− k∆VT
B
transition dans un sens ou dans l’autre sont égales.
On arrive ainsi à la relation suivante : il faut donc garder cette nouvelle configuration avec cette
p2 probabiité.
p1→2 = p2→1 On compare alors un nombre s, tiré au sort dans l’in-
p1
tervalle [0, 1], avec cette probabilité de transition (figure
soit 4.48). La probabilité que p1→2 > s est justement. . . p1→2 !
(E2 −E1 )
−
p1→2 = e kB T
p2→1
s
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
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 0 1
(E2 −E1 )
− p = exp(dE/kT)
contraire, E2 > E1 , alors, p2→1 = 1 et p1→2 = e kB T
.
Ainsi si l’on choisit :
dE
(E2 −E1 ) Fig. 4.48 – On calcule p = e− kT et on compare avec un
−
p1→2 = min(1, e ) kB T
nombre s tiré au sort dans l’intervalle [0, 1]. Plus p est
grand, plus on a de chances que s < p : donc p est la
la marche au hasard ainsi produite obéira à la statistique probabilité de garder la nouvelle configuration.
de Maxwell-Boltzmann, ce que l’on voulait ».
En effet, nous sommes maintenant en train de faire une Donc, si p1→2 > s, on conserve la nouvelle configuration,
marche au hasard dans le domaine d’intégration avec une sinon on la rejette. Puis on recommence. . . À chaque pas,
probabilité qui est justement celle que l’on attend, on fait on calcule la grandeur dont on veut la valeur moyenne et
donc pour ainsi dire « spontanément » un échantillonnage l’on fait cette moyenne.
selon l’importance. Une écriture possible de cet algorithme serait
94 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
−0.4
i = n*rand() + 1 ! tirage au sort d’un atome 5x5
10x10
! i est dans l’intervalle [1,n], or 0 <= rand() < 1 −0.6 20x20
30x30
! −0.8 40x40
50x50
! conserver l’ancienne configuration au cas ou il 70x70
−1
! faudrait rejeter la nouvelle
x_old = x(i) ; e_old = e −1.2
Energie
! −1.4
! deplacer l’atome i
x(i) = x(i) + dx*(rand()-0.5) −1.6
! −1.8
! calcul de la nouvelle energie
−2
e = energie(x,n)
de = e - e_old −2.2
0 1 2 3 4 5
! T
1.1
if ( de > 0 ) then ! si l’energie a augmente 5x5
1 10x10
! plus exp(-de/kt) est grand, plus la condition 20x20
30x30
! ci-dessous est difficile a remplir 0.9
40x40
50x50
if ( rand() > exp(-de/kt) ) then 0.8 70x70
! rejet de la nouvelle configuration 0.7
Aimantation
x(i) = x_old ; e = e_old 0.6
endif ! sinon on garde 0.5
endif
0.4
0.3
C’est un algorithme très simple que l’on peut optimiser de
0.2
multiples façons, en particulier de calculer directement la
0.1
variation d’énergie (la variation ne dépend que de l’atome
0
déplacé et de ceux avec lesquels il est en interaction, alors 0 1 2 3 4 5
que l’énergie concerne tous les atomes) peut représenter T
120
100
80
60
40 A
20
−20
−10 −5 0 5 10
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
Fig. 4.53 – Le problème du voyageur de commerce, traité
0.4 0.4
0.3 0.3
par recuit simulé comme dans la figure 4.52, mais dans
0.2 0.2 un cas -des villes réparties sur un cercle- où la meilleure
0.1 0.1 solution est facile à deviner : ici la méthode par recherche
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 au hasard aboutit à un résultat assez peu convaincant, le
1 1
0.9
T=0.25
0.9
T=0.125 voyageur serait amené à faire plusieurs tours sur le cercle,
0.8 0.8
avec des retours en arrière, alors qu’un seul tour suffirait ;
0.7 0.7 la méthode n’est pas universelle. . .
0.6 0.6
0.5 0.5
0 0
ser la commande Unix sort sur un fichier, c’est efficace
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
T=0.0625
1
T=0.03125
mais pas toujours très souple d’emploi. Sinon, en général,
0.9 0.9 un algorithme du type Quicksort devrait donner satisfac-
0.8 0.8
tion : on partitionne en un endroit donné le tableau que
0.7 0.7
0.6 0.6
l’on veut trier et l’on en permute les éléments de telle
0.5 0.5
façon que tous les éléments précédents la partition soient
0.4 0.4 inférieurs à la valeur de l’élément frontière, et tous les
0.3 0.3 suivants supérieurs. On trie alors chaque sous-tableau en
0.2 0.2
refaisant une autre partition dans chacun d’eux, etc. : c’est
0.1 0.1
une logique qui ressemble un peu à celle des FFT et elle
0 0
1
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
1
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
en partage l’efficacité. Voir à ce sujet Numerical Recipes
T=0.015625 T=0.0078125
0.9 0.9 ref. [3] dans la bibliographie.
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 : Physique Fondamentale & 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’hydrodyna- vϕ (i δx ) = vi
mique 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 so- ∂E(x, t) Ei+1,j − Ei,j
lide 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-à- ce sont deux approximations possibles, équivalentes mais
dire d’équations différentielles de plusieurs variables qui qui n’ont pas exactement la même valeur. . . en fait, il fau-
contiennent des dérivées partielles comme : drait 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 rai- et en remplaçant les dérivées premières par les expressions
sons diverses, on ne sait pas les résoudre. Cependant, il (5.5) et (5.6), on obtient aisément l’approximation :
existe deux classes principales de méthodes pour s’y atta-
quer : les méthodes de différences finies et les méthodes ∂ 2 E(x, t) Ei+1,j + Ei−1,j − 2Ei,j
≃
d’éléments finis. L’on mentionnera également les méthodes ∂x2 δx2
dites spectrales.
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
vi δ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 propagation
onde électromagnétique dans un milieux unidimensionnel à travers une lame transparente d’un paquet d’ondes gaus-
(eq. (5.1) ) : il faut d’abord discrétiser le temps et l’espace, sien avec les réflexions sur les dioptres. On y voit bien sûr
le ralentissement du paquet dans le diélectrique (la pente
x = i δx t = j δt est plus forte, autrement dit, il faut plus de temps pour
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
Fig. 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
T = Ti Q = −Q̇i δx
2 méthodes sophistiquées pour résoudre le système linéaire !
. ..
.. .
5.2.2.3 Contourner le schéma implicite
Tn 2
−Q̇n δx
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 porelle du système au lieu de tenter de calculer d’emblée
exemple : une situation d’équilibre où tous les points dépendent les
uns des autres. Avec une équation d’évolution, on part
T0 = Ta et Tn+1 = Tb
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φ
∂t
seule contrainte étant alors Q̇(x).
c’est-à-dire que la variation temporelle locale de
On fait appel alors à un sous-programme de bi-
température (multipliée par la capacité calorifique C d’une
bliothèque, ou bien pris dans un manuel de « recettes
cellule) est la production locale de chaleur diminuée de la
numériques », capable de résoudre le système (5.9). Si n
est grand, le système est parfois lourd à résoudre, cepen- chaleur qui s’écoule hors de la cellule. En combinant cela
avec la loi de Fourier (5.2), on obtient :
dant, la matrice A comporte principalement des zéros (on
dit qu’elle est creuse), et dans le cas présent elle est tridia- ∂T (~r)
C ~ T (~r)
= Q̇(~r) − div κ(~r) grad
gonale 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
2
ce problème est ψ ℓ+1 puisqu’on cherche la fonction d’onde
2
∂ψ(x, t) h̄ ∂ ψ(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 .. .. .. .. ρ(~r) = ρ̃(~q) e−i~q.~r d3 ~q
0 . . . . 0
.. .. .. ..
0 0 0 . . . . En utilisant les transformées inverses, l’équation de Pois-
son se reécrit :
ζ1 Z Z
.. 2 q.~
r 3
. ∇ Ṽ e −i~
d ~r = − ρ̃ e−i~q.~r d3~r
Z=
ζℓ
.. soit après une dérivation sous l’intégrale :
. Z Z
ζn
−|~q|2 Ṽ e−i~q.~r d3~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 et :
valeurs propres, celles de D sont les mêmes que celles de A, ρ̃(~q)
Ṽ (~q) =
seulement les vecteurs propres donnent les déplacements |~q|2
pondérés par c(x) : il suffit d’en tenir compte (voir par extrêmement facile à résoudre. . . La méthode consiste
exemple la figure 5.7). donc à calculer d’abord la transformée de Fourier de ρ(~r),
diviser le résultat par |~q|2 puis retransformer par Fourier
0.1
1 inverse pour obtenir le potentiel V (~r). Tout ceci est très
0.08 2
3
4 efficace et rapide. En ~q = 0, on a :
0.06 5
6 Z
0.04
Ṽ (~q = 0) = V (~r)d3~r
0.02
0
il s’agit simplement de définir la constante arbitraire qui
−0.02
intervient dans le potentiel.
−0.04 Malheureusement, les choses sont parfois un peu re-
−0.06 torses comme on peut le constater sur la figure 5.8 puisque
−0.08 les deux charges placées sur un axe horizontal donnent un
−0.1
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
potentiel qui n’a pas la même symétrie, ce qui est fâcheux !
∇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 : Fig. 5.8 – Calcul par une méthode spectrale à deux dimen-
Z sions du potentiel électostatique produit par deux charges.
i~
q .~
r 3
Ṽ (~
q ) = V (~r) e d ~r
En revanche, le même calcul par différences finies (figure
5.9), bien qu’exigeant sensiblement plus de temps calcul
où le symbole d3~r indique qu’il s’agit d’un intégration sur
(c’est un schéma implicite qui requiert la résolution d’un
les trois coordonnées d’espace. De même :
système linéaire 4096 × 4096, puisque le carré de 64 × 64
Z
donne 642 = 4096 mailles) fournit un résultat bien plus
q ) = ρ(~r) ei~q.~r d3~r
ρ̃(~ satisfaisant.
104 Licence de physique L3 : Physique Fondamentale & 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-
Fig. 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 dans
h̄2 ψ̃(ω, ~
q)
−h̄ω ψ̃(ω, ~q) = − 2
+ q′ − ~
Ṽ (~ q )ψ̃(ω, ~q′ )d~
q′ l’équation (5.4), on approxime la fonction f (x, y, z) re-
2m q cherchée par un développement local sur une base de fonc-
avec des notations similaires à ce qui précède. On obtient tions. On fait ainsi un maillage de l’espace (voir la figure
sans grande surprise un produit de convolution. Celui-ci 5.10), en général avec de petits tétraèdres de tailles va-
peut être très rapide à calculer si Ṽ (~ q ) est bien localisé riables de telle façon que la géométrie du maillage suive
(i.e. V (~r) varie lentement) et donc l’intégrale aisée à cal- d’assez près celle du problème : dans le cas de l’aile d’avion,
culer ; au contraire, si V (~r) est localisé, avec des variations par exemple, les « mailles » seront plus petites et plus res-
rapides, le produit de convolution dans l’espace réciproque serrées près du bord d’attaque de l’aile, là où le flux d’air
sera extrêmement laborieux à obtenir. . . on retrouve ici la subit les déviations les plus brutales, les champs de vitesse
bonne vieille propriété des transformées de Fourier : avec et de pression présentent des variations importantes.
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’espace ϕj (x, y, z) :
réciproque (l’espace des ~ q ) est plus efficace. X p
f (x, y, z) ≃ vj ϕj (x, y, z), (x, y, z) ∈ Mp
j
5.2.4 Introduction aux éléments finis
les vjp étant les coefficients du développement dans cette
Pratiquement tous les exemples ci-dessus sont unidi- maille.
mensionnels pour des raisons de simplification évidente. Le Comme les fonctions ϕj sont connues, choisies par l’uti-
passage à trois dimensions peut se faire dans tous les cas lisateur, leurs dérivées partielles sont calculables et les
Physique numérique, Philippe Depondt 105
dérivées partielles de f s’écrivent : à une échelle suffisamment grande pour que la structure
atomique de la matière n’intervienne pas. Lorsqu’on se
∂f (x, y, z) X p ∂ϕj (x, y, z)
≃ vj préoccupe de question se situant à une échelle plus petite,
∂x j
∂x il faut bien sûr adopter une modélisation appropriée où la
matière est considérée comme constituée d’atomes.
Très souvent, les fonctions ϕj sont tout simplement des
polynômes de telle façon que leurs dérivées soient faciles
à obtenir. 5.3.1 Matrice dynamique
En général, on se retrouve avec un très grand système On a vu, à propos des problèmes de valeurs propres (§
d’équations à résoudre dont les inconnues sont les coeffi- 4.5.4), que beaucoup de questions pouvaient se ramener à
cients vjp . un problème de matrice dynamique dont on cherche les va-
A titre d’exemple, le problème du paragraphe 5.4 est leurs propres et les vecteurs propres. Pratiquement tous les
traité ici, bien qu’il soit absurde d’utiliser les éléments fi- problèmes d’oscillateurs harmoniques couplés peuvent être
nis dans ce cas qui se résout facilement par différences avantageusement abordés de la sorte. Plusieurs problèmes
finies ! Il s’agit simplement de montrer ici le principe de la de cet ordre, suffisamment différents pour montrer la force
méthode. Dans ce cas, les mailles sont de nouveaux des pe- de cette approche, sont décrits ci-dessous.
tits intervalles d’indice p. Sur un intervalle, la température
s’écrit : 5.3.1.1 La chaı̂ne unidimensionnelle désordonnée
T (x) = ap x2 + bp x + cp
Considérons d’abord la dynamique d’une chaı̂ne uni-
si
δx δx dimensionnelle harmonique d’atomes : le problème est
xp − p < x < xp + p , δxp = xp − xp−1 mathématiquement assez proche de celui du paragraphe
2 2
5.2.2.6. La chaı̂ne est représentée en figure 5.11 ; l’équation
où xp est le milieu du p-ième intervalle. La température
du mouvement en est bien connue :
n’est donc pas considérée comme une constante dans
l’intervalle comme c’était le cas avec la méthode des
mẍℓ = κ(xℓ+1 − xℓ ) + κ(xℓ−1 − xℓ )
différences finies. La base de fonctions est ici limitée à trois
monômes de degrés 0, 1 et 2. Les inconnues sont les coeffi- où m est la masse des atomes tous identiques, κ la rai-
cients ap , bp et cp . Dans le p-ième intervalle, l’équation de deur des «ressorts » et xℓ le déplacement par rapport à
diffusion de la chaleur (5.8) s’écrit en tenant compte des sa position d’équilibre de l’atome ℓ. La distance entre les
expressions des dérivées : positions d’équilibre des atomes est a.
∂κ(xp )
(2ap x + bp ) + κ(xp )2ap = −Q̇(xp )
∂x m κ
Cependant, la température doit être continue aux jonc-
tions des intervalles, soit : Fig. 5.11 – La chaı̂ne linéaire unidimensionnelle d’atomes
identiques
ap (xp + δxp+1 )2 + bp (xp + δxp+1 ) + cp =
Dans ce genre de problème, on cherche des solutions de
ap+1 (xp + δxp+1 )2 + bp+1 (xp + δxp+1 ) + cp+1 type onde plane où ω est la pulsation de l’onde, q son
De même les dérivées premières : vecteur d’onde :
On obtient ainsi un système de 3n équations à 3n incon- et l’on obtient l’équation de dispersion habituelle :
nues (puisque l’on à une base de 3 fonctions, cela n’a rien r
à voir avec la dimensionnalité) que l’on peut résoudre par κ qa
ω=2 sin
les méthodes habituelles. m 2
Si le principe en est simple, l’écriture de programmes Mais si le système présente du désordre, par exemple
d’éléments finis est assez lourde. Le maillage à lui seul si l’on introduit des impuretés, c’est-à-dire des atomes de
n’est pas simple. Il s’agit cependant d’un problème assez types différents, κ et m dépendent du site ℓ : κ doit être
modulaire sur le plan informatique : le choix du maillage, remplacé par κℓ,ℓ+1 (la raideur entre les sites ℓ et ℓ + 1)
par exemple, est pratiquement indépendant du traitement et m par mℓ ,
à proprement parler des équations aux dérivées partielles.
Ainsi, les utilisateurs semblent préférer utiliser des pro- mℓ ẍℓ = κℓ,ℓ+1 (xℓ+1 − xℓ ) + κℓ−1,ℓ (xℓ−1 − xℓ )
grammes déjà existants qui, en général, s’adaptent assez
bien à chaque problème particulier. Point n’est besoin de On peut tenter une résolution analytique par des
réinventer ce qui existe déjà ! méthodes perturbatives, mais le cas d’un fort désordre
paraı̂t difficile à traiter et la généralisation à trois dimen-
sions problématique (car le problème est en général traité
5.3 La matière comme une collec- à l’aide d’une méthode dite de « matrice de transfert »
intrinsèquement unidimensionnelle.)
tion de particules. Toutefois, on peut aussi poser :
Tous les problèmes ci-dessus, à l’exception bien sûr de uℓ
l’équation de Schrödinger, reposent sur une modélisation xℓ = √ eiωt
mℓ
106 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
on se débarrasse alors de la dépendance temporelle, de structure dynamique » dont les maxima fournissent ce
mais on ne postule plus la périodicité spatiale comme qui tient lieu de « courbe de dispersion » (figure 5.12) qui
précédemment, puisque uℓ dépend de ℓ, c’est-à-dire du ressemble à ce que pourrait donner une expérience, par
site. On obtient le système d’équations suivant : exemple, de diffusion inélastique de neutrons.
On peut également regarder, ce qui paraı̂t pour le moins
κℓ,ℓ−1 difficile à réaliser expérimentalement, les mouvements cor-
ω 2 uℓ = −√ uℓ−1 respondants à différents points de la figure 5.12 : par
mℓ−1 mℓ
κℓ+1,ℓ + κℓ,ℓ−1 κℓ+1,ℓ exemple, en figure 5.13.
+ uℓ − √ uℓ+1
mℓ mℓ mℓ+1
D=
.. ..
. . 0 0 0
.. .. ..
. . . 0 0
κℓ,ℓ−1 κℓ+1,ℓ + κℓ,ℓ−1 κℓ+1,ℓ
0 0
−√
mℓ−1 mℓ mℓ
−√
mℓ mℓ+1
.. .. ..
0 0 . . .
.. ..
0 0 0 . .
et le problème revient à chercher
les valeurs propres ω 2 ,
u1
u2
..
.
et les vecteurs propres U =
uℓ de cette matrice
.
..
un
dynamique.
Comme pour l’exemple de la poutre 5.2.2.6, il y a des
programmes de bibliothèque qui font cela très bien ! (sur-
tout si la matrice est creuse, ce qui est toujours le cas –à
1-D, elle est même tridiagonale–).
40
20
10
3 5
Fig. 5.13 – Deux vecteurs propres. En haut, un vecteur
2.5 propre du début de la courbe de dispersion (ω ≃ 0,6), peu
affecté par le désordre. En bas, un vecteur propre non-
2
propagatif, localisé sur des impuretés (ω ≃ 2,2).
1.5 freq
1 Ainsi, l’on peut directement établir une relation entre
0.5 des résultats « expérimentaux » et des processus qui ont
lieu au niveau microscopique.
0
0 0.5 1 1.5 2 2.5 3 .
q
5.3.1.2 Dynamique d’une molécule
Fig. 5.12 – Facteur de structure dynamique d’une chaı̂ne
désordonnée de 100 atomes. Cela revient à la courbe de La dynamique d’une molécule unidimensionnelle à trois
dispersion d’une onde acoustique dans la chaı̂ne. On ob- atomes sera d’abord décrite pour préciser les principes de
serve une branche « normale » pour les basses fréquences la méthode de façon schématique, puis on généralisera à
et une composante à haute fréquence due au désordre (les des cas plus généraux.
impuretés dans cet exemple étant plus légères).
5.3.1.2.1 À une dimension, trois atomes. Soient
La matrice U donne les déplacements atomiques en
donc trois atomes alignés, de masses m1 , m2 et m3 . Ils
fonction du numéro du site, autrement dit de la position
sont liés par un potentiel harmonique, de telle façon que
ri = a×i : une transformée de Fourier spatiale des vecteurs
l’énergie potentielle d’interaction entre 1 et 2 s’écrive
propres doit donc donner quelque chose qui dépend du vec-
teur d’onde q, or il y a également dépendance en fonction 1
de la pulsation ω. On obtient alors S(q, ω), le « facteur V12 = k(x1 − x2 )2
2
Physique numérique, Philippe Depondt 107
où x1 et x2 sont les déplacements des atomes 1 et 2 par 5.3.1.2.2 À trois dimensions, N atomes. On
rapport à leur position d’équilibre. De même, réalise, à la lumière de l’exemple ci-dessus, que dès que
la matrice dynamique a une dimension qui dépasse 3,
1 ′ 2 le calcul devient inextricable, or la dimension de D est
V23 = k (x2 − x3 )
2 le nombre de degrés de liberté du système : pratique-
ment toutes les molécules échappent à cette analyse !
k k’
Évidemment, comme cela a déjà été montré, la résolution
numérique est beaucoup plus aisée.
Essayons de poser le problème de façon plus générale :
m1 m2 m3 soit une molécule de N atomes de masses mℓ situées
On néglige l’interaction entre 1 et 3. Les équations du aux coordonnées ~rℓ . On suppose que l’on est capable de
mouvement s’écrivent simplement : calculer l’énergie potentielle du système V ({~rℓ )}, ℓ ∈
[1, N ]. On suppose également que l’on connait les positions
(0)
m1 ẍ1 = k(x2 − x1) d’équilibre des atomes ~rℓ . Afin de simplifier les notations,
m2 ẍ2 = k(x1 − x2) + k ′ (x3 − x2 ) on pose que :
m3 ẍ3 = k(x2 − x3)
qk = rℓ,α ℓ ∈ [1, N ], α ∈ [1, 3], k = 3(ℓ − 1) + α
De la même façon que pour la chaı̂ne linéaire d’atomes, on
où α indice les trois coordonnées de l’espace. L’indice k
pose :
varie de 1 à 3N , c’est-à-dire le nombre de degrés de liberté
u1 iωt du système. Les équations du mouvement2 s’écrivent :
x1 = √ e
m1
∂V
u2 iωt mk q̈k = − ∀k ∈ [1, 3N ]
x2 = √ e ∂qk
m2
u3 Les dérivées sont prises en {qk } : comme on s’intéresse à
x3 = √ eiωt
m3 un système harmonique, on peut faire un développement
(0)
limité autour de la position d’équilibre {qk },
ainsi :
√ u2 u1 ∂V ∂V (0)
X ∂2V (0)
− m1 ω 2 u1 = k( √ −√ ) ({qk′ }) = ({qk′ }) + ′′ ({qk′ })(qk − qk )
′′
m2 m1 ∂qk ∂qk ∂q k ∂qk
k′′
√ u1 u2 u3 u2
− m2 ω 2 u2 = k( √ − √ ) + k′ ( √ −√ )
m1 m2 m3 m2 Les dérivées de l’énergie potentielle à l’équilibre
√ u 2 u 3 ∂V (0)
− m3 ω 2 u3 = k( √ −√ ) ({qk′ }) sont nulles, et les équations du mouvement
m2 m3 ∂qk
se reécrivent :
En termes matriciels : X ∂2V (0) (0)
k m k q̈k = ′ ({qk′′ })(qk − qk′ )
′
− √ k 0 ∂q k ∂q
u1 m 1 m 1 m 2 k ′ k
k+k′
− √mk2 m3
′
U = u2 D = − √mk1 m2 m2
(0)
u3 0
′
− √mk2 m3 k′ En posant xk = (qk − qk ) (les déplacements par rapport
m3
à l’équilibre), on obtient :
et X
ω 2 U = DU mk ẍk = − Ck,k′ xk′ (5.12)
k′
La recherche des valeurs propres revient à la recherche
des racines de |D − ω 2 I| = 0 : a priori, cela donne un où Ck,k′ est la matrice des dérivées secondes de l’énergie
polynôme en ω 6 , mais compte tenu de la solution ω = 0 potentielle, ce qui nous ramène à une forme familière : il
correspondant à la translation d’ensemble de la molécule reste à appliquer la procédure habituelle,
(car |D| = 0), on obtient une équation bicarrée en ω : uk
xk = √ eiωt
mk
′
k(m 1 + m 2 ) + k (m 2 + m 3 ) m 1 + m 2 + m 3
ω4− ω 2 +kk ′ = 0 et
m1 m2 m3 m1 m2 m3 X Ck,k′
ω 2 uk = √ uk ′
soit mk mk ′
k′
1 k(m1 + m2 ) + k ′ (m2 + m3 )
ω2 = × soit, comme avant :
2 m1 m2 m3
s ! ω 2 U = DU
m 1 m 2 m 3 (m 1 + m 2 + m 3 )
1 ± 1 − 4kk ′
k(m1 + m2 ) + k ′ (m2 + m3 ) Il est aisé de vérifier que la matrice D est symétrique.
Il « suffit » de réinjecter ces solutions dans l’équation aux 2 Ici, les variables sont des variables spatiales (x, y, z), mais, fort
valeurs propres pour obtenir les vecteurs propres et les souvent dans les systèmes mécaniques comportant par exemple des
contraintes, la situation est plus complexe : on a alors souvent intérêt
déplacements atomiques correspondant à chaque valeur d ∂L ∂L
propre. à utiliser les notations Lagrangiennes : L = K − V et = .
dt ∂ q̇ℓ ∂qℓ
108 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
Molecular vibrations (1955) reéd. Dover (1980), chap. 4. |~ei ∧ ~ej | ηi,j =
Physique numérique, Philippe Depondt 109
ρ~0 − ρ~i ~0 − ρ~j
ρ Si Sj s’écrivent alors
· ~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 = −
|~e1 ∧ ~e2 | |~r2 − ~r0 | |~r1 − ~r0 | on peut généraliser sans difficultés. . . autres que « tech-
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 :
1X
4
1X uk
ρk }) =
V ({~ ~0 ) 2 +
ρi − ρ
ki (~ 2
cij ηij (5.14) xk,ℓ = √ ei(ωt−q(ℓa+Xk ))
2 i=1 2 mk
i = 1, 3
où q est le vecteur d’onde de l’onde plane. Jusqu’ici, nous
j = i + 1, 4
10
X n’avons rien fait de nouveau par rapport à la chaı̂ne unidi-
1 mensionnelle à un type d’atomes, sinon des aménagements
= ki Si2
2 i=1 pour tenir compte du nombre d’atomes par maille, ce qui
ne fait qu’alourdir les notations sans apporter grand-chose
Dans l’é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
2 −iqX1 up −iq(Xp −a) u1 −iqX1
(5.13). −ω u1 e = cp,1 √ e − e +
m1 mp m1
On constate que, dans cet exemple, la difficulté ne tient
u2 u1 −iqX1
pas tant à la méthode elle-même qui n’a rien de parti- c2,1 √ e−iqX2 − e
m1 m2 m1
culièrement nouveau par rapport à ce que l’on a déjà vu
dans les paragraphes précédents, mais dans une mise en 2 −iqXk uk−1 −iqXk−1 uk −iqXk
−ω uk e = ck−1,k √ e − e +
œuvre de la géométrie de la molécule. mk mk−1 mk
uk+1 uk −iqXk
ck+1,k √ e−iqXk−1 − e
5.3.1.3 Dynamique de réseau mk mk+1 mk
Cette technique qui utilise la matrice dynamique est −ω 2 up e−iqXp = cp−1,p √ up−1 e−iqXp−1 − up e−iqXp +
extensible à un réseau périodique d’atomes, c’est-à-dire mp mp−1 mp
un cristal. Elle recouvre que qu’on appelle la « dyna- u1 −iq(Xp +a) up −iqXp
c1,p √ e − e
mique de réseau » et elle est très utilisée pour interpréter mp m1 mp
des expériences de spectroscopie optique ou neutronique
qui servent à déterminer les modes de vibrations présents Après quelques manipulations simples, cela donne :
dans des systèmes qui peuvent être assez compliqués. cp,1 e−iq(Xp −X1 −a) cp,1 + c2,1
Sa limite cependant est que les interactions entre les ω 2 u1 = − √ up + u1
m1 mp m1
atomes doivent pouvoir être traités dans l’approxima-
tion harmonique ce qui impose plusieurs contraintes : c2,1 e−iq(X2 −X1 )
− √ u2
que les positions d’équilibre soient déjà connues, donc la m1 m2
structure microscopique du matériau établie et que les ck−1,k e−iq(Xk−1 −Xk ) ck−1,k ck+1,k
déplacements atomiques restent suffisamment petits pour ω 2 uk = − √ uk−1 + uk
mk mk−1 mk
qu’un développement limité au premier ordre des forces
soit possible. ck+1,k e−iq(Xk−1 −Xk )
− √ uk+1
Prenons, pour simplifier les notations, le cas unidimen- mk mk+1
sionnel : nous avons une chaı̂ne unidimensionnelle infinie cp−1,p e−iq(Xp−1 −Xp ) cp−1,p + c1,p
(et non finie comme dans le § 5.3.1.2.1) avec p atomes ω 2 up = − √ up−1 + up
mp mp−1 mp
par maille, ces mailles étant indéfiniment répétées. Chaque
atome est en principe repéré par 2 indices, ℓ le numéro de c1,p e−iq(X1 −Xp +a)
− √ u1
la maille (qui va de −∞ à +∞) et k le numéro de l’atome mp m1
dans la maille ℓ (k ∈ [1, p]). La position d’équilibre de
l’atome k, ℓ est donc On constate qu’une fois de plus on tombe sur un
problème aux valeurs propres, la matrice dynamique étant
Xk,ℓ = ℓa + Xk maintenant p × p, donc a priori moins grosse qu’avant. . .
toutefois, comme le vecteur d’onde apparaı̂t dans la ma-
où a est le paramètre de maille et Xk la position dans la trice, il faudra résoudre le problème un grand nombre de
maille. Les déplacements des atomes par rapport à ces po- fois, soit une fois pour chaque valeur souhaitée du vec-
sitions d’équilibre sont xk,ℓ ; les équations du mouvement teur d’onde. La matrice dynamique elle-même est devenue
110 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
complexe à cause des termes en eiqx , toutefois les termes Il existe cependant une solution : les tirages au sort ou
symétriques par rapport à la diagonale sont conjugués Monte-Carlo comme on l’a vu au paragraphe 4.11.6.
l’une de l’autre : la matrice est hermitique et il suffira
de choisir un sous-programme de bibliothèque approprié.
V ({~ri })
Fig. 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.
nuages électroniques. En principe, on doit alors résoudre et l’équation de Schrödinger se reécrit comme avant
l’équation de Schrödinger de n noyaux de numéro ato-
Xn ψi+1,j,k − 2ψi,j,k + ψi−1,j,k
mique Zi et Zi électrons en interaction. −
δx2
i=1 ψi,j+1,k − 2ψi,j,k + ψi,j−1,k
−
δy 2
5.3.4.1 Une petite contrariété
ψi,j,k+1 − 2ψi,j,k + ψi,j,k−1
−
Malheureusement, on ne peut pas attaquer le problème δz 2
avec des méthodes comme celle étudiée dans le paragraphe +Vi,j,k ψi,j,k = E ψi,j,k
5.2.2.4 : il n’existe pas au monde d’ordinateur assez puis-
sant pour le faire ! Pour illustrer ce propos, revenons à Le triplet (i, j, k) prend alors n3 valeurs5 , ainsi la ma-
l’équation de Schrödinger indépendante du temps à une trice dont on cherche les valeurs propres est de dimension
dimension et à une particule dans un potentiel : c’est le n3 × n3 , soit 106 ×106 si n = 100 : le problème s’est brutale-
cas le plus simple. La fonction d’onde ψ qui décrit l’état du ment amplifié de façon démesurée. . ., et nous n’en sommes
système est une fonction à une variable, et l’on obtient4 : encore qu’à une seule particule ! Passons à un problème a
priori simple, l’atome d’hydrogène : un proton et un neu-
∂ 2 ψ(x) tron, soit deux particules en interaction, à trois dimen-
Hψ = Eψ ≡ − + V (x)ψ(x) = Eψ(x)
∂x2 sions, soit 6 variables. Le même raisonnement nous mène
à estimer l’ordre de grandeur du problème à 1012 × 1012
En discrétisant le problème de la façon habituelle,
(toujours avec 100 points par variable) : même avec un
xi = i δx, Vi = V (xi ), ψi = ψ(xi ) ordinateur très puissant, c’est sans espoir !
Conclusion : il ne suffit pas, pour résoudre un problème,
l’équation se reécrit : de « le mettre dans l’ordinateur » et d’attendre que la force
brute de la machine fasse son œuvre. Il faut donc faire des
ψi+1 − 2ψi + ψi−1 approximations.
− + Vi ψi = Eψi
δx2
Il est aisé de se convaincre que, chercher E et ψi , i ∈ 5.3.4.2 L’approximation de Born-Oppenheimer
[1, n], revient à chercher les valeurs propres et les vecteurs
propres d’une matrice (n × n) : si n est de l’ordre de 100, La première étape consiste à découpler les mouvements
voire davantage, il n’y a rien de bien extraordinaire à cela. des électrons de ceux des noyaux beaucoup plus lourds
Imaginons maintenant le même problème à trois dimen- et beaucoup plus lents (c’est l’approximation de Born-
sions : la discrétisation implique un triplet d’indices (i, j, k) Oppenheimer). Pour le mouvement des noyaux, on se
contente en général d’une dynamique classique. Cette dy-
xi = i δx, yj = j δy, zk = k δk namique est lente par rapport à celle des électrons, ainsi,
on fait l’hypothèse que le nuage électronique est toujours
ψi,j,k = ψ(xi , yj , zk ) Vi,j,k = V (xi , yj , zk ) 5 en général, on renumérote les sites pour n’avoir qu’un seul indice
en équilibre, qu’il s’adapte instantanément à un chan- C’est ce qu’on appelle la méthode de Hartree. Elle
gement de configuration des noyaux. D’un point de vue présente un énorme défaut : a priori, les électrons sont
quantique, il ne reste plus qu’à résoudre l’équation de des fermions et leur fonction d’onde devrait être anti-
Schrödinger électronique : pour l’hydrogène, on revient à symétrique, c’est-à-dire changer de signe par permutation
un problème à une particule. Le problème reste cependant de deux électrons :
entier dès lors que l’on s’intéresse à, ne serait-ce qu’un
atome d’hélium isolé. Il faut donc encore aller quelques ψ(~r1 , . . . , ~ri , ~rj , . . . , ~rn ) = −ψ(~r1 , . . . , ~rj , ~ri , . . . , ~rn )
pas plus loin : il existe à ce titre plusieurs approches pos-
Si l’on choisit de remplacer cette fonction d’onde par un
sibles. simple produit de fonctions mono-électroniques, il est clair
que cette propriété ne sera pas remplie. Pour régler cette
5.3.4.3 Les méthodes de Hartree et Hartree-Fock question, on remplace ce produit pas un déterminant, ap-
Imaginons d’abord, pour simplifier, une fonction à deux pelé déterminant de Slater :
variables ψ(x1 , x2 ) : on peut en faire un développement χ1 (~r1 ) χ2 (~r1 ) . . . χn (~r1 )
à un ordre quelconque par rapport à x2 , sur une base de χ1 (~r2 ) χ2 (~r2 ) . . . χn (~r2 )
ψ(~r , ~
r , . . . , ~
r ) ∼
fonctions appropriées ϕℓ2 (x2 ) : 1 2 n ... ... ... . . .
X χ1 (~rn ) χ2 (~rn ) . . . χn (~rn )
ψ(x1 , x2 ) = cℓ2 ϕℓ2 (x2 )
ℓ2 qui assure la propriété d’antisymétrie : si l’on permute
deux électrons, cela revient à permuter deux lignes et
mais, évidemment, les coefficients du développement cℓ2
donc à changer le signe du déterminant. Ainsi corrigée,
sont des fonctions de x1 , suscptibles d’un développement
la méthode s’appelle la méthode de Hartree-Fock : bien
analogue : X qu’assez lourde et nécessitant un travail non-trivial de
cℓ2 (x1 ) = aℓ1 ,ℓ2 φℓ1 (x2 ) modélisation des fonctions χℓ , elle est très utilisée, no-
ℓ1
tamment par les chimistes théoriciens, pour des calculs de
et : X fonctions d’onde moléculaires.
ψ(x1 , x2 ) = aℓ1 ,ℓ2 φℓ1 (x1 )ϕℓ2 (x2 )
ℓ1 ,ℓ2
5.3.4.4 Théorie de la fonctionnelle densité
On peut, bien sûr généraliser ce genre de raisonnement
à un nombre quelconque de variables. Maintenant, l’ap- La théorie de la fonctionnelle densité (Density func-
tional theory ou DFT7 ) est, elle, une théorie, au départ,
proximation est faite d’entrée de jeu et elle est massive :
on remplace la fonction d’onde poly-électronique par un exacte, mais dont la mise en œuvre pratique oblige à des
approximations.
produit de fonctions d’onde mono-électroniques, ce qui re-
vient à se limiter au premier ordre du développement : L’idée qui sous-tend la méthode est que le détail des
fonctions d’onde de tous les électrons n’est pas ce dont on a
ψ(~r1 , ~r2 , ~r3 . . . , ~rn ) ∼ ϕ1 (~r1 ) ϕ2 (~r2 ) ϕ3 (~r3 ) . . . ϕn (~rn ) réellement besoin : la densité électronique ρ(~r) suffit bien.
Le résultat de cela, si c’était possible, serait de substituer à
On montre après quelques calculs6 que le problème s’écrit : une fonction compliquée de 3n variables ψ(~r1 , ~r2 , . . . , ~rn ),
une fonction de trois variables, ρ(~r) telle que
XN X
− ∆ i Z i 1 Z
+ < ϕj | |ϕj > ϕi (~ri )
2
I=1 |~ ri − RI | ~
j
|~
r i − ~
rj | ρ(~r) = n |ψ(~r, ~r2 , . . . , ~rn )|2 d~r2 . . . d~rn
où l’on a décomposé en énergie cinétique des électrons en tenant compte, par exemple, de la déformabilité des
(Te ), énergie potentielle d’interaction électron-électron nuages électroniques en fonction des positions de noyaux.
(Vee ) et interaction électrons-noyaux (Vext ), les deux pre- Leur gros défaut est que, même s’il existe des méthodes
miers termes ne dépendent que du nombre d’électrons, ils de calcul efficaces, ces méthodes sont terriblement voraces
sont pour ainsi dire universels. Le dernier terme dépend en temps de calcul !
des noyaux et donc du système étudié. L’énergie de l’état Ainsi des ordres de grandeurs réalistes seraient :
fondamental peut alors s’écrire comme une fonctionnelle9
<
de la densité électronique N ∼ 300
Z
E(ρ) = F (ρ) + ρ(~r)Vext (~r)d~r τ ≃ 1ps
Malgré ces défauts, elles ont leurs lettres de noblesse,
où F (ρ) regroupe les deux premiers termes universels et ρ par exemple, les phases à haute pression de la glace (liai-
son hydrogène) ou la silice vitreuse. Ces méthodes font
est la densité électronique -que l’on cherche- de l’état fon-
damental. Pour obtenir ρ, il faut alors chercher la fonction l’objet de programmes, soit commerciaux, soit libres, qui
ρ qui rend E(ρ) minimum avec, bien sûr, la contrainte que se répandent assez rapidement dans les laboratoires pour
Z devenir des outils relativement standards.
ρ(~r)d~r = N Cependant, comme on l’a vu, ces méthodes se limitent
à l’état électronique fondamental. . . lorsqu’on veut s’atta-
le nombre d’électrons dans le système. quer à des états excités, pour comparer les calculs avec des
La petite difficulté qui subsiste et que l’expression de expériences de spectroscopies diverses, il existe d’autres
F (ρ), bien qu’universelle, est inconnue ! (c’est quelque méthodes plus complexes et plus coûteuses encore en res-
chose comme < ψ|Te + Vee |ψ > mais le but de l’opération sources de calcul ! Autant dire que c’est un domaine dans
était justement d’ignorer les fonctions d’ondes). lequel la recherche est active en ce début du XXIe siècle. . .
La méthode de Kohn et Sham10 consiste à réaliser que,
puisque ce qui nous intéresse est la densité électronique
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 uti- calculer, par exemple pour une simulation Monte-Carlo
liser 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 :
problème permet parfois des gains considérables : point
-mtune=pentium4. Chaque compilateur a ses propres options, plus
ou moins adaptées à tel ou tel processeur : c’est parfois un peu la- n’est besoin de refaire plusieurs fois un calcul qui donnera
byrinthique. . . toujours, pour des raisons de symétrie, le même résultat.
115
116 Licence de physique L3 : Physique Fondamentale & 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’ins-
l’effort n’est pas énorme : il faut travailler sur des tableaux
truction. 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
bon usage des caches. L’expérience prouve qu’en général,
7.1 L’architecture vectorielle 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 les La facilité de programmation de ces machines a fait leur
uns des autres qui travaillent en suivant le principe « je succès : certains CRAY des années 1990 en particulier
fais ma petite part de travail et je passe à mon voisin ». avaient des registres de très grande taille capable de sto-
Un exemple élémentaire est tout simplement l’existence de cker un grand nombre d’éléments de tableau afin de tirer
mémoires-tampon : si l’on envoie un texte ou une image parti de la rapidité d’accès aux registres et l’on obtenait
en impression sur une imprimante, celle-ci est très lente aisément ainsi de très bonnes performances de calcul pour
par rapport au processeur de l’ordinateur ; donc en pra-
l’époque.
tique, on envoie la tâche d’impression dans une mémoire
dite « tampon »(ou buffer ) de telle façon que le processeur Ce sont toutefois des technologies coûteuses dont les li-
puisse s’occuper d’autre chose pendant l’impression. Plus mites sont assez vite apparues : on verra ce que l’avenir
sérieusement, lorsqu’on travaille dans une boucle avec des réserve, mais il ne semble plus que cette voie continue à
instructions composites sur des tableaux, chaque proces- être activement explorée par les constructeurs, même si
seur fera quelque chose (une addition par exemple) sur un des ordinateurs comportent une part de vectorisation.
é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 les processeurs 7.2 Parallèlisme
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 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
Instructions Multiple Data) ou différentes (Multiple Ins- d’autant que les centres de calculs se mettent à en propo-
tructions Multiple Data). En pratique, les problèmes sont ser des centaines, voire des milliers (on commence à parler
différents selon que l’on travaille avec un petit nombre de calculs répartis sur des dizaines de milliers de proces-
de processeurs (ou plutôt de cœurs ; en gros 4 ou 8) qui seurs).
partagent le même espace mémoire (mémoire partagée ou
shared memory) ou un grand nombre de processeurs qui 7.2.2 Mémoire distribuée
utilisent chacun un espace mémoire propre (mémoire dis-
tribuée ou distributed memory) : dans ce cas la commu- Une autre solution consiste à répartir explicitement le
nication entre processeurs se fait par un réseau qui est travail sur les processeurs, tel processeur devant faire tel
généralement optimisé pour ralentir le moins possible les morceau du programme sur telles données, tel autre pro-
calculs. cesseur faisant autre chose sur d’autres données. En an-
glais, on appelle cela Multiple Instructions Multiple Data
ou MIMD. Chaque processeur fait son travail spécifique
7.2.1 Mémoire partagée sur ses données. La difficulté est la synchronisation de
C’est une situation assez fréquente et qui le devient de ce beau monde, car il arrive que ce que doit faire un
plus en plus : un ordinateur contient plusieurs proces- processeur dépende du résultat d’un calcul fait par un
seurs, 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 per-
pilateur, si on lui donne les bonnes options, parallélise. . . mettent de faire communiquer les processeurs entre eux et
presqu’automatiquement. les forcer à s’attendre les uns les autres pour s’échanger
En pratique on utilise généralement OpenMP (pour les données dont ils ont besoin. Ainsi, dans un pro-
Open MultiProcessing) qui est librement distribué : en gramme, on appelle des sous-programmes de bibliothèque,
fortran cela apparaı̂t comme des commentaires du type : par exemple :
!$OMP PARALLEL call MPI_SEND(....)
ou pour envoyer des données d’un processeur à un autre. En
!$OMP END PARALLEL effet, mettons que l’on soit en train de faire un calcul de
de telle sorte qu’un compilateur « non averti » (c’est-à- type Monte-Carlo-Metropolis, il faut calculer toutes les
dire qui ne connait pas OpenMP ou auquel on n’a pas
interactions i-j, or il faut répartir les atomes entre les
fourni l’option de compilation appropriée) puisse compi-
ler le programme sans tenir compte de ces directives. Au processeurs : un processeur donné doit donc disposer des
contraire, le compilateur qui connait OpenMP va tenir positions de tous les atomes, et non seulement de ceux dont
compte de tout ce qui commence par !$OMP. On écrira il a la charge. En fin de course, il faut additionner toutes
alors des choses comme : les énergies et donc concentrer sur un processeur toutes
les énergies partielles calculées sur tous les processseurs :
!$OMP PARALLEL encore des communications entre processeurs.
do i = 1, n La gestion de ceci par l’utilisateur est plus difficile car il
...
faut gérer explicitement par programme tous ces échanges,
enddo
et équilibrer les charges de travail des processeurs de façon
!$OMP END PARALLEL
à ne pas perdre trop de temps dans les attentes.
et le compilateur répartit la boucle sur les processeurs dis-
ponibles, chacun prenant sa part de données. Il faut ce-
pendant ê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 du-
pliqué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
121
122 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
float x[n][m] ; // tableau de tableau où, pour gagner de l’espace mémoire, on programmait par-
fois en assembleur, des souvenirs d’écrans devenus soudai-
for ( int step = 0; step < n; step++ ) nement tous noirs, ou d’ordinateurs qu’il fallait débrancher
{ du secteur pour les redémarrer ensuite, tout simplement
for ( int i = 0 ; i < m ; i++ ) parce qu’un pointeur dans un de mes programmes était
{
allé écraser une adresse mémoire réservée au système d’ex-
x[step][i] = step+pow(i,3.2) ;
cout << step << " " << i << " "
ploitation. . . La chasse à l’erreur, dans ces conditions, était
<< x[step][i] << endl ; un exercice requérant une acuité intellectuelle supérieure
} et dans lequel la fameuse loupe de Sherlock Holmes était
} un ustensile indispensable !
} C’est à ce genre de délices que C++ nous convie. . . Il
est sans doute inutile de préciser que, quand on a le choix
Noter au passage 1o les deux boucles imbriquées, entre utiliser un tableau comme ci-dessus, et un pointeur,
2o l’usage correspondant des accolades ainsi que 3o la on a tout intérêt à utiliser le tableau. Il arrive toutefois
façon d’éviter qu’à l’écriture tous les chiffres soient ac- bien souvent que l’on n’ait pas le choix.
colés, en insérant des espaces et enfin 4o que la mise à la Concrétement, imaginons que nous ayons déclaré une
puissance du fortran (x**y) n’existe pas plus en C++ variable, scalaire pour commencer, par exemple, par :
qu’en C : il faut utiliser la fonction pow. float x ;
Finalement, C++ ne connait pas la manipulation Son adresse dans la mémoire vive s’écrit alors : & x
globale de tableaux : toutes les boucles doivent être Déclarons alors une variable de type pointeur à l’aide de
écrites explicitement, et les fonctions intrinsèques du type l’astérisque * :
sum, dot product ou matmul sont absentes. float * px ; // déclaration d’un pointeur
On note que le type de la variable vers laquelle on pointe2
est fourni, afin de donner le nombre d’octets qu’elle va oc-
8.4.2 Les pointeurs : premiers pas cuper dans la mémoire. On peut alors écrire :
Les pointeurs font le charme sulfureux du langage C : px = & x ;
ils permettent d’éblouissantes acrobaties et autorisent l’ar- L’adresse de x est stockée dans le pointeur px. Pour don-
tiste à donner libre cours à toute sa virtuosité. . . Ils sont ner la valeur 1.414 à x, il y a maintenant deux façons de
aussi la source de bugs particulièrement retors ! À mani- procéder :
puler avec une certaine prudence, donc. x = 1.414 ; // méthode classique
ou alors on stocke 1.414 à l’adresse pointée par px
Dans le principe, cependant, c’est assez simple.
*px = 1.414 ;
Il faut savoir qu’un tableau -dans n’importe quel lan-
Évidemment, dans le cas simple montré ici, la première
gage, y compris fortran- est un pointeur masqué. Un lan-
est de loin préférable. Imaginons cependant la séquence
gage comme le fortran est fait de telle sorte que l’usage suivante :
explicite de pointeurs est en général inutile, dans le but
évident de simplifier la vie de celui (ou celle) qui écrit les float x; // variable réelle
programmes. En C et C++, au contraire, tout est fait float * px ; // pointeur vers une variable réelle
pour que toutes les potentialités de ces objets puissent
px = & x ; /* initialisation du pointeur sur
être utilisées.
l’adresse de x */
Les pointeurs, c’est une vieille histoire, du moins à px = px + 1 ; /* incrémentation du pointeur de quatre
l’échelle de l’histoire de l’informatique. En assembleur, octets : variable suivante */
il n’y a pas de tableau, or un tableau, c’est simplement *px = 1.414 ;
un ensemble de cases dans la mémoire vive, rangées les
unes derrière les autres dans l’ordre. Ainsi, pour définir un on a placé la valeur 1.414 dans une nouvelle case mémoire
tableau, on doit fournir 1o l’adresse du premier élément, située 4 octets (soit un réel) après x : il vallait mieux être
2o le type de variable, c’est à dire en pratique le nombre sûr qu’il n’y avait là rien de vital ! On réalise alors que l’on
d’octets occupé par un élément (4, 8 voire 16) et 3o le peut, en quelque sorte, se promener en toute liberté dans
nombre d’éléments. C’est ce que l’on fait quand on déclare la mémoire vive de son ordinateur et y faire toutes sortes
un tableau. L’adresse du p-ième élément du tableau est de choses exaltantes. . .
donnée par :
8.4.3 Tableaux dynamiques
adresse du premier element+ On a vu précédemment que pour déclarer un ta-
bleau statique, il fallait que la taille du tableau soit une
(p − 1)(nombre d’octets par element) constante : cela signifie que cette valeur ne peut pas être
modifiée à l’exécution du programme ; en fait elle doit
En assembleur, alors qu’on ne dispose pas de tableau, pouvoir être établie à la compilation. Ainsi, même si la
c’est exactement cela qu’on fait : on définit une variable déclaration du tableau est faite au milieu des instructions
spéciale, appelée pointeur qui contient l’adresse du pre- exécutables (c’est permis), sa taille est prédéterminée lors
mier élément du tableau, variable que l’on incrémente de de l’écriture du programme, on ne peut pas, par exemple,
la quantité voulue pour accéder aux éléments du tableau. l’entrer au clavier. En fortran, on répond à cette ques-
Quand ça marche, ça marche très bien : j’en témoigne tion par des tableaux allocatable ; en C++, on utilise
bien volontier ! Quand ça ne marche pas. . . c’est une autre un pointeur-tableau :
histoire ! J’ai des souvenirs douloureux datant de l’époque 2 ça, c’est un progrès sensible par rapport à l’assembleur. . .
124 Licence de physique L3 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
int main( )
{ int main( )
// variable qui doit contenir la taille du tableau {
int n ; cout << machin(5) << endl ;
// saisie de n }
cout << " Entrer la taille du tableau : " ; cin >> n ;
// dé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 ;
cout << j << " " << machin(j) << " " << j << endl ;
définies avant d’être utilisées sauf si l’on définit un proto-
}
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 variable
#include <string>
#include <cmath> j du programme principal n’est pas modifiée par la fonc-
using namespace std ; tion machin, alors que le calcul s’effectue bien dans la fonc-
tion. C’est que l’argument j est passé « par valeur » : la
/* début de la fonction entière machin 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 ima-
#include <iostream> ginaire), 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 : Physique Fondamentale & PHYTEM, Université Pierre et Marie Curie Paris-6 & ENS-Cachan
singuliers pour a = 0, ce qui est pourtant la caractéristique drait supposer que l’on ne connait pas la solution analytique.
127
128 Licence de physique L3 : Physique Fondamentale & 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 RT
! 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 « ra-
√ (1/3)
1 %1 4 a (−3 b R T + a) cine 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 le-
3 b (8 a − 27 b R T ) 2 2 quel 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
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 g3 + 8 m2 g2 c)
h := T → fsolve − d c Z2
M c 3 (5 m2 g c 2 − f 4 g k2 + m2 g3 + 4 m2 g2 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 : Physique Fondamentale & 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) ;
est le pas de temps utilisé, 3o la syntaxe (les subs en par-
1
x
http ://www.octave.org) ferait parfaitement l’affaire.
On obtient sans surprise que le projectile n’a pas une Les commandes (placées dans un fichier de commandes
trajectoire parabolique (qui serait symétrique par rapport exécutable) ci-dessous permettent de résoudre le même
à l’apogée). problème :
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 rouge), et celle en − 1r + 10r12 (en vert). Il est aisé de calculer
utilisateur qui aurait ouvert une autre session entre-temps qu’avec 500 astéroı̈des et un rayon d’orbite moyen r = 1,
peut très bien ne pas s’apercevoir qu’il y a quelque chose la distance moyenne entre deux astéroı̈des est un peu plus
qui tourne en même temps que ses propres applications ! grande que la distance à laquelle le terme répulsif com-
3. at 2 mence à intervenir : les astéroı̈des sont donc « presque »
mongroprog au contact, du moins au début de la simulation si on les
^D place sur un cercle.
c’est l’exécution différée : dans l’exemple ci-dessus, le pro-
gramme mongroprog démarrera à 2 heures du matin. Le
symbole ^D représente la touche contrôle (Ctrl) mainte- On obtient ainsi un résultat assez satisfaisant (figure
nue enfoncée en même temps que la touche d : cela permet 9.6) : les énergies potentielles et cinétiques varient en sens
de marquer la fin de la séquence d’instructions concernées opposés, la somme restant constante. Il faudrait ensuite
par le lancement différé. bien sûr optimiser le pas d’intégration afin de conserver la
4. batch constance de l’énergie totale tout en réduisant autant que
mongroprog possible le nombre de pas d’intégration nécessaire pour
^D obtenir les événements recherchés.
le résultat est similaire à nohup, mais c’est plus commode
si l’on veut faire faire plusieurs choses à la suite :
batch
mongroprog
traite result
rm -f temp junk file*
grocalcul
^D
Bibliographie.
135