ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 21 Mar 2020 9:41 Sujet du message: Ensemble de Mandelbrot |
|
|
Bonjour à tous (amis confinés),
On présente ici une version simplifiée du programme de représentation graphique de l'ensemble fractal M de Mandelbrot.
Un point A du plan complexe est élément de M si, lorsque l'on définit la suite récurrente z[0]=A, z{n+1]=z[n]^2+A, elle converge.
Pour simplifier, on considère ici que la divergence se produit dès que le module de z[n+1] dépasse 2.
C'est la procédure element_M qui détermine si oui ou non le complexe A est élément de M (en Maxiter itérations).
Pöur la représentation graphique, c'est la procédure mandelbrot qui fait le travail : on quadrille le plan complexe en points (nhor, nver : nombre de points horizontalement et verticalement). A l'aide d'une double boucle, on teste l'appartenance du point à l'ensemble M : si element_M donne un résultat positif, on ajoute le point ainsi que son symétrique par rapport à l'axe des abscisses à la liste L.
Code: |
element_M:=proc(A::complex , Maxiter::posint)
local modulecarre,z,nbiter;
z:=A;
nbiter:=0;
while nbiter < Maxiter do
nbiter:=nbiter+1;
z:=z*z+A;
modulecarre:=evalf(Re(z)^2+Im(z)^2);
if modulecarre>4 then RETURN(false) end if;
end do;
true;
end proc:
> element_M(1+2*I,100);
false
> element_M(0.25+0.5*I,100);
true
> mandelbrot:=proc(nhor::posint,nver::posint,maxiter::posint)
local L,pas_hor,pas_ver,i,j,x,y,z;
L:=NULL;
pas_hor:=4/nhor;
pas_ver:=4/nver;
for i from 0 to nhor do
x:=evalf(-2+pas_hor*i);
for j from 0 to round(nver/2) do
y:=evalf(pas_ver*j);
z:=x+I*y;
if element_M(z,maxiter) then
if y=0 then L:=L,[x,0] else L:=L,[x,y],[x,-y] end if;
end if;
end do;
end do;
plots[pointplot]([L],style=point,axes=NONE,title="Ensemble de Mandelbrot");
end proc:
> mandelbrot(400,400,100);
|
Soyez patients, le calcul prend un temps certain.
Lien pour visualiser le résultat : http://alamanya.free.fr/mandelbrot.jpg
Patience, et courage !
Restez à la maison, et protégez-vous ! |
|