retour index

chapitre3

Fractales physiques

Distribution gaussienne

Mouvement brownien à une dimension

Mouvement brownien fractionnaire

Mouvement brownien dans un plan

Vol de Lévy

La percolation

Renormalisation

Agrégation balistique

Agrégation limitée par diffusion (DLA)

Croissance de l'amas d'Eden

 

On va introduire dans ce chapitre les fractales statistiques, c'est-à-dire les fractales dans lesquelles intervient une part de hasard. Pour cela, il faut faire intervenir les nombres aléatoires gaussiens, qui sont des nombres au hasard répartis autour d'une valeur moyenne selon la distribution gaussienne. Cela nous menera d'abord aux mouvements browniens, qui interviennent dans de nombreux domaines :agitation moléculaire, bruits de toutes sortes, cours de la bourse etc..

Distribution gaussienne

Loi des grands nombres

On lance un grand nombre de fois 6 dés numérotés de 1 à 6. Le lancement du dé est simulé à l'aide de la commande rand :rand() donne un nombre à 12 chiffres compris entre 1 et 10$^{12}.$ On peut obtenir un nombre aléatoire entre 0 et 1 en effectuant rand()/10 $^{12}$ ;on peut également obtenir un nombre entier aléatoire entre 0 et N par la commande rand(0..N). Le résultat du lancement d'un dé est donc rand(1..6).

Le résultat du lancement des 6 dés est un nombre entier compris entre 6 et 36, et, pour chacune des valeurs, on compte combien de fois on a obtenu la valeur donnée. On reporte les résultats sur un graphique :

> restart: with(plots):with(plottools):

> a:=rand(1..6): liste:=op([]):for k to 4000 do

a1:=a():a2:=a():a3:=a():a4:=a():a5:=a():a6:=a():

e:=a1+a2+a3+a4+a5+a6:liste:=liste,e od:

> A:=array(1..31):for i to 31 do A[i]:=0 od:

> for k to nops([liste]) do: for j to 31 do

if liste[k]=j+5 then A[j]:=A[j]+1 fi od od:

> p:=seq(rectangle([j+5,A[j]],[j+6,0],color=red),j=1..31):

> display(p);


chap3__3.pngfigure 3.1 : résultat de 4000 tirages de 6 dés

Pour 4000 tirages, on a eu par exemple 410 fois le résultat 21. La distribution obtenue s'approche d' une distribution gaussienne ou distribution normale.

Cette distribution a une forme caractéristique en cloche ;le théorème de la limite centrale dit que l'on obtient cette distribution chaque fois que l'on effectue la même expérience un grand nombre de fois, la distribution étant d'autant plus proche de la distribution gaussienne que le nombre d'expériences est plus grand ;c'est la loi des grands nombres.

Nombres gaussiens aléatoires

L'expression mathématique de la distribution gaussienne a pour expression :
MATH

$\mu $ est la valeur moyenne et $\sigma ^{2}$ la variance, carré de l'écart-type.

Si la distribution est centrée et la variance $\sigma ^{2}=1,$ on obtient la distribution gaussienne normalisée
MATH

Plutôt que de procéder par tirage des dés, on va voir qu'une façon commode d'obtenir des nombres satisfaisant à une distribution approchée gaussienne normalisée est d'effectuer le double de la somme de 3 nombres aléatoires pris entre 0 et1 et de retirer 3 au résultat, ce qui donnera un nombre aléatoire gaussien normalisé compris entre -3 et 3.

Pour cela, on fait une liste de 1000 de ces nombres (obtenus en fait avec rand(0..20)/20 comme nombre au hasard entre 0 et 1), et, de la même façon qu'au paragraphe précédent, on procède à la répartition des résultats des tirages. La probabilité d'avoir un résultat dans l'intervalle dx est
MATH

g(x) est la densité de probabilité. On en tire MATH dP est le nombre de tirages correspondant à la valeur donnée divisée par le nombre total (ici 1000) de tirages. dx est la largeur de l'intervalle, prise ici à 0,1. g(x) est donc obtenue en divisant les résultats par 100. On compare g(x) à la gaussienne normalisée f(x).

> restart: with(plots):with(plottools):

> a:=rand(0..20):

> liste:=op([]):for k to 1000 do a1:=a():a2:=a():a3:=a():

e:=2*evalf(a1+a2+a3)/20-3:liste:=liste,e od:

> A:=array(1..60):for i to 60 do A[i]:=0 od:

> for k to nops([liste]) do for j to 60 do

if liste[k]=evalf(j/10-3) then A[j]:=A[j]+1 fi od od;

> q1:=plot([seq([(q-30)/10,A[q]/100],q=1..60)]):

> q2:=plot(exp(-x^2/2)/sqrt(2*Pi),x=-3..3):

> display(q1,q2);


chap3__11.pngfigure 3.2 : densités de probabilité expérimentale et gaussienne

Les courbes sont approximativement superposées, ce qui montre que l'on peut employer le procédé indiqué pour obtenir des nombres aléatoires gaussiens. Signalons que la commande de Maple

> with(stats):

> stats[random, normald](5);

.8279838784, -1.742267132, 1.123077087, -.1605619318, -1.555929034

fournit ici 5 nombres gaussiens aléatoires normalisés (distribution gaussienne centrée en 0 de variance unité).

 

début chapitre

Mouvement brownien à une dimension

Construction directe

On obtient un mouvement brownien à une dimension en additionnant des nombres gaussiens aléatoires. A chaque étape, on ajoute un nombre gaussien au nombre précédent.

On va dessiner sur le même graphe une suite de 4000 nombres gaussiens aléatoires et le mouvement brownien obtenu en ajoutant ces nombres. On fait 3 procédures indépendantes pour les nombres au hasard pour ne pas avoir 3 fois le même nombre dans la construction du nombre gaussien :

> restart:with(plots):with(plottools):

> a:=proc():rand() end:b:=proc():rand() end:

c:=proc():rand() end:

> liste:=0:for i to 4000 do g:=2*(a()+b()+c())/1e12-3:

liste:=liste,g od:

> p1:=listplot([liste]):

> liste:=0:for i to 4000 do g:=2*(a()+b()+c())/1e12-3:

liste:=liste,op(nops([liste]),[liste])+g od:

> p2:=listplot([liste]):

> p3:=translate(p1,0,100):

> display(p2,p3);


