Mandelbrotmängden.
the Mandelbrot set.

Till startsidan Föregående sida Innehåll

Mandelbrotmängden upptäcktes av fransmannen Benoît B. Mandelbrot år 1976. Mandelbrot var vid den tiden anställd hos IBM för att försöka få bukt med dom kluster av brus (en typ av cantordamm) som uppstår vid datakommunikation, men ägnade mycket av sin tid där åt att exprimentera med fraktaler på IBM's datorer.

Mandelbrotmängdens matematik.

Formeln :

Zn = Zn-1² + c

z : är punkten som transformeras och sätts i utgångsläget till [0.0, 0.0].
c
: är
koordinaten i z-planet som mandelbrotmängden beräknas för.

z och c : är komplexa tal som består av två reella tal på formatet [a, b] eller om man vill så kan man betrakta det som en vektor [x, y]. Normal så brukar man (jag) använda [x, y] för z parametern och [a, b] för c.

För att multiplicera z med sig själv så kan man avända vanlig vektormultiplikation, antag att du har vektorerna [x1, y1] och [x2, y2] då ser multiplikationen ut så här :

x = x1 · x2 - y1 · y2
y
= x1 · y2 + y1 · x2

Men eftersom det är samma vektor vi skall multiplicera med sig själv (kvadratera) så kan man bryta ner formeln till en något enklare, på vektorn [x, y] blir det då :

x = x² -
y
= 2 · x · y

Nu fattas bara translationen (förflyttningen) med parametern c för att formeln skall bli komplett. c brukar anges på formen [a, b] så då blir det:

x = x² - + a
y
= 2 · x · y + b

Mandelbrotmängdens algoritm.

Välj ut ett någorlunda kvadratiskt fält = z-planet, dra upp en cirkel med centrum mitt på fältet och med en radie som passar inom fältets yta. Radien motsvara sträckan två enheter och är den yttre gränsen för våra strävanden. Välj nu en plats genom att kasta upp en sten och se var den landar. Platsen motsvarar parametern c i mandelbrotformeln och är den punkten vi skall beräkna mandelbrotmängden för. Ställ dig nu i mittpunkten av cirkeln och gör dig redo för den första iterationen. Det motsvarar att sätta [x, y] eller z = [0.0, 0.0], sätt även iterationsräknaren till noll (0) och gå sedan över till iterationsloopen :

1; Mät sträckan från nollpunkten till punkten du befinner dig i, "absolutvärdet av z" = |z| = sqrt(x² + y²). Om avståndet är större än 2 enheter, alltså om du befinner dig utanför cirkeln du ritade upp så avbryts iterationsloppen och punkten som mandelbrotmängden beräknas för sätts till en färg som motsvaras av värdet på iterationsräknaren.

2; Mät nu vinkeln till punkten du befinner dig i och fördubbla sedan denna : v = v + v (rotation). Tag sedan längden du fick i det förra steget och multiplicera den med sig själv (kvadratera) |z|² eller längden · längden (skalning). Du har nu skapat en ny vektor med en ny vinkel och en ny längd. Placera dig nu i den nya punkten du nått.

3; Lägg sedan till vektorn som motsvaras av parametern c eller [a, b] till punkten och förflytta dig sedan till den nya platsen. Vad du gör här är alltså att du förflyttar dig samma sträcka och i samma vinkel som stenen vi kastade har i förhållande till nollpunkten men vi utgår från punkten vi fick efter steg 2; Alltså vi går lika långt och i samma vinkel som vi hade gort om vi gick från nollpunkten till stenens plats, (translation).

4; Räkna upp iterationsräknaren med ett och om den har nått ett förutbestämt maxvärde så avbryts iterationsloopen och punkten markeras som tillhörande mandelbrotmängden men en speciell färg (vanligtvis svart). Om iterationsräknaren inte har uppnått maxvärdet så återgå till steg 1; (upprepa iterationsloopen).

Steg 1; och steg 2; är egentligen onödiga att utföra i det första varvet av loopen då vi utgår från mittpunkten. Det beror på att mittpunkten motsvaras av det komplexa talet [0.0, 0.0] vilket då är motsvarigheten till den vanliga nollan och noll har ju som bekant inget värde så det är meningslöst att försöka beräkna längd och vinkel för det talet. Därför skulle vi kunnat sätta z = [a, b] och iterationsräknaren till 1 i utgångsläget om vi velat men då hade vi frångått orginaldefinitionen för mandelbrotmängden en smula då den säger att utgånsläget är : z = [0.0, 0.0]

I det här exemplet så har stenen landat i punkten [0.42, 0.45] (markerad med en liten gul cirkel vid 1) och sedan har 7 iterationer utförts enligt algoritmen ovan och punkten har därför markerats med färg nummer 7 (mellangrå i det här fallet). Alla punkter som ligger utanför radien 2 (stenen vi kastade har landat utanför cirkeln) har markerats med den mörkaste grå färgen (färg 1), där har iterationsloopen avbrutits i steg 1; efter det första varvet. Punkter som även överlevt det andra men inte det tredje varvet har markerats med en lite ljusare grå färg (färg 2) o.s.v.

Om vi nu vill beräkna mandelbrotmängden för hela z-planet så bör vi nog dela in det i ett fint rutnät och sedan beta av det punkt efter punkt tills hela ytan är avklarad snarare än att kasta en sten för att på sådant sätt slumpvis välja en punkt. Här följer ett exempel i pseudokod som på ett lite mera tekniskt sätt beskriver algoritmen :

Räkna b från botten till toppen
  Räkna a från vänster till höger
    Sätt z till [0, 0]
    Sätt c till [a, b]
    Sätt iterationer till 0
    Om |z| < 2.0 Och iterationer < max antal iterationer
      Sätt z till z² + c
      Öka iterationer med 1
    Upprepa
    Sätt färg till iterationer
    Plot [a, b]
  Nästa a
Nästa b

Vill du ha en lite mera detaljerad beskrivning av algoritmen så finns den som det första exemplet på sidan : (Metoder för att presentera) Fraktaler i bild.

Min vän och tillika susaren Tycho Brahe eller Magnus karlsson som han heter i det verkliga livet har en site med en zoombar java-applet som visar mandelbrotmängden under följande länk : http://magnus-karlsson.nu/mandel/interaktiv.html Där kan du roa dig med att titta in i djupet av dom fraktala virvelstormarna.

Vill du se några Inzoomningar från mandelbrotmängden som är renderade med en metod som ger mycket hög kvalitet på resultatbilden så klicka på länken vetja! Metoden kommer senare att beskrivas här på Fractalus men det blir först efter det att grunderna är klara.

Fortsättning följer ...

Till startsidan Föregående sida Innehåll

Har du synpunkter på innehållet? Vill du rätta fel? Göra tillägg? Ställa frågor? då kan du kontakta Fractalus.