Mandelbrotmängden

Bild 1a. Mandelbrotmängden, Mandelbrotfraktalen, är det helt svarta området i bilden. Resten kan sägas vara fraktalens aura. 1b. Delbild av övre högra kanten.
Bild 2. Vid en närmare studie ser man att gränslandet mellan mandelbrotmängden och auran har en mycket komplex struktur. På vissa ställen syns snarlika kopior av den ursprungliga figuren i mindre skala. (Eng. "minimandels".).
Bild 3. Ett ständigt återkommande tema är att det upprepas ett likartat mönster gång på gång i allt mindre skala. Mönstret försvinner ned i "svarta hål" och dessutom i serier där hålen upprepas i långa rader eller spiraler bredvid varandra. Mönstret varierar också allt efter hur stor skala som visas.
Bild 4. I normala fall testas om absolutbeloppet av är mindre än 2 men det går även till exempel som i bilden ovan använda absolutbeloppet av bara realdelen eller likadant med koordinaten. Man kan även addera upp båda eller hitta på något annat intressant, möjligheterna är många. Sådana variationer av fraktalen påverkar oftast inte utseendet på mängden i någon särskild utsträckning men kan däremot ge auran olika karaktär, i det här fallet ett blombladsliknande vågmönster där det annars bara är jämna kurvor.

Mandelbrotmängden är en berömd fraktal uppkallad efter den franske matematikern Benoît B. Mandelbrot.

Historik

Funktionen som ligger bakom Mandelbrotmängden upptäcktes ursprungligen år 1905 av den franske matematikern Pierre Fatou och studerades sedan vidare av Gaston Julia som under slutet av 1920-talet arbetade med metoder som itererar enkla komplexvärda funktioner. Julia upptäckte även de med mandelbrotmängden besläktade juliamängderna. Fatou och Julia undersökte främst konvergenser av enskilda parametrar; Julia skapade några bilder med låg upplösning för hand, men bättre visualiseringar skulle kräva datorkraft för de omfattande beräkningarna.

Benoît B. Mandelbrot var anställd vid IBM och arbetade där bland annat med att försöka få bukt med vissa typer av brus, ett kaosfenomen kallat cantordamm, som uppstår vid datakommunikation vilket föranledde honom att experimentera med kaotiska förlopp. När han återupptäckte Julias arbeten hade han fördelen att vara bland de första med tillgång till nödvändig datorkraft. Där skapade han den första bilden av mandelbrotmängden, en svart/vit utskrift på papper. Han beskrev sina resultat år 1982.

Definition

Mandelbrotmängden är en mängd av punkter i det komplexa talplanet. Punkterna i mängden är de komplexa tal c för vilka den rekursiva talföljden zn, definierad av

inte går mot oändligheten när startvärdet är .

För att beräkna en bild av Mandelbrotmängden antar man att varje bildpunkt motsvarar ett specifikt , vilket genererar en specifik talföljd, och eftersom en digital bild innehåller ett ändligt antal bildpunkter innebär det att ett ändligt antal talföljder behöver undersökas vad gäller divergens.

Man kan visa att talföljden alltid divergerar om absolutbeloppet av något blir större än 2. Eftersom det inte är möjligt att utföra ett oändligt antal iterationer på ändlig tid brukar man i praktiken välja ett förutbestämt maximalt antal iterationer och om för en specifik talföljd inte överstigit 2 innan man når denna iteration så antar man att motsvarande tillhör mandelbrotmängden, annars inte.

Formeln ovan är skriven med komplexa tal men det går även att uttrycka samma sak med reella tal. Istället för det komplexa talet undersöker vi då punkten och istället för den komplexa talföljden får vi då två reella talföljder och :

Formelns funktion

Först bestäms hur många gånger funktionen skall itereras eller det maximala beloppet indexräknaren kan anta. Detta för att det inte går att exakt beräkna fraktalen utan vad som nås är en approximation av den. Det i sin tur beror på att vissa punkter kan ta närmare oändligt många iterationer på sig innan de lämnar systemet och det går ju inte att beräkna. Nästa steg är att välja en punkt (eller koordinatpar om du vill). Den motsvarar punkten i det komplexa talplanet som skall analyseras huruvida den är en punkt i mandelbrotmängden eller ej. Sedan sätts parametern till att peka på origo, alltså nollpunkten. Även indexräknaren nollställs:

