Le carré ci-dessus correspond à des x et des y compris entre -1 et 1. Chaque pixel de l'image correspond donc à un complexe z0=x+iy . On considère la suite récurrente de premier terme z0 et définie par zn+1=zn-(zn3-1)/(3zn2) . Cette suite peut converger vers 1 , e2iπ/3 ou e4iπ/3. Chaque pixel associé à un complexe qui est le premier terme d'une suite convergeant vers 1 sera rouge; les autres seront bleus ou verts.
tic
#nb d'iterations
n=40;
#seuil
d=0.0001;
#nb de pixels par cote
t=401;
#matrice de pixels
#Rouge Vert Bleu
R=uint8(ones(t))*100;
G=uint8(ones(t))*100;
B=uint8(ones(t))*140;
#coordonnées
x=[-200:200]./200;
y=[-200:200]./200;
for e=1:t,
for f=1:t,
#creation d'un suite de complexes
u=zeros(n,1);
v=zeros(n,1);
z=u+i*v;
z(1)=x(e)+i*y(f);
#division par 0
if(z(1)==0)
R(t+1-f,e)=200;
else
for k=2:n,
z(k)=z(k-1)-(z(k-1)**3-1)./(3*z(k-1)**2);
endfor;
f=t+1-f;
#comparaison avec les racines cubiques de 1
if (abs(z(n)-1)<d)
R(f,e)=240;
elseif
(abs(z(n)+0.5*(1+i*sqrt(3)))<d )
G(f,e)=200;
elseif
(
abs(z(n)+0.5*(1-i*sqrt(3)))<d)
B(f,e)=200;
endif;
endif;
end
end
imwrite("bassin16.png",R,G,B)
toc Octave met 348 secondes pour produire l'image. Le code est assez bourrin; vous trouverez sûrement des façons de l'améliorer. Ce que j'ai trouvé compliqué c'est le passage des coordonnées aux termes de la matrice. Si M est une matrice,dans M(3,5), 3 correspond à une descente de 3 rapport au coin supérieur gauche alors que si M est un point, 3 correspond à un déplacement de 3 vers la droite.
On crée trois matrices 401×401 correspondant aux trois couleurs Rouge, Vert et Bleu. On parcourt chaque pixel , on le convertit en complexe, on calcule le 41 ème de la suite récurrente et on considère sa distance aux trois racines de l'unité.
Si on zoome sur le petit carré bordé de blanc, on obtient une image qui contient les mêmes motifs et la même complexité. Ceci est caractéristique des objets fractals.
Ce qui change dans le programme :
x=[1120:1520]./3200;
y=[880:1280]./3200;En général la convergence des suites est rapide. Un exemple avec z0=0,25+0,4 i
0.25000 + 0.40000i
-0.48982 - 1.07996i
-0.48270 - 0.89831i
-0.49870 - 0.86616i
-0.50000 - 0.86602i
-0.50000 - 0.86603i
-0.50000 - 0.86603i
-0.50000 - 0.86603i
-0.50000 - 0.86603i
-0.50000 - 0.86603i
Cette liste a été obtenue avec le script :
n=10;
a=0.25+0.4*i
u=zeros(n,1);
v=zeros(n,1);
z=u+i*v;
z(1)=a;
for k=2:n,
z(k)=z(k-1)-(z(k-1)**3-1)./(3*z(k-1)**2);
endfor;
zVous trouverez facilement des logiciels d'exploration de fractales gratuits; sur Linux, j'utilise Xaos qui est disponible sur Mac et Windows sur ce site ..
fait le 22 août 2008