chap3__12.pngfigure 3.3 : nombres gaussiens et mouvement brownien

Prenons la première moitié de la courbe et multiplions les amplitudes par $\sqrt{2}.$ On obtient une courbe qui présente statistiquement le même aspect :

>listplot(map(x->sqrt(2)*x, [liste]),view=[1..2000,-50..20]);


chap3__14.pngfigure 3.4 : invariance d'échelle du mouvement brownien à 1 dimension

On a donc une invariance d'échelle ;si l'on double l'échelle des temps, il faut multiplier l'échelle des amplitudes par $\sqrt{2}$ pour obtenir une figure similaire statistiquement, soit, si $X(t)$ désigne la première courbe et Y(t) la seconde, MATH et, de façon plus générale, MATH Ce facteur $\dfrac{1}{2}$ caractérise le mouvement brownien à 1 dimension, dont la dimension fractale, calculée par la méthode des boîtes, est, en fait 3/2, intermédiaire entre la dimension 1 d'une courbe et la dimension 2 d'une surface.

Méthode par déplacement aléatoire du milieu

Il existe une autre méthode pour construire un mouvement brownien à une dimension, appelée déplacement aléatoire du milieu.

On part du segment joignant l'origine et l'extrémité, l'abcisse de celle-ci étant 1 et l'ordonnée un nombre aléatoire gaussien.

Puis on forme 2 segments en déplaçant le milieu du segment initial ;pour cela, on ajoute à son ordonnée un nombre aléatoire gaussien que l'on multiplie par le facteur d'échelle $1/\sqrt{2}$. On recommence l'opération sur les 2 segments obtenus, le facteur d'échelle étant multiplié par 1/$\sqrt{2}$ à chaque étape, soit le facteur d'échelle 1/$\sqrt{4}$ à la seconde étape, 1/$\sqrt{8}$ à la suivante ...Cela donne le programme suivant :

> restart:with(plots):

> a:=proc() rand() end:b:=proc() rand() end:c:=proc() rand() end:

> f:=proc(x1,y1,x2,y2,i) local d: d:=2*(a()+b()+c())/1e12-3:

x1,y1,0.5*(x1+x2),0.5*(y1+y2)+d/sqrt(2^i),0.5*(x1+x2),

0.5*(y1+y2)+d/sqrt(2^i),x2,y2:end:

> e:=2*(a()+b()+c())/1e12-3:liste:=0,0,1,e,0:for i to 8 do:

liste:=seq(f(op(4*j-3..4*j,[liste]),i),j=1..nops([liste])/4);od:

> pointplot([liste],style=line,color=red);


chap3__24.pngfigure 3.5 : mouvement brownien par la méthode du déplacement aléatoire du milieu

On peut simuler de cette façon le profil d'une montagne. On voit ci-dessous l'évolution en fonction du nombre d'itérations :

> e:=2*(a()+b()+c())/1e12-3:g:=e:

> liste:=0,0,1,g,0:for i to 1 do:

liste:=seq(f(op(4*j-3..4*j,[liste]),i),j=1..nops([liste])/4);od:

> p1:=pointplot([liste],style=line,color=red):#to 1

> p2:=pointplot([liste],style=line,color=red):# to 2

> p3:=pointplot([liste],style=line,color=red):#to 3

> p4:=pointplot([liste],style=line,color=red):#to 4

> p8:=pointplot([liste],style=line,color=red):#to 8

> with(plottools):

> p5:=translate(p2,0,0.5):p6:=translate(p3,0,1):

p7:=translate(p4,0,1.5):p9:=translate(p8,0,2):

> display(p1,p5,p6,p7,p9);


chap3__25.pngfigure 3.6 : évolution du profil de la montagne

Cette méthode est intéressante ;elle peut servir à tracer une île, et surtout, elle peut se généraliser à 3 dimensions et simuler des reliefs, comme on peut le voir dans le chapitre sur les fractales naturelles.

 

début chapitre

Mouvement brownien fractionnaire

On peut se poser la question de savoir s'il existe des courbes de type brownien, dont le facteur d'échelle, nécessaire pour retrouver l'aspect statistique de la courbe lorsque l'abcisse est dilatée par 2, est différent de $2^{1/2},$ mais de la forme $2^{H}.$

La réponse est positive, et on parle de mouvement brownien fractionnaire. H est l'exposant de Hurst et peut varier de 0 à 1, le mouvement brownien à 1 dimension correspondant à H = 1/2. La dimension fractale est 2-H.

On peut construire la courbe brownienne fractionnaire d'exposant de Hurst H en remplaçant le facteur d'échelle $1/2^{0,5}$ par $1/2^{H}$ à chaque étape.

> restart:with(plots):with(plottools):

> f:=proc(x1,y1,x2,y2,i) local b,a1,a2,a3:global H:

a1:=a():a2:=a():a3:=a():b:=2*(a1+a2+a3)-3:

x1,y1,0.5*(x1+x2),0.5*(y1+y2)+b/(2^H)^i,

0.5*(x1+x2),0.5*(y1+y2)+b/(2^H)^i,x2,y2:end:

> liste:=0,0,1,a(),0:H:=0.1:for i to 9 do:

liste:=seq(f(op(4*j-3..4*j,[liste]),i),j=1..nops([liste])/4);od:

> p1:=pointplot([liste],style=line,color=red):# H=0.1

> p2:=pointplot([liste],style=line,color=red):# H=0.5

> p3:=pointplot([liste],style=line,color=red):# H=0.9

> p4:=translate(p1,0,-6):p5:=translate(p3,0,+4):

> display(p2,p4,p5);


chap3__30.pngfigure 3.7 : mouvements browniens fractionnaires ; de bas en haut, H = 0,1 , 0,5 et 0,9

Pour H >1/2, il y a une corrélation positive entre les incréments ;chaque nombre est proche du précédent et la courbe varie lentement ;pour H <1/2, il y a une corrélation négative et la courbe présente de grandes variations ;le cas intermédiaire H = 1/2 correspond au mouvement brownien à une dimension où chaque nombre est indépendant du précédent.

 

début chapitre

Mouvement brownien dans un plan

C'est le mouvement irrégulier d'un grain de poussière dans un rayon de soleil. Ce grain est soumis à des chocs incessants de particules plus petites et invisibles. On le simule en disant qu'à chaque intervalle de temps, la particule part dans une direction arbitraire (entre 0 et $\pi $) en parcourant une distance qui est un nombre gaussien aléatoire. On fait d'abord une suite de 2000 nombres aléatoires gaussiens, et, en partant de l'origine, on fait la liste des positions successives du point, la distance étant prise dans la suite. Cela donne :