max n = noggrannhet Antal iterationer
c = [a, b]            Punkten som analyseras
z(n = 0) = [0, 0].     Nollställ z och n

Detta är utgångsläget, för att sedan pröva om punkten c tillhör mandelbrotmängden så itereras formeln ovan och vid varje iteration så testas om absolutbeloppet av har nått över gränsvärdet som anger storleken på fångstmängden som brukas, i det här fallet är det som är fångstmängd. Om uttrycket är sant så görs nästa upprepning; i annat fall är utanför radien 2,0 och kommer garanterat att gå mot oändligheten. Om däremot inte går mot oändligheten så avbryts beräkningarna när indexräknaren har nått sitt maxvärde "max " och punkten antas vara en delmängd av mandelbrotmängden. (Det betyder att punkten ligger inom det svarta området i bild 1a. Det stora cirkelsegmentet som syns lite otydligt längst till vänster i bilden motsvarar == 2.0, och är gränsen för var har fallit ur fångstmängden efter den första iterationen. Nästa kurva i ordningen motsvarar den andra upprepningen o.s.v.)

För att beräkna absolutbeloppet av så kvadreras och sedan dras roten ur summan:

Absolutbelopp; (två dimensioner)
|z| = sqrt(x² + y²)
Jämför; Pythagoras sats, längden på hypotenusan.

Men då är analogt med så gäller alltså även vilket innebär att det går att undvika beräkningsmödan i rotutdragningen och testa direkt på i stället (i det här fallet 4). (Att beräkna fraktaler kan vara processkrävande, så att undvika onödiga beräkningar är en fördel.)

Algoritm

Nu räcker det alltså inte med bara en formel utan det behövs även en algoritm. Algoritmens uppgifter är att dela in talplanet i ett rutnät som har samma upplösning som bildytan fraktalen skall visas på, utföra beräkningarna och testa villkor för fångstmängd och indexräknare och därefter upprepa eller avbryta. Rutnätet motsvarar koordinaterna (c) som skall approximeras och arbetas av punkt för punkt tills hela bilden är klar. Avbryts beräkningen på grund av att z fallit ur fångstmängden så betyder det att c pekar på en punkt i auran och ges då vanligtvis en färg från en predefinierad palett (egentligen en tabell), då används normalt det uppnådda värdet på n som index när färgen hämtas ur tabellen. Sedan skrivs punkten dit i den aktuella färgen vid koordinaten c. Uppnår indexräknaren däremot maxvärdet så skrivs vanligtvis en svart punkt dit för att markera att den tillhör mandelbrotmängden.

Pseudokod (där operanderna är i normaltext och operatorerna i fetstil) .

Räkna b från -2,0 till 2,0
  Räkna a från -2,0 till 2,0
    Sätt c till [a, b]
    Sätt z till [0, 0]
    Sätt n till 0
    Om |z| < 2 Och n < max n
      Sätt z till z² + c
      Öka n med 1
    Upprepa
    Sätt aktuell färg till n
    Skriv_pixel [a, b]
  Nästa a
Nästa b

Perturbation och Series Approximation

Mycket starkt förstorade bilder kräver mer än den vanliga 64- eller 80-bitars precision som de flesta hårdvaruflyttalsdatatyper stöder. För att rendera mycket förstorade bilder (c:a >1e13 för den vanliga 64-bitars double datatypen) behöver man använda mjukvaruimplementerade "bignum" eller liknande matematikbibliotek, vilket är avsevärt långsammare. Emellertid kan detta påskyndas genom användandet av störningsteori (perturbation), vilket innebär att en referenspunkt beräknas med full precision och sedan används för att beräkna de omgivande punkterna, som därmed kan beräknas med lägre precision - dvs. så låg precision som stöds av hårdvarans datatyper.

Ofta förekommer dock områden i en bild där hårdvarans precision inte räcker till, som då antingen behöver mer precision eller ytterligare referenspunkter för att kunna beräknas korrekt. Genom att mäta avståndet från referenspunktens omloppsbana med den med låg precision beräknade punktens omloppsbana kan man detektera punkter som inte kan beräknas korrekt med låg precision, och därmed avbryta beräkningen av dessa och senare beräkna dem igen med t.ex. en närmare referenspunkt.

