Die Mandelbrotmenge ist folgendermaßen definiert:c∈ℂ gehört zur Menge, wenn die Folge zn+1=zn2+c mit z0=0 beschränkt ist, d.h. es existiert ein K∈ℝ, so dass |zn|<=K für alle n∈ℕ.Das klingt erstmal sehr theoretisch, aber auch ganz simpell eigentlich, aber trotzdem entstehen z.B. folgende Bilder, wenn man die komplexen Zahlen, die zu der Menge gehören schwarz einfärbt und die anderen Weiß und dann in der komplexen Zahlenebene darstellt:
Zum Erzeugen der Bilder habe ich Matlab verwendet und für die farbige Gestaltung einen Teil aus dem HSV-Farbspektrum genommen. Das ließe sich sicher noch verbessern und ich bin da für Vorschläge offen.
matlab Code
- function [erg erg01]=mandelbrot(x,y,maxAbs,maxIter)
- % mandelbrot(x,y,...) iteriert die komplexe Zahl c=(x,y)
- % x...Realteil von c
- % y...Imaginärteil von cc
- % maxAbs...Grenze, um Beschränktheit zu prüfen (Default=1000^2)2)
- % maxIter...Anzahl der Iterationen (Default=100)
- if nargin<3
- maxAbs = 1000^2;
- end
- if nargin<4
- maxIter = 100;
- end
- % Abbruchgrenze für die Iterationn
- eps = 10^-6;
- im=0;
- re=0;
- for i=1:maxIter
- % Berechnung von z^2
- reNext = re^2-im^2+x;
- imNext = 2*re*im+y;
- % Divergenz
- betrag = reNext^2+imNext^2;
- if betrag>maxAbs
- break;
- end
- % Konvergenz || Periodisch
- if (re-reNext)^2+(im-imNext)^2<eps || (i>2 && betrag<eps)
- i=maxIter;
- break;
- end
- re=reNext;
- im=imNext;
- end
- % Rückgabewerte erzeugen Anhand des "Zeitpunktes""
- % vom Überschreiten der Iterationsgrenz einen Farbverlauff
- if i<maxIter
- erg = i*log(log(betrag) / log(4));
- erg01 = 1-(1-exp((i/maxIter)))/(1-exp(1));
- else
- erg=2;
- erg01=0;
- end
matlab Code
- function imgOfMandelbrot(w,h,X,Y,maxAbs,maxIter);
- % imgOfMandelbrot generiert eine Veranschaulichung der Mandelbrotmenge
- % w...width (Breite des zu generierenden Bildes in Pixel)
- % h...height (Höhe des zu generierenden Bildes in Pixel))
- % X=[xMin,xMax]...horizontaler Ausschnitt aus der Mandelbrotmenge (Default=[-2,0.75])
- % Y=[yMin,yMax]...vertikaler Ausschnitt aus der Mandelbrotmenge (Default=[-1,1])
- % maxAbs...Grenze, um Beschränktheit zu prüfen (Default=1000^2)2)
- % maxIter...Anzahl der Iterationen (Default=100)
- % Wenn nicht alle Parameter angegeben sind, dann Standardwerte setzen
- if nargin<3
- X = [-2,0.75];
- end
- if nargin<4
- Y = [-1,1];
- end
- if nargin<5
- maxAbs = 1000^2;
- end
- if nargin<6
- maxIter = 100;
- end
- % den Anzeigebereich aufspannen
- x=linspace(X(1),X(2),w);
- y=linspace(Y(1),Y(2),h);
- % wenn grey=1, dann Bilder in Graustufen generieren, sonst farbige
- grey=1;
- img=ones(h,w,3);
- Fortschritt=0;
- for i=1:w
- for j=1:h
- [erg erg01] = mandelbrot(x(i),y(j),maxAbs,maxIter);
- if(erg~=2) % Punkt liegt nicht in der Menge
- [red green blue] = hsv2rgb2(erg01,grey);
- else % Punkt liegt in der Menge
- red=0;green=0;blue=0;
- end;
- img(j,i,1)=red;
- img(j,i,2)=green;
- img(j,i,3)=blue;
- end
- if mod(i*100/w,5)==0
- Fortschritt=Fortschritt+5
- end
- end
- % Das Bild wird in die Datei mandelbrot.jpg gespeichert
- imwrite(img,'mandelbrot.jpg','jpg','Bitdepth',8,'quality',90);
matlab Code
- function [r g b]=hsv2rgb2(h,grey)
- % hsv2rgb2(h,grey) ist eine Hilfsfunktion zur Umrechnung von HSV Werten in RGB Werte
- % Nur der Werte h aus dem HSV-Spektrum wird variiert
- % wenn grey=1, dann wird nur ein Grauton (Wert zwischen 0 und 1) zurückgegebenn
- if(grey==1)
- r=h;g=h;b=h;
- else
- h = mod(round(h),360);
- r=0;g=0;b=0;
- % Berechnung sehr umständlich gemacht..
- % Es gibt sicher auch Formeln zum Umrechnen von HSV nach RGB
- if(0<=h && h<=60)
- r=255;b=51;
- g=51+floor((204/60)*h);
- elseif(61<=h && h<=120)
- g=255;b=51;
- r=255-floor((204/60)*(h-60));
- elseif(121<=h && h<=180)
- g=255;r=51;
- b=51+floor((204/60)*(h-120));
- elseif(181<=h && h<=240)
- b=255;r=51;
- g=255-floor((204/60)*(h-60));
- elseif(241<=h && h<=300)
- b=255;g=51;
- r=51+floor((204/60)*(h-60));
- elseif(301<=h && h<360)
- r=255;g=51;
- b=255-floor((204/60)*(h-60));
- end
- r=r/255;
- g=g/255;
- b=b/255;
- end