> restart:with(plots):with(stats):with(plottools):

> n:=2000:a:=stats[random,normald](n):liste:=0,0:for i to n do

e:=evalf(Pi*rand()/1e12):

liste:=liste,op(nops([liste])-1,[liste])+a[i]*cos(e),

op(nops([liste]),[liste])+a[i]*sin(e) od:

> pointplot([liste],scaling=constrained,style=line);


chap3__32.pngfigure 3.8 : mouvement brownien à 2 dimensions

On recommence le tracé, en ne prenant qu'un point sur 4 :

> p1:=pointplot([seq(op(8*i-1..8*i,[liste]),i=1..nops([liste])/8)],

scaling=constrained,style=line,view=[-32..+2,-30..10]):

> p2:=rectangle([-16,10],[0,-10],thickness=2):

> display(p1,p2);


chap3__33.pngfigure 3.9 : même mouvement avec 1 point sur 4

Agrandissons la partie de la figure à l'intérieur du rectangle correspondant aux 500 premiers points :

>pointplot([seq(op(i,[liste]),i=1..nops([liste])/4)],

scaling=constrained,style=line);


chap3__34.pngfigure 3.10 : agrandissement du rectangle

L'agrandissement par un facteur 2 suivant les 2 dimensions du quart de la figure avec un nombre de points 4 fois plus grand donne une figure qui a le même aspect statistique ;le mouvement brownien à 2 dimensions est autosimilaire ;sa dimension fractale est 2 :il faut multiplier le nombre de points par le carré du facteur d'agrandissement pour retrouver le même aspect statistique.

 

début chapitre

Vol de Lévy

On veut tracer un ensemble d'objets, groupés en paquets, ces paquets étant assez éloignés les uns des autres. On peut simuler ainsi des distributions d'étoiles, ou des distributions de galaxies dans des amas.

Dans le vol de Lévy, la direction entre 2 points successifs est arbitraire, et la distance $x$ satisfait à la loi de probabilité :
MATH

On obtient ainsi une distribution très étalée, la dimension fractale étant D.

Pour simuler les groupements, on va utiliser une méthode différente :la direction entre 2 points successifs étant arbitraire, la distance sera 1 avec une probabilité de 0,9, et de 12, avec une probabilité de 0,1. Cela se fait grace à la commande :

>with(stats):stats[random,empirical[0.9,seq(0,i=1..10),0.1]](20);

1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 12.0, 1.0, 12.0, 12.0, 1.0, 1.0, 1.0,

1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0

La probabilité est de 0,9 pour le nombre 1, de 0 pour les nombres entiers de 2 à11 et de 0,1 pour 12.

On peut dès lors adapter le programme du mouvement brownien à 2 dimensions :

> restart:with(plots):with(stats):

>n:=100:a:=stats[random,empirical[0.90,seq(0,i=1..10),0.1]](n):

> liste:=0,0:for i to n do e:=evalf(2*Pi*rand()/1e12):

liste:=liste,op(nops([liste])-1,[liste])+a[i]*cos(e),

op(nops([liste]),[liste])+a[i]*sin(e) od:

> pointplot([liste],scaling=constrained,symbol=circle);


chap3__37.pngfigure 3.11 : groupements dispersés


 

début chapitre

La percolation

On parle de percolation quand un grand nombre de corpuscules indépendants vient à former un objet unique ;on peut dire encore qu'une collection d'individus acquiert des propriétés collectives, appelées encore propriétés émergentes, que ne possèdent pas les individus. La percolation est un exemple de changement de phase.

Le nom de percolation vient du passage de l'eau à travers la poudre de café. On a entre les grains de poudre des pores qui laissent passer l'eau. Lorsque les pores sont reliés entre eux, ils forment des amas où l'eau peut se déplacer. Si les pores ne sont pas assez nombreux, les amas ne seront pas reliés entre eux et l'eau ne pourra pas passer à travers le café. Pour une certaine valeur du nombre des pores, qui est le seuil de percolation, il existe un amas, l'amas percolant qui relie les frontières supérieure et inférieure du café et l'eau passe. Les pores ont acquis la propriété collective macroscopique de laisser passer l'eau à travers le café.

Feu de forêt

Un exemple classique de parcolation, facile à programmer, est le feu de forêt.

L'hypothèse est que le feu passe d'arbre en arbre lorsque les arbres sont voisins. On conçoit aisément que, lorsque les arbres sont dispersés, le feu ne puisse pas se propager. Par contre, si les arbres sont serrés, la forêt entière va brûler. Entre ces 2 cas, il existe une valeur du taux d'occupation du sol par les arbres (c'est le seuil de percolation) où le feu, sans tout brûler, passe d'un bord de la forêt à l'autre. C'est le seuil de percolation. On va en faire une simulation.

La forêt occupe un réseau carré, les arbres étant disposés au hasard avec une certaine probabilité. Représentons tout d'abord la forêt. A partir d'un générateur donnant un entier au hasard entre 1 et 10, une occupation de 60%, par exemple, sera représentée par un réseau carré où l'on mettra un 3 correspondant à un arbre non brûlé (2 sera un arbre en train de brûler et 1 une souche carbonisée) si le nombre au hasard tombe entre 5 et 10 et 0 dans les autres cas, ce qui donne :

> restart:with(plottools):with(plots):

> n:=32: a:=rand(1..10):

> for i to n do:for j to n do

if a()<5 then A[i,j]:=0 else A[i,j]:=3 fi od od:

> for i from 0 to n+1 do:for j from 0 to n+1 do

A[0,j]:=0:A[i,0]:=0:A[i,n+1]:=0:A[n+1,j]:=0 od od: (le tableau est entouré de 0)

> liste:=op([]):for i to n do:for j to n do

if A[i,j]=3 then p:=rectangle([j-1,i+1],[j,i],color=blue):

liste:=liste,p fi od od:

> display(liste,scaling=constrained);


chap3__38.pngfigure 3.12 : occupation à 60% de la forêt

Le nombre d'arbres et la probabilité d'occupation sont donnés par :

> b:=0: for i to n do:for j to n do if A[i,j]=3 then b:=b+1 fi od od;

> b;evalf(b/32^2);
MATH

