commandes utilisées : ones(), zeros(), abs(), imwrite()

Les bassins de Newton avec Octave



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.

Le code Octave

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é.

Objet fractal


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;

Vitesse de convergence

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;
z

Les liens

  1. un générateur de bassins de Newton (en anglais)
  2. wikipedia (en anglais)
  3. Le travail d'une étudiante de l'ENSEEIHT (en anglais). Il y a un code Matlab plus compact que le mien et assez différent.
  4. la page nullprogram qui m'a donné envie de faire ce programme
  5. La page wikipedia sur les fractales

Vous 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