Vidare kan en trunkerad Taylorserie användas för att beräkna startvärdet för varje punkt som skall beräknas från referenspunkten. Detta gör att ett ofta avsevärt antal iterationer kan hoppas över.[1]

Sammantaget kan dessa metoder snabba upp renderingen av mycket förstorade bilder upp till hundratalet gånger jämfört med de snabbaste traditionella programmen.[2]

Eftersom Mandelbrotfraktaler har funnits i flera decennier och vars mönster och oändlighet fascinerat många, har det engagerat många skickliga programmerare under årtiondena att anta utmaningen att skapa snabba program, optimerade för denna typ av beräkningar, för att utforska dessa fraktaler bortom gränserna för vad som är möjligt med de datatyper som stöds av hårdvaran. Metoderna Perturbation och Series Approximation kan därför ses som en revolution inom detta område. Bilder som förut krävde t.ex. en timme för att renderas, kan nu renderas inom en minut.

Bildgalleri

Referenser

  1. ^ SUPERFRACTALTHING MATHS http://www.superfractalthing.co.nf/sft_maths.pdf Arkiverad 28 juni 2014 hämtat från the Wayback Machine.
  2. ^ Kalles Fraktaler 2 http://www.chillheimer.de/kallesfraktaler/

Externa länkar

Media som används på denna webbplats

Juliamängden vid koordinaten (-1.404289, 0).jpg
Övre; Juliamängden vid punkten C = [-1.404289, 0.0], Under; Utsnitt från mittpunkten.

Bilden skapad av Solkoll.

Datorgrafik

Den övre delbilden visar en fraktal, juliamängden, på det sätt som normalt brukas när datorgrafik används, med en mer eller mindre slumpvis vald fallande färgskala som visar en ganska uppenbart digital bild av det fraktala mönstret.

Tidflyktssystem

Vid beräkningen så har ett tidflyktssystem (eng: time escape) brukats för att approximera juliamängden¹ genom att dela in det komplexa talplanet i ett rutnät där varje cell motsvarar exakt 1 pixel på skärmen. Sedan itereras (upprepas) formeln som ger fraktalen för varje punkt tills den antingen faller ur fångstmängden som begränsar systemet eller iterationsräknaren når sitt maxvärde. Då antas punkten vara en delmängd av fraktalen och markeras normalt med en kontrasterande färg, vanligtvis, men inte nödvändigtvis, svart. I annat fall antas den inte tillhöra den fraktala mängden och markeras som tillhörande fraktalens aura. Det uppnådda värdet på iterationsräknaren används sedan som index när färgen till den aktuella pixeln hämtas från en tabell innehållande en fördefinerad palett. Det som egentligen visas och beräknas är alltså inte fraktalen utan man undersöker vilka punkter som flyr systemet, vilka som inte tillhör fraktalen.

¹ I det här fallet men samma slags system brukas även för att visa mandelbrotmängden och andra liknande fraktaler.

Färgskala

Vanligtvis används en färgpalett med ett litet begränsat antal färger, ofta högst 256. Om man har valt att upprepa beräkningen av fraktalen fler gånger än antalet tillgängliga färger så brukar det vanligtvis lösas genom att starta om från början och återanvända samma färger på nytt. Om man genomför ett stort antal upprepningar så kan i stället en funktion användas där nivån för den röda, gröna och blå komponenterna i färgen hämtas från en sinusfunktion där dom olika grundfärgerna har olika frekvens och fas. På så sätt nås en färgskala där alla färger är unika. Funktionen kan sedan varieras med frekvensmodulationer och in eller uttoningar av nivåerna o.s.v. Färgskalan i den övre delbilden har skapats på det sättet och även bilderna på sidorna som beskriver Mandelbrotmängden och Juliamängden har den typen av färgsättning.

Sampling

Vid rendering av datorgrafik som visar en bild av något som har en högere upplösning än bildytan så uppstår ett problem. Bilden som visas är inte analog med funktionen utan vad som visas är en sampling av färgen vid pixlarnas mittpunkter. Man kan säga att det är en trunkering av bilden där den multipliceras med en konstant = storleken på bildytan som sedan ger ett heltal, (det går inte att visa mindre än 1 pixel). Det här gör i sint tur att bilden som visas är digitaliserad och skiftningarna menllan nivåerna är ganska hackiga i kanten eller vid hög komplexitet mer eller mindre slumpmässig.