Au départ, on met le feu à la première rangée d'arbres inférieure (qui passent de la valeur 3 à la valeur 2).

A chaque unité de temps, chaque arbre qui brûle propage le feu à ses 4 voisins (N,S,E et O) qui passent de 3 à 2 ;chaque arbre qui brûlait se transforme en souche (de 2 à 1). Voyons l'état de la forêt après 30 unités de temps :

> for j to n do if A[1,j]=3 then A[1,j]:=2 fi od: (on met le feu à la rangée inférieure)

> m:=30:for k to m do:

for i to n do:for j to n do C[i,j]:=A[i,j]:od od:

for i to n do:for j to n do

if C[i,j]=2 then A[i,j]:=1 elif C[i,j]=3 and C[i-1,j]=2

or C[i,j]=3 and C[i+1,j]=2 or C[i,j]=3 and C[i,j-1]=2

or C[i,j]=3 and C[i,j+1]=2 then A[i,j]:=2 fi od od od:

(passent de 3 à 2 et de 2 à 1)

> liste:=op([]):for i to n do:for j to n do

if A[i,j]=3 then p:=rectangle([j-1,i+1],[j,i],color=blue):

liste:=liste,p

elif A[i,j]=2 then p:=rectangle([j-1,i+1],[j,i],color=black):

liste:=liste,p

elif A[i,j]=1 then p:=rectangle([j-1,i+1],[j,i],color=yellow):

liste:=liste,p fi: od: od:

