Bonjour à tous,
ce message n'a pas pour but de résoudre une quelconque difficulté technique, mais de m'éclairer sur un comportement étrange de Matlab.
Je pars du principe du jeu de la vie, expliqué ici
http://fr.wikipedia.org/wiki/Jeu_de_la_vie
tout en l'adaptant un peu et en rajoutant un facteur aléatoire.
Ce que je fais, c'est que pour chaque cellule, je compte le nombre de voisins "vivants" (je ne compte pas les diagonales), puis j'ajoute aléatoirement 0 ou 1, et je divise la somme obtenue par 5.
Si le nombre obtenu est supérieur à 0.5, la cellule est "vivante" à l'itération d'après, sinon elle est "morte"
Le comportement est stable, le jeu dure "longtemps".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 h = figure('menubar','none'); error = 0; compteur =0; rng('shuffle'); A = floor(2*rand(100)); A(1,:) = 0; A(100,:) = 0; A(:,1) = 0; A(:,100) = 0; while error == 0 watchon; B = zeros(100); pause(0.02); for i = 2:99 for j = 2:99 %centre somme = A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1)+floor(2*rand(1)); B(i,j) = round(somme/5); end end A = B; compteur = compteur+1; try e = get(h,'position'); catch error = 1; end if error == 0 spy(A); end if A(2:99,2:99) == 0 fprintf('population tuée en %d itérations',compteur) error = 1; end if A(2:99,2:99) == 1 fprintf('population saturée en %d itérations',compteur) error = 1; end end
Ce que je ne comprends pas, c'est ce qui se passe quand je fais la chose suivante : au lieu de rajouter un nombre aléatoire entre 0 et 1, je rajoute un nombre aléatoire entre 0, 1 et 2 (les probabilités d'occurence étant égales), et je divise par 6
et la, la simu "explose" en quelques itérations
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 somme = A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1)+floor(3*rand(1)); B(i,j) = round(somme/6);
même, en allant plus loin :
va converger vers une solution "saturée"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 somme = A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1)+floor(3*rand(1)); B(i,j) = round(somme/6.0000000000000004440892);
alors que
converge vers une solution "vide"....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 somme = A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1)+floor(3*rand(1)); B(i,j) = round(somme/6.0000000000000004440893);
Voila, si vous avez une idée pour expliquer le pourquoi du comment, je suis preneur!
Partager