[[:sv:Bild:Mandelbrot pixel.jpg|thumb|256px||right|Till vänster mandelbrotmängden och till höger ytan som motsvaras av en pixel i den första bilden.]]

Mandelbrotbilden till höger visar hur antagandet att punkten tillhör mängden kan vara fel om man betraktar hela ytan av den pixel som skall visas. Pixlar som ligger i gränslandet mellan fraktalen och auran kommer att mer eller mindre få en slumpvis vald färg på det här viset, liknande problematik uppstår vid ljudsampling där ljudet är rikt på övertoner, tex en tvärflöjt eller en cymbal som går högere än samplingsfrekvensen hos en CD-spelare vilket resulterar i mer eller mindre "färgat" brus.

Inom raytracing|¹ så brukar man lösa problemet med en metod som kallas "super sampling". Då delas pixeln in i ett antal subpixlar, vanliigtvis stycken, till exempel 2x2, 3x3 eller 5x5. Subpixlarna beräknas sedan separat och skärmens punkt får sedan en färg som motsvarar medelvärdet av summan från beräkningarna. Det tar bort en del av "grynigheten" i bilden men skapar i gengäld en viss suddighet. Samma resutat uppnås även om man använder samma metod vid beräkning av fraktaler. Nu har fraktaler den fördelen mot bilder som återskapar verkliga miljöer att angränsande punkter nästan alltid har närliggande färger som dessutom beror på närliggande resultat i beräkningarna. Det kan man utnyttja genom att inte använda medelvärdet från subpixlarna utan i stället välja det resutltat som fallit ur fångstmängden vid det minsta antalet upprepningar och förkasta dom övriga vilket resulterar i att punkten troligen får en färg som är närliggande de färger dom angränsande pixlarna har. Det tar bort mycket av suddigheten, redan vid det låga antalet 3x3 subpixlar så upphör grynigheten nästan helt. Nackdelen med metoden är att renderingstiden mångfaldigas (9 ggr vid 3x3).

¹ Raytracing, rendering av verklighetstrogen datorgrafik där den resulterande bilden visar dom ljusstrålar som når ögat från den aktuella vyn. Tekniken används till exempel för att skapa datoranimerad film.

Bilden av Juliamängden

Den nedre och större av dom två delbilderna ovan visar en yta som ungefär motsvarar 1 pixel i den mindre bilden överst. Vid renderingen så har en "super-sampling" bestående av 3x3 subpixlar brukats och pixlarna har sedan färgsatts med en ljusmängd där den första iteratioen är svart och "max antal iterationer" motsvaras av en vit pixel, dom mellanliggande pixlarna får ljusmängden sv:sqrt(vit*(n/max n)) där "vit" har ljusmängden 1,0. Rotutrdagningningen gör att ljuset som strålar från fraktalen ungefär följer samma icke-linjära kurva som funktionen som skapar fraktalen (z²+c). Sedan har ljuset färgsatts med en frekvens som motsvarar sv:energin i det utstrålade ljuset och det kalla mörka ljuset går mot sv:infrarött och det varma ljusa mot sv:ultraviolett. På sådant sätt har approximationen av fraktalen passats in i det sv:spektrum av den elektromangnetiska strålningen som människans öga kan se. Resultatet är att vi bara ser ljus och inte längere pixlig datorgrafik.
Buddhabrot-W1000000-B100000-L20000-2000.jpg
Författare/Upphovsman: UnreifeKirsche, Licens: CC BY 3.0
Combined Buddhabrot from 20,000 (purple), 100,000 (blue) and 1,000,000 (white) iterations.
Mandelbrotzoom Wiki h265 CRF04 20210412 006GANZ.webm
Författare/Upphovsman: PantheraLeo1359531 😺 (diskussion), Licens: CC0
An example for the zoom into the Mandelbrot set. This video is a renewed version of File:Fractal-zoom-1-15-rupture.ogv. The video resolution is out of date and shows significant compression artifacts. This version here tries to meet technical standards from today with 8000 x 4500 ("8K"/"FUHD") at 60 frames per second. Of course, this video will be too old for future standards.
Mandelbrotmängden stor.jpg

sv:Mandelbrotmängden, (en sv:fraktal).

Andra bilder i samma serie:

Icke linjära fraktaler:
Exempel på sv:Juliamängden
Exempel på den tomma sv:Juliamängden
Newton-Raphsons metod
Kategori:Bilder av fraktaler