(couleur différente pour les arbres à qui l'on met le feu, qui brûlent ou qui sont brûlés)

> display(liste,scaling=constrained);


chap3__40.pngfigure 3.13 : la forêt en train de brûler après 30 unités de temps

Après 120 unités de temps le feu s'est arrêté et la majeure partie de la forêt a brûlé :


chap3__41.pngfigure 3.14 : la forêt après l'incendie

La probabilité choisie est au dessus du seuil de percolation dont la valeur admise est 0,5928. Au dessous de ce seuil, le feu n'atteint généralement pas la rangée supérieure.

Avec une occupation de 0,555, l'incendie ne se propage pas jusqu'en haut ;on est au dessous du seuil de percolation :


chap3__42.pngfigure 3.15 : incendie avec un taux d'occupation de 0,555

La percolation et les changements de phase

Le feu de forêt est un exemple de percolation.

Si l'on place des sites au hasard dans un réseau, ils sont connectés s'ils sont voisins (N, S, E et O). L'ensemble des sites connectés forme un amas. La taille moyenne des amas est reliée à la longueur de corrélation $\xi $ (définie comme la distance moyenne entre deux sites du même amas).

Lorsque la probabilité d'occupation augmente, la longueur de corrélation augmente et pour une certaine valeur qui est le seuil de percolation $p_{c}$ ou point critique dans le langage des transitions de phase, apparait l'amas percolant qui s'étend d'une frontière à l'autre et qui permet donc de passer à travers le réseau. C'est le cas de l'incendie qui s'étend d'un bout à l'autre de la forêt.

Au voisinage du point critique, lorsque la valeur de la variable réduite ou paramètre de contrôle MATH les variables pertinentes du problème obéissent à des lois d'échelle simples qui sont des lois de puissance signant le caractère fractal de la transition.

La longueur de corrélation se comporte au voisinage de la valeur critique comme MATH ($\nu >0$) et tend vers l'infini à la valeur critique. Ceci s'interprète comme un effet coopératif de plus en plus fort ;$\nu $ est l'indice critique associé à la longueur de corrélation.

Dans la phase ordonnée (phase connectée dans la percolation au dessus de $p_{c}$), l'ordre est quantifié par le paramètre d'ordre,qui est nul dans la phase désordonnée et augmente avec p dans la phase ordonnée (pour la percolation, c'est la probabilité d'être dans l'amas infini) ;au voisinage du point critique, il varie comme MATH ($\beta >0$), où $\beta $ est l'indice critique relatif au paramètre d'ordre.

En prenant pour valeurs des indices critiques les valeurs que l'on retrouve dans un grand nombre de modèles à trois dimensions :$\beta =0,33$ et $\nu =0,63,$ on a les courbes théoriques suivantes :

> restart:with(plots):

> p1:=plot(2*epsilon^0.63,epsilon=0..1):

> p2:=plot(abs(epsilon)^(-0.33)/4,epsilon=-1..1,y=0..3):

> p3:=textplot({[-0.6,1,`longueur de corrélation`],[0.7,1,`paramètre d'ordre`]}):

> display(p1,p2,p3);


chap3__56.pngfigure 3.16 : longueur de corrélation et paramètre d'ordre en fonction de $\varepsilon $

Pour la percolation dans un plan, la valeur de $\beta $ est de 0,139 et celle de $\nu $ de 4/3 ;ces valeurs présente un caractère d'universalité en ce sens qu'elles sont communes à toute une classe de phénomènes plan dont le mécanisme profond est le même et qui ne diffèrent que par des détails non pertinents.

La thermodynamique distingue les changements de phase de première espèce, tels que les passages solide-liquide ou liquide-vapeur avec un palier de changement de phase et une discontinuité des dérivées premières de la fonction enthalpie libre, et les changements de phase de deuxième espèce, les plus fréquents, caractérisés par une absence de palier et une discontinuité des dérivées secondes de l'enthalpie libre.

La théorie de la percolation s'applique aux changements de phase de deuxième espèce. Citons les transitions paramagnétique-ferromagnétique au point de Curie, conducteur-supraconducteur, conducteur-isolant, état normal-état superfluide. Même l'univers entier a subi des transitions de phase au cours du refroidissement après le big-bang lors de la séparation de l'interaction unique en interaction forte et électrofaible.

Pour les changements de phase, le paramètre $\varepsilon $ est la température réduite MATH$T_{c}$ désigne la température critique du changement de phase.

Dans le passage para-ferromagnétique, le matériau est constitué de petits aimants élémentaires qui ont tendance à prendre la même orientation que les aimants voisins. On a un antagonisme du type ordre-désordre :à haute température, l'agitation thermique empêche la formation de domaines de même orientation et l'aimantation moyenne est nulle. Lorsque la température baisse, l'interaction à courte portée qui tend à aligner les aimants commence à se faire sentir et des domaines de Curie avec les aimants de même orientation se forment. Ceux-ci deviennent de plus en plus grands avec la baisse de température, mais globalement orientés différemment ;l'aimantation du matériau reste nulle.

Il existe une température, la température de Curie, où l'ordre finit par gagner :un domaine de Curie envahit tout l'échantillon et impose son orientation ;une aimantation globale du matériau apparait dans une direction privilégiée ;il y a brisure spontanée de symétrie. Parmi toutes les orientations possibles, le système, pour une cause précise ou tout simplement par hasard, en a choisi une, privilégiant ainsi une direction.

Dans la phase ordonnée ferromagnétique correspondante, le paramètre d'ordre est l'aimantation. Au dessous du point de Curie, les poches de désordre se résorbent, l'aimantation augmente jusqu'à la valeur de saturation obtenue lorsque tous les aimants élémentaires ont pris la même direction.

La brisure de symétrie est un mécanisme important et fréquent de la physique :lorsqu'existe une seule solution à un problème de symétrie donnée, le principe de Curie enseigne que la solution possède la symétrie du problème, et peut-être plus. Mais si l'on a un problème à solutions multiples, chaque solution individuellement ne va pas respecter la symétrie ;c'est l'ensemble des solutions qui va la respecter.

L'exemple suivant est cité par Weinberg :des convives se retrouvent pour manger autour d'une table ronde ;ils ont devant eux un pain à droite et un pain à gauche ;le premier convive qui touche à un pain impose à tous les convives son choix ;la symétrie a été brisée par le choix initial.

Si l'on appuie verticalement sur une aiguille, elle finit par se tordre dans un plan particulier, rompant ainsi la symétrie de révolution initiale du problème :on a là aussi brisure spontanée de symétrie. Le système devient un système historique qui aurait pu avoir une histoire différente et dont l'évolution ne pouvait pas être prédite.

On voit donc que les fractales jouent un rôle important de transition entre deux phases d'un système dont les propriétés macroscopiques diffèrent par apparition de propriétés émergentes.

Exemple de loi de puissance

Reprenons l'exemple du feu de forêt et plaçons nous au voisinage du seuil de percolation où apparait l'amas percolant. On met le feu à un arbre de l'amas percolant et on étudie le nombre d'arbres brûlés en fonction du temps. Pour faire apparaitre la loi de puissance, il faut faire un tracé log-log en mettant en abcisse le logarithme (décimal ou népérien) du temps et en ordonnée le logarithme du nombre d'arbres brûlés. En effet, si $y=x^{\alpha },$ alors MATH et on obtient une droite en tracé log-log.

On reprend le début du programme du feu de forêt pour tracer la forêt avec un taux d'occupation proche de 60%

> restart:with(plots):

> n:=64: a:=rand(1..100): for i to n do:for j to n do

if a()<62 then A[i,j]:=3 else A[i,j]:=0 fi od od:

> for i from 0 to n+1 do:for j from 0 to n+1 do

> A[0,j]:=0:A[i,0]:=0:A[i,n+1]:=0:A[n+1,j]:=0 od od:

> b:=0: for i to n do:for j to n do

if A[i,j]=3 then b:=b+1 fi od od; b;evalf(b/64^2);
MATH

> A[32,33]:=2; (on met le feu à un arbre de l'amas percolant)

> m:=80:liste1:=op([]):

for k to m do: for i to n do:for j to n do C[i,j]:=A[i,j]:od od:

for i to n do:for j to n do if C[i,j]=2 then A[i,j]:=1

elif C[i,j]=3 and C[i-1,j]=2 or C[i,j]=3 and C[i+1,j]=2

or C[i,j]=3 and C[i,j-1]=2 or C[i,j]=3 and C[i,j+1]=2

then A[i,j]:=2 fi od od:(le feu se propage)

c:=0:for i to n do:for j to n do

if A[i,j]=1 then c:=c+1 fi od od:liste1:=liste1,c od:

(liste1 est la liste donnant le nombre d'arbres brûlés en fonction du temps)

> liste2:=seq([i,liste1[i]],i=1..nops([liste1]));

> p1:=loglogplot([liste2],style=point,labels=[`log(temps)`,

`log(nombre d'arbres brûlés)`]):

> p2:=plot([[log10(5),log10(11)],[log10(60),log10(1133)]],thickness=3):

> evalf((log10(1133)-log10(11))/(log10(60)-log10(5)));
MATH

> display(p1,p2);


chap3__66.pngfigure 3.17 : tracé log-log du nombre d'arbres brûlés en fonction du temps

On constate qu'entre le nombre d'arbres brûlés y et le temps t existe la relation $y=t^{\alpha },$ avec $\alpha =1,86.$

Cette relation n'est pas valable au départ, car interviennent les détails de la stucture locale au voisinage du point de départ du feu. Elle n'est pas valable également lorsqu'on atteint les limites du réseau où il y a saturation.

Une loi de puissance est la signature d'une stucture multiplicatrice fractale. Sur une fractale, toutes les relations sont des lois de puissance ;la relation entre la dimension moyenne de l'amas brûlé et le temps doit être une loi de puissance ainsi que la relation nombre-dimension sur l'amas percolant ;celui-ci a donc une structure fractale.

C'est par ce genre de simulation de Monte-Carlo (faisant intervenir le hasard) que l'on mesure les indices critiques et que l'on vérifie leur universalité. Cette universalité est le signe que la nature emploie un nombre de procédés fondamentaux restreint, qui sont en fait des procédés géométriques.

 

début chapitre

Renormalisation

Les fractales sont caractérisées par leur autosimilarité. La renormalisation est une méthode, mise au point en 1971 par l'américain Kenneth Wilson pour caractériser l'autosimilarité statistique.

Cette méthode consiste à éliminer les détails (le bruit) pour rendre visible la structure macroscopique. Pour cela, on va regarder de plus loin en éliminant les détails locaux.

On part d'un tableau de $243\times 243$ sites que l'on remplit avec une certaine probabilité p.

On va passer de ce tableau à un tableau de super-sites de dimensions $81\times 81,$ chaque super-site étant une moyenne d'un carré $3\times 3$ du premier tableau.

La moyenne se fait de façon naturelle par la règle de la majorité :chaque site occupé comptant pour 1 et un site vide pour 0, on fait la somme du site au centre du carré et des 8 sites qui l'entourent ;si la somme est > 4 (c'est-à-dire 5 et au dessus), on compte 1, sinon 0. Puis on recommence l'opération pour obtenir un tableau $27\times 27,$ puis $9\times 9.$

Pour comparer visuellement ces tableaux, il faut qu'ils aient même dimension ; on ne trace donc qu'une partie $9\times 9$ des 3 premiers tableaux.

> restart:with(plots):with(plottools):

> n:=243:a:=rand(1..10):for i to n do:for j to n do

if a()<5 then A[i,j]:=1 else A[i,j]:=0 fi od od:

> liste:=op([]):for i to n/27 do:for j to n/27 do

if A[i,j]=1 then p:=rectangle([j-1,i+1],[j,i],color=red):

liste:=liste,p fi od od:

> r1:=display(liste,scaling=constrained):

> for k to 3 do:

for i to n do:for j to n do C[i,j]:=A[i,j]:od od:

n:=n/3:for i to n do:for j to n do

A[i,j]:=C[3*i-1,3*j-1]+C[3*i-2,3*j-2]+C[3*i-2,3*j-1]+

C[3*i-2,3*j]+C[3*i-1,3*j-2]+C[3*i-1,3*j]+C[3*i,3*j-2]+

C[3*i,3*j-1]+C[3*i,3*j] :

if A[i,j]>4 then A[i,j]:=1 else A[i,j]:=0 fi od od:

liste:=op([]):for i to n*3^(k-3) do:for j to n*3^(k-3) do

if A[i,j]=1 then p:=rectangle([j-1,i+1],[j,i],color=red):

liste:=liste,p fi od od:

q[k]:=display(liste,scaling=constrained) od:

> r2:=translate(q[1],12,0):

> r3:=translate(q[2],24,0):

> r4:=translate(q[3],36,0):

> display(r1,r2,r3,r4);


chap3__75.pngfigure 3.18 : renormalisation avec 60% d'occupation au départ

On constate que le dernier tableau est enrièrement occupé, montrant par là qu'il y avait une majorité de sites occupés au départ. On recommence avec 40% de sites occupés au départ (faire varier k jusqu'à 2 seulement) :


chap3__76.pngfigure 3.19 : renormalisation avec 40% au départ ; le dernier dessin est vide

Cette fois, le dernier tableau est vide ;les noirs étaient minoritaires au départ. Avec 50%, on obtient :


chap3__77.pngfigure 3.20 : renormalisation avec 50% au départ

Lorsqu'on part avec le même nombre de cases noires et blanches, la règle de la majorité donne statistiquement autant de noires que de blanches, et les dessins sont statistiquement similaires.

Considérons le tableau suivant, occupé avec une probabilité p inconnue :


chap3__79.pngfigure 3.21 : tableau $81\times 81$ occupé avec une probabilité p

Que les noirs ou les blancs dominent n'est pas évident au vu de la figure. Appliquons la méthode de renormalisation :


chap3__80.pngfigure 3.22 : méthode de renormalisation du tabeau précédent

Il est maintenant évident que les noirs dominent (le dessin a été fait avec une probabilité de 0,525 de noirs). On voit là l'intérêt de la méthode qui s'applique à de nombreuses autres situations.

On peut expliquer la renormalisation dans ce cas de la façon suivante : la probabilité p' pour qu'un supersite soit occupé est égale à la probabilité pour que, dans le supersite, il y ait 5, 6, 7, 8 ou 9 sites occupés.

Si p est la probabilité qu'un site soit occupé, la probabilité que les 9 sites soient occupés est $p^{9}.$ La probabilité pour que 8 sites soient occupés, donc 1 site vide dans une des 9 positions possibles est $9p^{8}(1-p)$ et, de façon générale, si n sites sont occupés, MATH le facteur étant le nombre de combinaisons de n sites parmi 9.

Pour que la figure formée par les supersites paraisse similaire, il faut que $p^{\prime }=p,$ soit
MATH

On résout l'équation :

> restart:

> f:=x->x^9+9*x^8*(1-x)+36*x^7*(1-x)^2+

84*x^6*(1-x)^3+126*x^5*(1-x)^4;

> solve({f(x)=x,0<x,x<1},x);
MATH

ce qui nous confirme que le seuil de percolation est bien de 0,5. L'effet de la renormalisation se voit facilement sur la figure ci-dessous :partant d'une probabilité initiale, la probabilité à la première itération se voit sur la courbe à la verticale du point initial ;on ramène ce point sur la bissectrice pour en faire le nouveau point de départ et on recommence l'opération 10 fois :

> x:=0.4:y:=f(x):s:=[x,0]:

n:=10:for i to n do s:=s,[x,y],[y,y]:x:=y:y:=f(x) od:

> x:=0.6:y:=f(x):t:=[x,0]:

n:=10: for i to n do t:=t,[x,y],[y,y]:x:=y:y:=f(x) od:

> plot({f,x->x,[s],[t]},0..1,color=red);


chap3__87.png3.23 : itération graphique de la renormalisation

Pour une probabilité de départ de 0,4, inférieure au seuil de percolation, la probabilité d'occupation tend rapidement vers 0, c'est-à-dire vers un quadrillage vide. Pour 0,6, elle va rapidement à 1, c'est-à-dire un quadrillage plein. La valeur 0,5 est un point fixe de la transformation et la figure est autosimilaire.

 

début chapitre

Agrégation balistique

L'agrégation consiste à former des structures macroscopiques à partir de particules ou d'agrégats plus petits.

Le processus est de type particule-amas si les particules viennent se coller sur l'amas et le font grossir ;il est de type amas-amas si l'agrégation se fait entre amas de taille voisine.

On distingue l'agrégation balistique, où la particule évolue librement suivant une droite dans l'espace et se colle sur l'amas dès qu'il y a rencontre, l'agrégation limitée par diffusion (DLA) où les particules, avant de se coller, étaient soumises à un mouvement brownien au hasard et enfin l'agrégation par réaction où les particules sont immobiles et la propriété d'être sur l'amas se fait par contact, comme une épidémie ou un feu qui se propagent.

Voyons de plus près l'agrégation balistique.

Dans un premier modèle, on place au hasard des particules initiales sur un segment ;des particules tombent verticalement de façon aléatoire et se collent dès leur rencontre avec une particule (N, S, E et O).

> restart:with(plots):with(plottools):

> n:=40:m:=100:A:=array(1..n,1..m):(n hauteur, m longueur)

> for i to n do:for j to m do: A[i,j]:=0:od od:

> a:=rand(1..2):for j from 2 to m-1 do b:=a():

if b=1 then A[1,j]:=1 fi od:(on forme la première ligne au hasard 1sur 2)

> a:=rand(2..m-1):for k to 1000 do b:=a():liste:=0:

for i to n-2 while liste=0 do if A[n-i-1,b]=1 or A[n-i,b-1]=1

or A[n-i,b+1]=1 then A[n-i,b]:=1 fi: liste:=liste+A[n-i,b] od od:(les 1000 particules parties du haut suivant la verticale se collent et s'arrêtent dès qu'elles rencontrent une particule déjà fixée)

> liste:=[]:for j to m do: for i to n do:

if A[i,j]=1 then p:=rectangle([j-1,i+1],[j,i],color=red):

liste:=liste,p fi od od:

> display(liste,scaling=constrained,view=[0..m,0..n+1]); (chaque particule est représentée par un carré)


chap3__88.pngfigure 3.24 : déposition balistique avec une rangée au départ

Si l'on part avec uniquement 3 particules dans la première rangée, on obtient un paysage arborescent :


chap3__89.pngfigure 3.25 : déposition balistique sous forme arborescente

On peut partir d'une particule au centre et lancer les particules au hasard du haut ou du bas :

> restart: with(plots):with(plottools):

> n:=60:m:=60:A:=array(1..n,1..m):

> for i to n do:for j to m do: A[i,j]:=0:od od:

> A[30,30]:=1:

> a:=rand(2..m-1):b:=rand(1..2):for k to 200 do c:=b():d:=a():

liste:=0: if c=1 then

for i to n-2 while liste=0 do:if A[n-i-1,d]=1 or A[n-i,d-1]=1

or A[n-i,d+1]=1 then A[n-i,d]:=1:liste:=liste+A[n-i,d] fi od

else for i to n-1 while liste=0 do:if A[i+1,d]=1 or A[i,d-1]=1

or A[i,d+1]=1 then A[i,d]:=1 :liste:=liste+A[i,d] fi od fi od:

> liste:=[]:for j to m do: for i to n do:

if A[i,j]=1 then p:=rectangle([j-1,i+1],[j,i],color=red):

liste:=liste,p fi od od:

> display(liste,scaling=constrained,view=[0..m,0..n+1]);


chap3__90.pngfigure 3.26 : déposition balistique sur une particule au centre en partant d'en haut et d'en bas


 

début chapitre

Agrégation limitée par diffusion (DLA)

On place au départ une molécule-cible au centre du réseau. On envoie une par une des particules partant d'un site pris au hasard sur les bords du réseau, et ces particules passent à chaque unité de temps d'un site à un site voisin choisi au hasard parmi les 4 sites connectés (N, S, E et O). Dès que la molécule touche une autre molécule, elle s'y colle.

> restart:with(plots):with(plottools):

> n:=10:s:=rand(1..4):t:=rand(-n..n):

> for l from -(n+1) to n+1 do:for m from -(n+1) to n+1 do

A[l,m]:=0 od od:A[0,0]:=1: (on forme le réseau et on place la cible au centre)

> for h to 10 do s1:=s():t1:=t():

if s1=1 then A[-n,t1]:=1:i:=-n:j:=t1

elif s1=2 then A[n,t1]:=1:i:=n:j:=t1:

elif s1=3 then A[t1,-n]:=1:i:=t1:j:=-n:

else A[t1,n]:=1:i:=t1:j:=n: fi: (particule prise au hasard sur les bords du réseau)

for k do s1:=s():

if A[i+1,j]+A[i-1,j]+A[i,j-1]+A[i,j+1]>=1 then break (la particule se colle)

elif s1=1 and j<>-n then A[i,j]:=0:j:=j-1:A[i,j]:=1

elif s1=2 and j<>n then A[i,j]:=0:j:=j+1:A[i,j]:=1

elif s1=3 and i<>-n then A[i,j]:=0:i:=i-1:A[i,j]:=1

elif s1=4 and i<>n then A[i,j]:=0:i:=i+1:A[i,j]:=1 fi od od: (se déplace sur un site voisin au hasard)

> liste:=op([]):for l from -n to n do:for m from -n to n do

if A[l,m]=1 then p:=rectangle([m-1,l+1],[m,l],color=red):

liste:=liste,p fi od od: (transforme la particule en carré)

> display(liste,view=[-(n+1)..n+1,-(n+1)..n+1],

scaling=constrained);


chap3__91.pngfigure 3.27 : agrégation par le mécanisme DLA

Pour que le temps d'obtention de la figure ne soit pas trop long, il est judicieux de commencer par un réseau de petite dimension et de l'augmenter au fur et à mesure que l'amas se rapproche des bords ;il faut pour cela reproduire le réseau à l'intérieur d'un réseau plus grand, ce que l'on peut faire en ajoutant avant le calcul de la particule issue du bord :

> p:=15:for l from -(p+1) to p+1 do:for m from -(p+1) to p+1 do

B[l,m]:=0 od od:

> for l from -(n+1) to n+1 do:for m from -(n+1) to n+1 do

B[l,m]:=A[l,m] od od:

> for l from -(p+1) to p+1 do:for m from -(p+1) to p+1 do

A[l,m]:=B[l,m] od od:n:=p:

Le mécanisme DLA d'une particule qui se déplace au hasard et se colle au premier contact avec l'amas mène à une structure dendritique avec des ''fjords'' sur plusieurs échelles de dimension. Une particule qui se déplace au hasard va venir se coller de préférence aux extrémités et ne pourra pas pénétrer très profondément dans les fjords. On retrouve l'effet de pointe du champ électrique dont l'intensité est plus importante au voisinage d'une pointe. Cette correspondance entre la croissance fractale DLA et la théorie du potentiel électrique satisfaisant à l'équation de Laplace est à l'origine du nom de fractales laplaciennes donné aux fractales DLA que l'on obtient par dépot électrolytique, injection d'un fluide, décharges électriques et bien d'autres phénomènes.

On peut chercher la dimension fractale de l'amas obtenu par simulation.

Pour cela, on cherche le nombre de particules de l'amas contenu dans un rayon donné et on trace un diagramme $\log -\log $ du logarithme du nombre de particules compté en fonction du logarithme du rayon. Si la figure obtenue est une droite d'équation MATH, alors $N=cR^{\alpha }$ et $\alpha $ est la dimension fractale (dimension de masse). $R$ ne doit pas être trop petit, car le nombre de particules dépend des détails locaux à l'origine, ni trop grand pour que le nombre de particules ne change plus par apport ultérieur. Prenons l'exemple précédent où l'on a augmenté le nombre de particules de l'amas :

> liste1:=op([]):for h from 3 to 10 do

b:=0:for l from -n to n do:for m from -n to n do:

if (l^2+m^2)^0.5<2*h and A[l,m]=1 then b:=b+1: fi od od :(on compte le nombre de particules dans le cercle de rayon 2h)

> liste1:=liste1,2*h,b od:liste1;

6, 43 ; 8, 71 ; 10, 104 ; 12, 138 ; 14, 178 ; 16, 220 ; 18, 269 ; 20, 326 (liste des rayons et des nombres de particules)

> p1:=loglogplot([liste1],style=point,symbol=circle):

> p2:=pointplot([log10(6),log10(43),log10(20),log10(326)],

style=line,thickness=2):

> p3:=textplot({[log10(10),log10(50),`log(rayon)`],

[log10(8),log10(300),`log(nombre de points)`]}):

> display(p1,p2,p3);


chap3__98.pngfigure 3.28 : tracé $\log -\log $ du nombre de particules de l'amas en fonction du rayon

On en tire la dimension fractale de l'amas :

> evalf((log10(326)-log10(43))/(log10(20)-log10(6)));
MATH

Cette valeur est proche de la valeur 1,7 donnée dans la littérature.

On peut également simuler une croissance de type arborescent en plaçant au départ quelques particules au sol sur la première rangée. Le programme est similaire à la croissance DLA à partir du centre, mais ici, la largeur du réseau reste fixe et c'est la hauteur que l'on fait varier au fur et à mesure de la croissance de la dendrite :

> restart:with(plots):with(plottools):

> n:=20:p:=5:t:=rand(-n..n):s:=rand(1..4):

> for l from 0 to p+1 do:for m from -(n+1) to n+1 do

A[l,m]:=0 od od:A[1,-4]:=1:A[1,4]:=1:

> for h to 10 do

t1:=t():A[p,t1]:=1:i:=p:j:=t1:

for k do s1:=s():

if A[i+1,j]+A[i-1,j]+A[i,j-1]+A[i,j+1]>=1 then break

elif s1=1 and j<>-n then A[i,j]:=0:j:=j-1:A[i,j]:=1

elif s1=2 and j<>n then A[i,j]:=0:j:=j+1:A[i,j]:=1

elif s1=3 and i<>1 then A[i,j]:=0:i:=i-1:A[i,j]:=1

elif s1=4 and i<>p then A[i,j]:=0:i:=i+1:A[i,j]:=1 fi od od:

> liste:=op([]):for l to p do:for m from -n to n do

if A[l,m]=1 then q:=rectangle([m-1,l+1],[m,l],color=red):

liste:=liste,q fi od od:

> display(liste,scaling=constrained,view=[-n..n,1..p+1]);

Lorsque l'on change la hauteur, il faut intercaler la commande suivante :

q:=80:for l from 0 to q+1 do:for m from -(n+1) to n+1 do

B[l,m]:=0 od od:

for l from 0 to p+1 do:for m from -(n+1) to n+1 do

B[l,m]:=A[l,m] od od:

for l from 0 to q+1 do:for m from -(n+1) to n+1 do

A[l,m]:=B[l,m] od od:p:=q:

On obtient la figure suivante :


chap3__100.pngfigure 3.29 : croissance dendritique arborescente


 

début chapitre

Croissance de l'amas d'Eden

Le modèle d'Eden simule la prolifération des cellules malades par contamination aux cellules voisines connectées (N, S, E et O), appelées sites de croissance. On part d'une cellule malade, qui est le graine, et, à chaque intervalle de temps, un seul site de croissance est contaminé.

Cela donne un amas compact avec seulement quelques trous, mais à la surface assez tourmentée :

> restart:with(linalg):with(plots):with(plottools):

> n:=5: for i from -(n+1) to n+1 do:for j from -(n+1) to n+1 do:

A[i,j]:=0:od od:A[0,0]:=1: (on fixe une cellule malade à l'origine)

> for k to 100 do:liste:=op([]):

for i from -n to n do : for j from -n to n do :

if A[i,j] = 1 and A[i-1,j]=0 then liste:=liste,[i-1,j] fi:

if A[i,j] = 1 and A[i+1,j]=0 then liste:=liste,[i+1,j] fi:

if A[i,j] = 1 and A[i,j-1]=0 then liste:=liste,[i,j-1] fi:

if A[i,j] = 1 and A[i,j+1]=0 then liste:=liste,[i,j+1] fi od od:

liste1:={liste}:a:=rand(1..nops(liste1)): (liste des sites de croissance comptés une seule fois)

b:=a():A[liste1[b][]]:=1 od: (un parmi les sites de croissance est contaminé)

> liste2:=[]:for j from -n to n do: for i from -n to n do:

if A[i,j]=1 then q:=rectangle([j-1,i+1],[j,i],color=red):

liste2:=liste2,q fi od od:

> display(liste2,scaling=constrained,view=[-n..n,-n..n]);


chap3__101.pngfigure 3.30 : amas d'Eden

Comme pour les sites DLA, pour obtenir la figure en un temps raisonnable, on augmente progressivement la taille du réseau, en intercalant avant l'établissement de la liste des sites de croissance l'instruction suivante (p est variable) :

> p:=10:for l from -(p+1) to p+1 do:for m from -(p+1) to p+1 do

C[l,m]:=0 od od:

> for l from -(n+1) to n+1 do:for m from -(n+1) to n+1 do

C[l,m]:=A[l,m] od od:

> for l from -(p+1) to p+1 do:for m from -(p+1) to p+1 do

A[l,m]:=C[l,m] od od:n:=p:

On peut aussi tracer les sites de croissance qui représentent le front de l'épidémie :

> liste3:=op([]):for i to nops(liste1) do

p:=rectangle([op(2,op(i,liste1))-1,op(1,op(i,liste1))+1],

[op(2,op(i,liste1)),op(1,op(i,liste1))],color=red):

liste3:=liste3,p od:

> display(liste3,scaling=constrained,view=[-n..n,-n..n]);


chap3__102.pngfigure 3.31 : front de l'épidémie

début chapitre

retour index