[Scilab] Simulation d'une marche aléatoire 2D

Bonjour.

On considère une suite $A_n$ de sous-ensembles de $\mathbb{Z}^2$ qui croît selon la règle suivante : à l'étape n, une particule est lancée à l'origine et se déplace jusqu'à ce qu'elle sorte de $A_n$ par un point X. Elle se déplace suivant une marche aléatoire simple : soit au Nord, au Sud, à l'Est ou à l'Ouest avec une probabilité 1/4.
On commence avec $A_1 = \{(0,0)\}$. On note $A_{n+1} = A_n \cup X$.

Pour être plus clair, à l'étape 1, la particule se promène dans $A_1 = \{(0,0)\}$.
- Si elle sort de $A_1$ par le point (0,1) (Nord), alors $A_2 = \{(0,0),(0,1)\}$.
- Si elle sort de $A_1$ par le point (0,-1) (Sud), alors $A2 = \{(0,0),(0,-1)\}$.
- Si elle sort de $A_1$ par le point (1,0) (Est), alors $A_2 = \{(0,0),(1,0)\}$.
- Si elle sort de $A_1$ par le point (-1,0) (Ouest), alors $A_2 = \{(0,0),(-1,0)\}$.

Ensuite la particule se promène dans l'un des ensembles $A_2$, puis en sort, etc.

On cherche à représenter graphiquement $A_n$ pour n = 10, 1000, 10000...
Lorsque n est grand, la forme limite de $A_n$ est censée être un "rond". Voici un exemple de $A_{1000}$ :
1494766702-a1000-en-dimension-2.png

J'ai codé quelque chose, mais ça fait n'importe quoi. Les résultats sont faux.
Personnellement, j'ai compris qu'il y avait à chaque étape 4 directions possibles, et comme la particule est lancée à l'origine, elle se déplace uniquement sur les axes abscisses ou ordonnées. Ce qui explique les résultats un poil étranges. Je vous le mets quand même.
function y=croissZ2(n)
A0=[0 0]
B0=[0 0]
i=1;j=1
while (i+j)<n
e=2*rand()-1
f=2*rand()-1
if ((e<0) & (f<0))
A0=[[(A0(1,1)-1),0];A0];
i=i+1
elseif ((e<0) & (f>0))
A0=[A0;[(A0(i,1)+1),0]];
i=i+1
elseif ((e>0) & (f<0))
B0=[[0,(B0(1,2)-1)];B0];
j=j+1
else
B0=[B0;[0,(B0(j,2)+1)]];
j=j+1
end

end
y=[A0;B0]
plot2d(y)
endfunction

disp(croissZ2(1000))
Sauf que je crois comprendre qu'en fait, la particule n'a pas uniquement 4 directions...
Si la particule est dans $A_2 = \{(0,0),(0,1)\}$, elle peut sortir par les points (-1,0), (0,-1), (1,0), (0,2) (Nord, Sud, Ouest, Est à partir de l'origine) ou (1,1) ou (-1,1)... Il y a donc 6 directions possibles avec probabilités différentes (car elle est lancée à l'origine).

Sincèrement, comment coder ça ? Je ne vois pas du tout... Si quelqu'un pouvait me donner un petit coup de main, ce serait vraiment top... Merci d'avance.
«1

Réponses

  • Déjà, on ne voit nulle part où tu testes la sortie de $A_n$. De plus, tes A0 et B0 ont toujours l'air de contenir une composante nulle, ce qui n'est probablement pas ce qui est souhaité, mais qui explique les tracés que tu obtiens.
  • Oui c'est ça, j'ai cru comprendre au départ que la particule se déplaçait uniquement sur les axes...

    Mais du coup, les probabilités de se déplacer sur les axes restent plus fortes, non (car la particule est lancée à l'origine à chaque étape) ? Et c'est ça qui me pose problème, je ne vois pas comment coder le modèle avec des probabilités différentes et un nombre de directions qui augmente à chaque étape... Il doit y avoir une méthode plus simple, je dois me prendre la tête inutilement, mais là je ne vois pas... :/
  • Non, il n'y a bien que quatre directions de déplacement à chaque étape, qui sont effectivement parallèles aux axes. Ce n'est pas pour cela que la particule elle-même reste sur les axes : si tu commence à aller un coup à droite, puis un coup vers le haut, ça y est, tu n'es plus sur les axes.
  • @remarque Il teste la sortie dans le while : i et j sont les indices et donc lorsque (i+j)=n on a bien effectué n mouvements (mais en fait ce n'est pas ce qu'on cherche).

    @Bus :
    - pour commencer tu pourrais tirer un seul nombre au hasard, entre 1 et 4, et assigner arbitrairement par ex nord = 1, est = 2, etc.
    - cf. la réponse à remarque, pourquoi ne pas utiliser un compteur plus simple pour vérifier que tu as bien fait exactement n étapes ?
    - ensuite je te conseillerais de ne pas forcément respecter le formalisme des $A_n$ et de commencer par coder n tirages de façon propre
    - explique mieux à quoi te servent A0 et B0 car je ne pense pas que tu y stockes ce que tu penses y stocker...
    - si je lis bien le sujet, il ne faut créer $A_{n+1}$ que lorsque la particule sort de $A_n$ : il faut donc à chaque étape tester pour savoir si tu es toujours dans $A_n$ ou si tu passes à $A_{n+1}$. Du coup la particule ne se déplace toujours que dans les 4 directions, en revanche elle peut sortir par n'importe quel point du bord de $A_n$, et clairement il y a de plus en plus de points par lesquels elle peut sortir. Tu verras alors que les coordonnées du point actuel, et le nombre de fois où elles ont changé depuis le début de l'expérience, n'a rien à voir avec $n$.
  • Je ne parle pas de la sortie de la boucle, je parle de la sortie de $A_n$. Ceci dit, ce n'est pas forcément utile pour faire du graphisme, on peut stocker une liste de points redondante et les tracer tous sans se prendre la tête.
  • Ceci dit, il y a un truc : on semble juste la marche aléatoire et non pas quelque chose de vaguement disquoïde. Je me demande si Bus nous a vraiment tout dit... ou alors, je n'ai pas compris ce que sont ces $A_n$.63580
  • @remarque : cette représentation est bizarre, il n'y a pas de raison particulière pour que le chemin se décale autant vers l'est/le sud.

    Et de ce que j'ai compris de la formation des $A_n$, on n'incrémente $n$ que la particule atteint un point par lequel elle n'est pas déjà passé. Cela permet de cartographier tous les points parcourus, et on s'arrête quand la particule a parcouru exactement $n$ points distincts.
  • Non, elle n'est pas bizarre, c'est une réalisation parmi d'autres.

    Pour le reste, en quoi le dessin obtenu peut-il être différent qu'un mouvement comme celui que j'ai posté plus haut ? J'ai du mal à voir pourquoi la façon d'incrémenter $n$ produirait un disque.
  • Hello,

    Cela me fait penser au Rotor ou ``fourmis directionnelles qui calculent $\pi$'' (vu chez Jean-Paul Delahaye). Mais je n'arrive pas à retrouver sur le web le papier que j'ai sous les yeux. J'ai juste trouvé http://www.lifl.fr/~jdelahay/pls/2005/129.

    Mais peut-être que cela n'a pas de rapport ? En fait, je n'ai pas compris ce que sont les $A_n$ dans le premier post.
  • Merci pour vos conseils !

    Du coup la particule sort de $A_n$ par n'importe quel point qui le borde, avec la même probabilité pour chacun d'entre eux ? Comme il est dit dans l'énoncé "à chaque étape, la particule est lancée à l'origine", je me posais la question...

    Sinon voici le lien sur lequel j'ai trouvé que $A_n$ avait une forme de "cercle" (avant-dernière et dernière pages) :
    https://perso.univ-rennes1.fr/florent.malrieu/AGREG/TEXTES/ald.pdf
  • J'ai également du mal à voir ce que sont les $A_n$... Et comment $A_n$ peut avoir une forme de cercle quand n est grand... :/
  • Ah oui ! Ca n'a rien à voir ! Il faut repartir de $(0,0)$ à chaque fois et s'arrêter quand on arrive à un point non visité lors des réalisations antérieures... bon, pas le temps de voir ça maintenant.63582
  • @Bus : il n'y a pas de question à se poser sur la probabilité que la particule sorte à un point ou un autre, elle sort ou pas, un point c'est tout.

    Pour expliciter :
    - étape 1 : la particule est à l'origine, dès le premier mouvement elle sort de $A_1$ par un des 4 points possibles, on rajoute ce point à $A_1$ pour créer $A_2$
    - étape 2 : on remet la particule à l'origine. Après le premier mouvement soit elle a fait le même mouvement qu'à l'étape 1, elle est toujours dans $A_2$, on regarde son prochain mouvement, c'est forcément un point "nouveau" qu'on ajoute à $A_2$ pour créer $A_3$ ; soit elle a fait un mouvement différent et on le rajoute directement à $A_2$ pour passer à $A_3$

    [...]

    - étape n : il y a maintenant n points dans $A_n$. On remet la particule à l'origine, et on regarde le premier point qu'elle atteint qui ne soit pas dans $A_n$, on ajoute ce point à $A_n$ pour obtenir $A_{n+1}$ et on peut passer à l'étape suivante.
  • C'est plus rigolo en 3d.63590
  • @remarque
    Vu. J'attache ce avec quoi j'avais confondu. Et des fourmis en dimension 3 ?
  • Bonjour,

    On fait $N=4000$ lancers. Pour cet essai-là, cela sort $3927$ fois, soit $73$ tournent en rond au lieu de sortir.
    Le rayon du cercle témoin est $\sqrt{3927/\pi}$
    Lorsque l'on veut augmenter $N$, se pose la question de pourquoi coupe-t-on le lancer n°$n$ lorsque $t=n$. Pourquoi couper lorsque $n$ augmente est assez clair. Mais on pourrait aussi commencer à couper à partir d'un certain $n$ (disons n=100), et utiliser alors une coupure plus franche au delà, disons $t<0.8 n$ ou même $t<0.5 n$ par exemple. Opinion sous-jacente: "lorsque cela a tourné un certain temps, les directions deviennent équiprobables".

    D'un autre côté, "on ne saurait exclure" que l'analyse théorique soit plus facile si l'on ne coupe pas du tout !

    Histogramme en pink: $N/3<n<2N/3$, en darkblue: $2N/3<n<N$. La valeur listée en abscisse est $t/n$, c'est à dire la date de sortie (sachant qu'il y a eu une sortie) divisée par $n$.

    Cordialement, Pierre.63600
    63602
  • Ah oui, avec la sphère enveloppante, bon plan graphique !63604
  • Ah, et puis tiens, j'en ai eu marre de la 3d pourrie de scilab cette fois-ci et j'en ai refait une à moi à la main. Il n'y a quand même pas d'élimination des parties cachées, donc ce n'est pas parfait non plus...63686
  • Qui sait facilement retrouver l'équation d'une marche aléatoire 3D, 2D, 1D, certaine ?
    32fdeea59d4ca4296c4e4339145b37bd.gif

    0.gif

    gif-animate-bianco-nero-corpi-donne-ombre-adam-pizurny-3.gif

    dilbert.gif
  • Bonjour, merci pour vos explications ! Du coup j'ai bien compris ce que le programme devait faire ! J'essaie de coder depuis hier, mais je rencontre deux petits problèmes :

    Le premier, c'est que j'ai l'impression que la liste qui sort n'est pas la bonne (si vous ne comprenez pas le code, je peux l'expliquer)...



    Le deuxième, c'est que je n'arrive pas à faire le graphique...
    C'est en effet un peu délicat de faire un graphique à partir d'une liste de listes... La commande "plot2d" ne donne pas le résultat de ce que l'on cherche à obtenir (vous pouvez voir que mon graphique n'a rien d'un cercle !)... J'aimerais savoir comment obtenir un résultat comme sur le deuxième graphique posté par remarque ? A moins que cela vienne de mon erreur précédente ?
  • En première lecture, le programme semble fonctionner correctement. Que trouves-tu de bizarre à cette liste ?

    Concernant plot2d, voici la page de documentation : https://help.scilab.org/docs/5.3.0/fr_FR/plot2d.html

    Cette fonction ne prend pas les arguments du nuages de points de la façon dont tu lui procures. Peux-tu nous mettre ce que tu obtiens comme graphique ?
  • C'est surtout le graphique qui me fait penser que j'ai fait une erreur quelque part ! En voici un exemple (pour $A_{100}$) :

    img-4921542ced.png?v=1

    Mais du coup, quels arguments faudrait-il entrer après "plot2d" ? Je vais regarder le lien !
  • Un problème :
                if e==1 then
                    k=[k(1),[color=#FF0000]k(2)+1[/color]]
               elseif e==2
                    k=[k(1)+1,k(2)]
                elseif e==3
                    k=[k(1),[color=#FF0000]k(2)+1[/color]]
    
    

    l'ordonnée ne peut que monter. Ton nuage de points est décalé vers le haut et pas circulaire.*

    Pour le tracer avec des petits ronds :
    plot2d(A1(:,1),A1(:,2),style=-9,frameflag=4)
    

    * edit : d'ailleurs, les résultats que tu donnes montrent des ordonnées qui peuvent diminuer, ils ne peuvent pas correspondre au code que tu as posté.
  • Merci beaucoup, du coup j'ai bien trouvé une forme circulaire !

    Et j'ai une deuxième petite question, comment arrive-t-on à faire apparaître le cercle enveloppant niveau code ?
  • * edit : d'ailleurs, les résultats que tu donnes montrent des ordonnées qui peuvent diminuer, ils ne peuvent pas correspondre au code que tu as posté.

    ---

    J'ai été un peu trop vite, j'ai copié mon code avant d'avoir corrigé l'erreur, et j'ai copié les résultats après l'avoir corrigée...
  • Pour tracer le cercle (ici en rouge) :
    t=linspace(0,2*%pi,200)
    R=sqrt(N/%pi)
    plot2d(R*cos(t),R*sin(t),style=5,frameflag=4)
    
  • Plus généralement, pour ce qui est du graphisme dans scilab, je recommande ce document : Réaliser des graphiques avec scilab, de Philippe Roux.
  • Une animation intéressante pour le problème initial est de montrer comment les ensembles $A_n$ se remplissent au fur et à mesure.63714
  • A propos de ce modèle, on peut signaler que ce sont ces gens-là :

    Lawler, G., Bramson, M., & Griffeath, D. (1992). Internal Diffusion Limited Aggregation. The Annals of Probability, 20(4), 2117-2140.

    qui ont démontré que la forme limite est un disque.
  • Et sur un réseau hexagonal, c'est aussi sûrement un disque ?63720
  • @remarque : j'aimerais bien savoir comment tu crées ces animations !
  • @Remarque : le contraire serait surprenant. Cela dit, la preuve originale de Lawler & Cie utilise des estimées très fines sur la marche dans Z^2, ça doit pas être si facile à généraliser. Mais depuis on a peut-être fait mieux.
  • remarque écrivait : http://www.les-mathematiques.net/phorum/read.php?15,1466310,1468458#msg-1468458
    [Inutile de recopier un message présent sur le forum. Un lien suffit. AD]

    Merci ! Je vais y jeter un coup d'œil !
  • @Lucas : excellent ! Tu sais maintenant quel sera ton prochain papier ! :-D

    @roumegaire : le plus simplement du monde, image par image. Dans une boucle entre un drawlater et un drawnow (pour que l'affichage en direct soit plaisant) et en enregistrant chaque image. Ce qui marche le mieux pour moi est l'enregistrement en png. Si la boucle est indexée par un entier i, je fais
    xs2png(0,'chemindacces/nom'+string(i)+'.png')
    
    si on veut enregistrer la fenêtre 0.* Ensuite, n'importe quel outil de manipulation de fichiers graphiques pour transformer cette suite d'images en gif animé. J'utilise GraphicConverter sur Mac. En fait, la difficulté est plutôt de prévoir à l'avance la taille et le nombre des images pour rester sous la limite de 4,88Mo par fichier imposée par le site, et aussi pour faire en sorte que l'animation ne soit pas trop grande, sinon il faut cliquer dessus pour la voir... C'est un peu pifométrique quand on a un écran à haute résolution qui crée naturellement des images trop grandes à la basse résolution du site. Exemple, l'animation ci-dessous est au format timbre-poste dans scilab avant exportation.

    * Edit : le xs2png doit être après le drawnow sinon la première image enregistrée n'est probablement pas la bonne...63730
  • @remarque : merci beaucoup, je n'avais même pas pensé que ce langage puisse permettre de sauvegarder une image directement. Il va vraiment falloir que j'explore tous ces outils.
  • Remarque a écrit:
    @Lucas : excellent ! Tu sais maintenant quel sera ton prochain papier ! :-D

    Bof tu sais moi si c'est pour raffiner un résultat de Lawler ça ne m'excite pas ;-)
  • Ah, je comprends. Mais en même temps (comme dirait je ne sais plus qui), il va bien falloir que quelqu'un s'y colle, et ça ne sera certainement pas moi !
  • Re-bonjour,

    Dans la suite, on me demande de simuler les valeurs $e_O = \max_{x \in A_n} ||x|| - \sqrt{n/\pi}$ et $e_I = \min_{x \notin A_n} ||x|| - \sqrt{n / \pi}$ lorsque $n$ est grand.

    Du coup, je suppose que $e_O$ est le plus grand cercle inclus dans $A_n$ (celui que remarque a dessiné en rouge plus haut), et $e_I$ le plus petit cercle contenant $A_n$ (donc dans $A_n^c$ (?)). Quelqu'un pourrait me le confirmer, j'ai un petit doute ?
    (Mais bon, comme il est question de "valeurs", pas convaincu que ce soit les cercles qu'on me demande de simuler, mais plutôt une question de nombre de points...)
  • Non, j'ai tracé le cercle de rayon $\sqrt{n/\pi}$ qui doit en gros contenir $A_n$. On te demande la différence du rayon du plus grand disque contenant $A_n$ avec ce rayon moyen et la différence du plus petit disque dont le complémentaire ne contient un point du complémentaire de $A_n$ avec ce même rayon. Donc, c'est très facile à calculer, mais j'imagine qu'il faut faire de nombreuses réalisations pour avoir quelque chose de pertinent. Du coup, l'efficacité du code va peut-être commencer à jouer.
  • Ah, merci, ça parait plus logique en effet... J'essaie de me lancer !
  • Une réalisation des trois cercles.63808
  • Donc le plus grand cercle contient tous les points de $A_n$, et le plus petit ne contient aucun point de $A_n^c$.

    J'ai une question, comme le cercle (ici rouge) doit contenir $A_n$, comment cela se fait-il que certains points en sortent ? C'est sûrement une question complètement con mais j'aimerais comprendre !
  • Le cercle rouge est plutôt celui de rayon $\sqrt{n/\pi}$ (qui est censé contenir $A_n$, comme tu le disais précédemment), le vert est le plus petit contenant $A_n$ et le bleu le plus grand inclus dans $A_n$.
  • Oui, c'est exactement ça. Il est censé contenir $A_n$, mais seulement en gros... ;-) Ça ne peut arriver (qu'il le contienne) qu'avec une très faible probabilité à vue de nez.63924
  • Merci ! :)

    Et j'ai une dernière question (promis c'est vraiment la dernière :D), à propos de ce même modèle mais cette fois-ci, en dimension 1 (donc ça semble plus facile). J'ai hésité à recréer un topic, mais bon.
    Donc la suite $A_n$ de sous-ensembles de $\mathbb{Z}$ croît selon cette règle : à l'étape n, une particule est lancée à l'origine et se déplace suivant une marche aléatoire simple : à gauche avec probabilité $1/2$, à droite avec probabilité $1/2$. Donc sur un axe horizontale. Ici, on commence avec $A_1 = \{0\}$.

    On nous demande de simuler ce résultat jusqu'à l'étape 1000, ici c'est OK.

    Ensuite, on écrit $A_n = \{G_n, ..., D_n\}$ où $G_n$ et $D_n$ sont respectivement les points les plus à gauche et à droite. On pose $Z_n = D_n + G_n$.
    On nous demande de simuler le comportement de $G_n$, de $D_n$ (ici j'ai fait un graphique), puis de l'évolution des valeurs $p_n = \dfrac{n+2-Z_n}{2(n+2)}$. Ici, pas de souci particulier non plus.

    Un exemple serait $A_1 = \{0\}$, $A_2 = \{0,1\}$, $A_3 = \{-1,0,1\}$, $A_4 = \{-1,0,1,2\}$, etc. Et donc $G_1 = D_1 = 0$, $G_2 = 0$, $D_2 = 1$, $G_3 = -1$, $D_3 = 1$, etc, dans ce cas précis...

    (Je peux vous montrer mes différents codes si vous voulez)

    Mais ensuite, on nous demande de représenter graphiquement (à l'aide d'un histogramme) une estimée de la loi de $\dfrac{Z_{1000}}{\sqrt{1000}}$, et de déterminer les positions asymptotiques de $D_n$ et $G_n$... Ici je bloque un peu, je ne vois pas trop comment on pourrait estimer la loi $\dfrac{Z_{1000}}{\sqrt{1000}}$... Avez-vous une idée ?
  • J'imagine que tu peux faire des répétitions (et un histogramme). Avec un peu de chance l'histogramme aura la forme d'une cloche avec une écart type très faible ? :-)

    Globalement il me semble qu'on peut s'attendre à ce que $D_n$ et $G_n$ soient proches de $n/2$, $Z_n$ de $0$ et $p_n$ de $1/2$.
  • Pour le deuxième point, c'est bien ça que me renvoie mon programme ! Quand n est grand, $p_n$ est proche de $1/2$, $D_n$ de $n/2$, $G_n$ de $-n/2$ et $Z_n$ de $0$ !

    (D'ailleurs $D_n/n$ et $G_n/n$ tendent aussi vers $\pm 1/2$, (ce qui est logique))
  • Tu as l'air surpris de ces résultats ?
  • Non, non, pas spécialement ^^

    Pour trouver la loi de $Z_{1000} / \sqrt{1000}$, dois-je passer par $p_{n} = \dfrac{n+2-Z_n}{2(n+2))}$ <=> $\dfrac{Z_n}{\sqrt{n}} = \dfrac{n+2-p_n(2n+4)}{\sqrt{n}}$ ?

    Edit : Plusieurs simulations de $p_{1000}$ donnent 0.5249501, 0.4880240, 0.5079840, 0.5089820, 0.5159681... Globalement on est déjà très proches de $1/2$ ! (Je comprends juste pas pourquoi on doit utiliser un histogramme.....)
  • Bah j'y connais rien (c'est des probas), mais ya du $\sqrt n$ donc l'histogramme devrait te faire apparaître une courbe en cloche.

    Attention à ceci, néanmoins.
Connectez-vous ou Inscrivez-vous pour répondre.