Vom Zäh­len zur Man­del­brot­men­ge — Teil 7: Dar­stel­lung der Man­del­brot­men­ge

Hal­lo Ihr Lie­ben,

will­kom­men zurück in der Welt der Man­del­brot­men­ge. Unser Erkun­dungs­pfad zu sel­bi­ger ist ja bereits im letz­ten Teil mei­ner Bei­trags­se­rie wenigs­tens mal bis zur Defi­ni­ti­on der Man­del­brot­men­ge gelangt. Wir haben dort erfah­ren, dass die Man­del­brot­men­ge eine Teil­men­ge der Kom­ple­xen Zah­len ist. Und wir haben erfah­ren, wel­che kom­ple­xen Zah­len zur Man­del­brot­men­ge gehö­ren und wel­che nicht.

Dazu haben wir mei­nen legen­dä­ren “Man­del­brot-Trans­for­ma­tor” ken­nen­ge­lernt. Er wird ver­wen­det, indem man ihn anhand der bei­den Schie­be­reg­ler zunächst auf jene kom­ple­xe Zahl vor­ein­stellt, für die man tes­ten will, ob sie zur Man­del­brot­men­ge dazu­ge­hört. Ist die zu tes­ten­de Zahl ein­mal ein­ge­stellt, star­tet man den Trans­for­ma­tor, indem man oben eine Null ein­wirft. Es erscheint dann eine Zahl am Aus­gang – und zwar immer die­je­ni­ge Zahl, die ent­steht, wenn man die oben ein­ge­wor­fe­ne Zahl mit sich selbst mul­ti­pli­ziert und die zu tes­ten­de Zahl zum Ergeb­nis die­ser Selbst­mul­ti­pli­ka­ti­on hin­zu­ad­diert. Das Ergeb­nis die­ses Vor­gangs wirft man dann wie­der oben in den Trans­for­ma­tor ein und wie­der­holt die­ses Pro­ze­de­re solan­ge, bis ent­we­der eine Zahl mit einem (kom­ple­xen) Betrag grö­ßer als 2 her­aus­kommt, oder aber, bis eine vor­ge­ge­be­ne maxi­ma­le Anzahl an Durch­läu­fen – soge­nann­te Ite­ra­tio­nen – erreicht ist. Ist ers­te­res der Fall, gehört die anfangs vor­ein­ge­stell­te Zahl nicht zur Man­del­brot­men­ge. Ist letz­te­res der Fall, gehört sie dazu. Jeden­falls betrach­ten wir sie dann als zuge­hö­rig zur Man­del­brot­men­ge.

Wie aber ent­ste­hen jetzt dar­aus die spek­ta­ku­lä­ren, unglaub­lich far­ben- und for­men­rei­chen Bil­der, die im “Teaser-Video” aus dem ers­ten Bei­trag die­ser Serie zu sehen waren?

Punkt für Punkt

Tat­säch­lich sind die­se sen­sa­tio­nel­len Visua­li­sie­run­gen der Man­del­brot­men­ge ein­deu­tig Kin­der des Com­pu­ter­zeit­al­ters. Ohne Com­pu­ter kei­ne Apfel­männ­chen. Daher datiert die ers­te beleg­te Dar­stel­lung des Apfel­männ­chens auch erst aus dem Jah­re 1978, wo sie in einem (aller­dings erst 1980 publi­zier­ten) Fach­kon­fe­renz­bei­trag der bei­den Wis­sen­schaft­ler  Robert Wol­fe Brooks und John Peter Matel­ski wie folgt zu sehen war:

Das wür­de man wohl kaum als visu­el­le Offen­ba­rung bezeich­nen wol­len. Aber 1978 ver­füg­ten Com­pu­ter gera­de ein­mal über ein Mil­li­ons­tel der Rechen­leis­tung unse­rer heu­ti­gen Com­pu­ter. Viel mehr konn­te man damals also nicht erwar­ten. Den­noch wäre die­se Dar­stel­lung der Man­del­brot­men­ge ohne Com­pu­ter nicht mög­lich gewe­sen. Per Hand könn­te man näm­lich nicht ein­mal die mage­re Dar­stel­lung aus dem obi­gen Bild berech­nen.

Also – wie ent­steht jetzt die Visua­li­sie­rung der Man­del­brot­men­ge?

Dazu muss man zunächst ein­mal ver­ste­hen, dass com­pu­ter­ge­ne­rier­te Bil­der sich heut­zu­ta­ge prak­tisch aus­schließ­lich aus einer Anein­an­der­rei­hung ein­zel­ner Bild­punk­te zusam­men­set­zen. Sol­che Bild­punk­te wer­den auf Eng­lisch “pic­tu­re ele­ments” (wört­lich “Bild­ele­men­te”) genannt und ger­ne mit der Kurz­form “pic-els” bzw. “pixels” bezeich­net. Stel­len wir uns jetzt also mal eine Flä­che aus lau­ter der­ar­ti­gen Pixels vor – ange­ord­net in Form von fünf Zei­len à 10 Punk­ten:

Das ist jetzt nicht gera­de Reti­na-Auf­lö­sung. Moder­ne Com­pu­ter­dis­plays lösen ohne Wei­te­res auf knapp 2.000 Zei­len à 4.000 Pixel auf. Für die fol­gen­den Erläu­te­run­gen soll uns die oben gewähl­te Popel-Auf­lö­sung aber der bes­se­ren Anschau­ung hal­ber genü­gen.

Als ers­tes wählt man dann für die Dar­stel­lung der Man­del­brot­men­ge den­je­ni­gen Aus­schnitt der kom­ple­xen Ebe­ne vor, den man sich betrach­ten möch­te. In unse­rem Bei­spiel wäh­len  wir jetzt mal auf der reel­len Ach­se den Bereich von -2 bis 2 und auf der ima­gi­nä­ren Ach­se den Bereich von -1 bis 1:

Wir begin­nen unse­re Dar­stel­lung mit dem lin­ken obe­ren Pixel (also das­je­ni­ge mit den Bild­schirm­ko­or­di­na­ten 1, 1 (ers­te Zei­le, ers­te Spal­te). Das macht man tra­di­tio­nell so, weil der Katho­den­strahl bei den guten alten Bild­röh­ren den Bild­auf­bau auch immer oben links begon­nen und das Bild dann in einer gro­ßen Abwärts­be­we­gung Zei­le für Zei­le von links nach rechts auf die Fluo­res­zenz­schicht gemalt hat. Unser ers­tes Pixel ent­spricht damit der kom­ple­xen Zahl -2+1×iDie­se Zahl stel­len wir an unse­rem Trans­for­ma­tor ein und las­sen ihn – vor­schrifts­ge­mäß – mit 0 begin­nend los­lau­fen:

Die Beträ­ge der ers­ten sechs Zah­len, die der Trans­for­ma­tor dar­auf­hin nach­ein­an­der aus­spuckt lau­ten:

  • 2,236067977
  • 3,16227766
  • 11,18033989
  • 124,6194206
  • 15.531,57703
  • 241.229.886

Im Grun­de sind wir also schon gleich beim ers­ten Betrag (2,236067977) über die magi­sche 2 hin­aus­ge­schos­sen und hät­ten den Trans­for­ma­tor gleich wie­der anhal­ten kön­nen. Ich woll­te Euch aber trotz­dem mal zei­gen, wie schnell unse­re Aus­ga­be­fol­ge wächst. Im Ergeb­nis bedeu­tet das jeden­falls, dass die Zahl -2+1×i nicht zur Man­del­brot­men­ge dazu­ge­hört. In die­sem Fall las­sen wir unser Pixel dem­entspre­chend weiß und schau­en uns das nächs­te Pixel rechts dane­ben an (ers­te Zei­le, zwei­te Spal­te). Die­ses ent­spricht der Zahl -1,6+1×i:

Das ist so, weil wir mit jedem der zehn Pixel in einer Zei­le ent­spre­chend ein Zehn­tel des Bereichs von ‑2 bis 2 abde­cken. Der Bereich von ‑2 bis 2 hat eine Län­ge von 4 (zwei links von der Null plus zwei rechts von der Null) und ein Zehn­tel davon ent­spre­chend die Län­ge von 0,4. Rech­net man dann ‑2+0,4 (also lin­ker Bild­rand plus die Län­ge eines Pixels), erhält man ‑1,6. Wer das mit minus und plus gera­de nicht auf die Rei­he kriegt, sei auf Teil 2 die­ser Bei­trags­se­rie ver­wie­sen, in dem die Ganz­zahl­arith­me­tik aus­führ­lich dis­ku­tiert wur­de. Wir stel­len unse­ren Tra­fo also jetzt auf -1,6+1×i ein und las­sen ihn mit 0 los­lau­fen:Die Beträ­ge der ers­ten zwei Zah­len unse­rer Aus­ga­be­fol­ge lau­ten dies­mal: 1,886796226 und 2,200363606. Damit sind wir zwar erst mit der zwei­ten Zahl über die magi­sche 2er-Gren­ze gekom­men, kön­nen die­ses Pixel aber eben­falls aus der Man­del­brot­men­ge aus­schlie­ßen und es daher in Weiß dar­stel­len. Das kann man jetzt nach­ein­an­der für alle unse­re Pixel machen und erhält dann schließ­lich fol­gen­des Bild:

Mit viel Fan­ta­sie kann man dar­in tat­säch­lich das Apfel­männ­chen erken­nen, aber unse­re didak­ti­sche Bil­lig­auf­lö­sung macht das Gan­ze zuge­ge­be­ner­ma­ßen nicht gera­de zu einer Augen­wei­de. Jeden­falls zei­gen die schwar­zen Pixel jene Berei­che, bei denen unser Trans­for­ma­tor (vor­ein­ge­stellt auf die zum jewei­li­gen Pixel gehö­ren­de Zahl) nach einer vor­ge­ge­be­nen Anzahl von Durch­läu­fen immer noch kei­ne Zahl aus­ge­spuckt hat, deren Betrag grö­ßer als 2 ist. Schau­en wir uns dazu mal exem­pla­risch das fünf­te Pixel in der drit­ten Rei­he an. Es ent­spricht aus den oben dar­ge­leg­ten Grün­den der Zahl  -0,4+0,2×i:

Wir stel­len also unse­ren Tra­fo brav auf -0,4+0,2×i ein und las­sen ihn – wie gewohnt – mit 0 begin­nend los­lau­fen:Hier nun die Beträ­ge der ers­ten 20 Zah­len, die auf die­se Wei­se in der Aus­ga­be­fol­ge erschei­nen:

Unten sind die Durch­läu­fe von 1 bis 20 num­me­riert und links die Beträ­ge der Aus­ga­be­zah­len im Bereich zwi­schen 0,25 und 0,5. Es ist gut zu erken­nen, dass sich das Gan­ze in der Nähe von 0,34 ein­schwingt. Damit gehört -0,4+0,2×i also wirk­lich zur Man­del­brot­men­ge und unser Pixel darf dem­nach in Schwarz erschei­nen.

Eben wird’s zu bunt

Soweit so gut. Aber wo sind jetzt die spek­ta­ku­lä­ren Visua­li­sie­run­gen? Klar, unse­re Bild­auf­lö­sung ist denk­bar mager. Aber selbst, wenn man sie kräf­tig erhöh­te – etwa auf 500 Zei­len à 1.000 Pixel – käme man nach dem eben erläu­ter­ten Prin­zip zu fol­gen­der Dar­stel­lung:

Das sieht zwar schon deut­lich mehr nach dem aus, was wir bis­her so als Apfel­männ­chen ken­nen­ge­lernt haben. Aber es ist kei­nes­wegs so hübsch bunt, wie die Visua­li­sie­run­gen aus dem Teaser-Video.

Die Lösung: wir gehen all jene Pixel durch, die nicht zur Man­del­brot­men­ge gehö­ren (und die wir daher bis­her ein­fach in Weiß belas­sen haben) und schau­en uns für jedes die­ser Pixel an, nach wie vie­len Durch­läu­fen unser Trans­for­ma­tor zum ers­ten Mal eine Zahl aus­ge­spuckt hat, deren Betrag grö­ßer als 2 ist (so dass unser Pixel als nicht zuge­hö­rig zur Man­del­brot­men­ge iden­ti­fi­ziert wer­den konn­te). Wie wir oben (aber auch im vor­an­ge­gan­ge­nen Teil die­ser Blog­se­rie) gese­hen haben, geschieht das manch­mal schon nach einem ein­zi­gen Durch­lauf, manch­mal nach ein paar Dut­zend und manch­mal erst nach vie­len tau­sen­den Durch­läu­fen. Für die wei­te­ren Betrach­tun­gen wol­len wir die­se Anzahl an Tra­fo-Durch­läu­fen bis zum erst­ma­li­gen Erschei­nen einer Zahl mit einem Betrag grö­ßer als 2 jetzt ein­fach mal die „Abbruch­an­zahl“ nen­nen. Nach­ste­hend haben wir mal für eine Auf­lö­sung von 31 Zei­len à 31 Pixel alle Abbruch­an­zah­len für die­je­ni­gen Pixel dar­ge­stellt, die nicht zur Man­del­brot­men­ge gehö­ren:

Man sieht gut, wie die Abbruch­an­zah­len in der Nähe der (schwarz dar­ge­stell­ten) Man­del­brot­men­ge deut­lich zuneh­men. Am äuße­ren Bild­rand haben wir ziem­lich vie­le Pixel, mit einer Abbruch­an­zahl im Bereich 1 bis 3. Für die­se Pixel ist dem­nach also schon nach ein bis drei Ite­ra­tio­nen (=Durch­läu­fe durch unse­ren Trans­for­ma­tor) klar, dass sie nicht zur Man­del­brot­men­ge gehö­ren. Im Grenz­be­reich zur Man­del­brot­men­ge brau­chen wir dage­gen teil­wei­se bis zu 35 Ite­ra­tio­nen (wie etwa ober- und unter­halb des “Kop­fes” zu sehen), um die zuge­hö­ri­gen Pixel aus der Man­del­brot­men­ge aus­schlie­ßen zu kön­nen.

Auf jeden Fall haben wir jetzt nicht mehr nur ein­fach gleich­för­mig wei­ße Pixel son­dern wei­ße Pixel mit ganz unter­schied­li­chen Abbruch­an­zah­len. Die­se Beob­ach­tung machen wir uns jetzt dahin­ge­hend zunut­ze, dass wir den jewei­li­gen Abbruch­an­zah­len ein­fach bestimm­te Far­ben zuord­nen – und zwar etwa gemäß fol­gen­der Tabel­le:

Unser obi­ges Bild wür­de damit wie folgt aus­se­hen:

Aha — es tut sich lang­sam was! Man sieht hier schon recht gut, nach wel­chem Prin­zip die Farb­dar­stel­lun­gen der Man­del­brot­men­ge erzeugt wer­den: offen­bar wird es auf die­se Wei­se in der Nähe der Man­del­brot­men­ge immer hel­ler, und auch der Grenz­be­reich tritt jetzt viel deut­li­cher und dif­fe­ren­zier­ter her­vor. Außer­dem zei­gen sich im Grenz­be­reich jetzt plötz­lich ganz eige­ne Struk­tu­ren, die ansons­ten im bis­he­ri­gen “Ein­heits­weiß” unter­ge­gan­gen wären.

Mit die­sen Erkennt­nis­sen aus­ge­stat­tet, kom­men wir jetzt wie­der zurück zu unse­rer obi­gen Visua­li­sie­rung mit ihren 500 Zei­len à 1.000 Pixeln und fär­ben sie auf ver­gleich­ba­re Wei­se – also in Abhän­gig­keit von ihrer jewei­li­gen Abbruch­an­zahl – ein:

Aaahhh – jetzt kom­men wir lang­sam ins Geschäft. All­mäh­lich sieht das Gan­ze doch schon so aus, wie wir es aus dem Teaser-Video im ers­ten Bei­trag die­ser Serie ken­nen. Wir schei­nen also auf dem rich­ti­gen Weg zu sein.

Tat­säch­lich wer­den in der Pra­xis vie­le unter­schied­li­che Ver­fah­ren ver­wen­det, um die Far­ben geschickt auf die ver­schie­de­nen Abbruch­an­zah­len zu ver­tei­len. Eines die­ser Ver­fah­ren ver­sucht etwa, mög­lichst vie­le gra­du­el­le Farb­ab­stu­fun­gen zwi­schen den weni­gen vor­ge­wähl­ten Far­ben zu berech­nen und die­se gleich­mä­ßig auf alle im jewei­li­gen Bild vor­kom­men­den Abbruch­an­zah­len zu ver­tei­len (also etwa 1 bis 35 in unse­rem obi­gen 31×31-Erläuterungsbeispiel). Dadurch sol­len die har­ten Gren­zen zwi­schen den ein­zel­nen Far­ben auf­ge­löst wer­den, so dass mög­lichst glat­te Farb­ver­läu­fe ent­ste­hen. Das eben gezeig­te hoch­auf­lö­sen­de Bild wür­de mit die­ser Art der “Far­ben­glät­tung” in etwa so erschei­nen:

Das ist doch schon gleich wie­der ein gan­zes Stück bes­ser, oder?

Eine ande­re belieb­te Vor­ge­hens­wei­se ist das fort­wäh­ren­de Wie­der­ho­len der gewähl­ten Farb­ska­la. Hät­te man zum Bei­spiel 10 Far­ben vor­ge­ge­ben, so wer­den die­se zunächst auf die Abbruch­an­zah­len 1 bis 10 ver­teilt. Für die Pixel mit der Abbruch­an­zahl 11 fängt man dann gera­de wie­der mit der ers­ten Far­be an und ver­teilt die vor­han­de­ne Farb­ska­la erneut auf alle Abbruch­an­zah­len von 11 bis 20. Das­sel­be macht man für 21 bis 30, 31 bis 40, und so wei­ter. Der Vor­teil die­ser Her­an­ge­hens­wei­se ist, dass man viel stär­ke­re Kon­tras­te erhält und die fili­gra­nen Struk­tu­ren des Grenz­be­reichs dadurch viel bes­ser erkenn­bar wer­den. Unser eben betrach­te­tes Bei­spiel wür­de mit die­ser Metho­de wie folgt dar­ge­stellt wer­den:

Natür­lich kann man die­se Farb­wie­der­ho­lung mit der zuvor erwähn­ten Far­ben­glät­tung kom­bi­nie­ren, was für unser Bei­spiel in etwa zu fol­gen­dem Ergeb­nis füh­ren wür­de:

Es gibt noch vie­le ande­re Ver­fah­ren zur mög­lichst geschick­ten Ver­tei­lung der vor­ge­ge­be­nen Far­ben. Eini­ge von ihnen ver­su­chen bei­spiels­wei­se, den Groß­teil der vor­han­den Far­ben auf die Nähe des Grenz­be­rei­ches zu ver­tei­len, damit dort mehr Farb­dif­fe­ren­zie­run­gen ent­ste­hen, so dass also nicht so vie­le Far­ben für die gro­ßen undif­fe­ren­zier­ten Gebie­te außer­halb der Men­ge “ver­schwen­det” wer­den.

Wirk­lich bedeut­sam wer­den aber all die­se Über­le­gun­gen erst dann, wenn man sich die Details der Grenz­be­rei­che genau­er anse­hen will, denn erst dann macht es einen erheb­li­chen Unter­schied, ob man die dort anzu­tref­fen­den unglaub­lich kom­ple­xen Struk­tu­ren bes­ser oder schlech­ter erken­nen kann.

Aber wie macht man das eigent­lich? Wie kann man sich belie­big klei­ne Aus­schnit­te der Man­del­brot­men­ge im Detail dar­stel­len las­sen?

Ein­tau­chen

Will man sich Details der Man­del­brot­men­ge genau­er anse­hen – also qua­si in die Men­ge hin­ein­zoo­men – dann muss man unser oben beschrie­be­nes Visua­li­sie­rungs­ver­fah­ren ein­fach für einen klei­ne­ren Bereich der Man­del­brot­men­ge anwen­den. Erin­nern wir uns: wir hat­ten für unser obi­ges Lehr­bei­spiel auf der reel­len Ach­se den Bereich von -2 bis 2 und auf der ima­gi­nä­ren Ach­se den Bereich von -1 bis 1 gewählt.

Genau­so gut könn­ten wir doch aber einen sehr viel klei­ne­ren Bereich unse­rer Men­ge vor­wäh­len. Zum Bei­spiel auf der reel­len Ach­se den Bereich von -0,27249999999999974 bis -0,21977499999999983 und auf der ima­gi­nä­ren Ach­se den Bereich von 0,6608750000000001 bis 0,6345125000000001:

Das ent­spricht etwa dem in fol­gen­der Dar­stel­lung gelb umran­de­ten Bereich der gesam­ten Man­del­brot­men­ge – also schon ein ziem­lich klei­ner Aus­schnitt:

Wen­det man auf die­sen Bereich unser Visua­li­sie­rungs­ver­fah­ren an, so erhält man bei einer Auf­lö­sung von 600 Zei­len à 1.200 Pixel und einer eini­ger­ma­ßen geschick­ten Ver­tei­lung der Far­ben auf die jewei­li­gen Abbruch­an­zah­len das fol­gen­de Ergeb­nis:

Kommt Leu­te, das ist doch echt spek­ta­ku­lär oder? Ich mei­ne, das muss man sich jetzt gera­de noch­mals klar machen: wir sehen hier nichts ande­res als einen Aus­schnitt der kom­ple­xen Ebe­ne in dem zu jedem Punkt durch ent­spre­chen­de Ein­fär­bung dar­ge­stellt wird, ob er zur Man­del­brot­men­ge gehört (dann ist er schwarz) oder nach wie­vie­len Durch­läu­fen des Man­del­brot-Trans­for­ma­tors man ansons­ten fest­ge­stellt hat, dass er es nicht tut (was durch ent­spre­chen­de Farb­ge­bung des Pixels dar­ge­stellt wird). Die­se fan­tas­ti­schen Struk­tu­ren hat sich kein Künst­ler aus­ge­dacht. Sie ste­cken ein­zig und allei­ne in der Logik der zugrun­de lie­gen­den Mathe­ma­tik. Sor­ry, aber ich fin­de das ein­fach nur gran­di­os.

Übri­gens: war­um dabei der­art kom­ple­xe und (wie ich zumin­dest fin­de) unfass­bar ästhe­ti­sche Mus­ter zustan­de kom­men, ist bis heu­te tat­säch­lich nur teil­wei­se erforscht.

Natür­lich kann man sich nach dem hier dar­ge­stell­ten Prin­zip im Grun­de jeden belie­big klei­nen Aus­schnitt der Man­del­brot­men­ge dar­stel­len las­sen. Man muss den reel­len und ima­gi­nä­ren Bereich ein­fach ent­spre­chend vor­wäh­len und sei­nen Com­pu­ter nach dem hier beschrie­be­nen Ver­fah­ren rech­nen las­sen. Das obi­ge Titel­bild die­ses Bei­trags zeigt einen auf die­se Wei­se visua­li­sier­ten Bereich. Und es zeigt auch, wie irr­sin­nig kom­plex und den­noch struk­tu­riert die Man­del­brot­men­ge bzw. ihr Grenz­be­reich ist. Und noch­mal: alle die­se Mus­ter ste­cken zwin­gend in der ein­fa­chen For­mel (“Ein­gangs­zahl mit sich selbst mul­ti­pli­zie­ren, Test­zahl hin­zu­ad­die­ren und das Gan­ze wie­der als Ein­gangs­zahl ver­wen­den”), die wir für unse­ren Trans­for­ma­tor ver­wen­den. Wahn­sinn!

Genau genom­men

Das mit den belie­big klei­nen Aus­schnit­ten ist aller­dings in der Pra­xis nicht ganz so ein­fach. Es gibt im Wesent­li­chen zwei Pro­ble­me, auf die man stößt, wenn man sich immer klei­ne­re Aus­schnit­te der Man­del­brot­men­ge anse­hen will – also immer tie­fer in ihren For­men­reich­tum ein­drin­gen will. Dazu muss zunächst ein­mal klar sein, dass unser Man­del­brot-Trans­for­ma­tor nichts wei­ter als eine didak­ti­sche Ver­an­schau­li­chung eines Pro­zes­ses ist, der in der Rea­li­tät natür­lich Teil eines Berech­nungs­vor­gangs inner­halb eines Com­pu­ter­pro­gramms ist.

Sol­che Berech­nun­gen füh­ren Com­pu­ter übli­cher­wei­se mit soge­nann­ten “Gleit­kom­ma­zah­len” aus. Das sind im Wesent­li­chen Dezi­mal­zah­len, wie wir sie in mei­nem Bei­trag zu den Reel­len Zah­len ken­nen­ge­lernt haben. Aller­dings sind Gleit­kom­ma­zah­len so auf­ge­baut, dass sie einer­seits sehr klei­ne Zah­len (und zwar mit hoher Genau­ig­keit), ande­rer­seits aber auch sehr gro­ße Zah­len (dann aller­dings mit gerin­ger Genau­ig­keit) dar­stel­len kön­nen. Den­noch kann eine Gleit­kom­ma­zahl in den heu­te übli­chen Rech­ner­ar­chi­tek­tu­ren ledig­lich bis zu 16 Stel­len der dar­zu­stel­len­den Zahl erfas­sen. Immer­hin kön­nen die­se 16 Stel­len aber um bis zu rund 1000 mit “0” auf­ge­füll­te Stel­len vom Kom­ma ent­fernt sein:

 

Ins­be­son­de­re kann man damit also grund­sätz­lich schon sehr klei­ne Zah­len dar­stel­len. Und doch: die­se Zah­len sind letzt­lich nur anhand von rund 16 Stel­len von­ein­an­der unter­scheid­bar.

Das Ers­te der bei­den oben ange­spro­che­nen Pro­ble­me besteht jetzt dar­in, dass sich die win­zi­gen Unter­schie­de zwi­schen den Zah­len, die durch benach­bar­te Pixel reprä­sen­tiert wer­den, beim Hin­ein­zoo­men in die Man­del­brot­men­ge wegen der Gren­zen der Genau­ig­keit übli­cher Gleit­kom­ma­zah­len über kurz oder lang ein­fach nicht mehr erken­nen las­sen. Benach­bar­te Pixel schei­nen somit alle für die­sel­be Zahl zu ste­hen und man sieht in der Farb­dar­stel­lung dem­entspre­chend nur noch einen ein­far­bi­gen Ein­heits­brei.

Das zwei­te Pro­blem ist der Umstand, dass die unter­schied­li­chen Abbruch­an­zah­len bei immer klei­ne­ren Abstän­den zwi­schen den Pixeln erst nach einer sehr gro­ßen Anzahl von Ite­ra­tio­nen zuta­ge tre­ten. Betrach­ten wir dazu mal die Zahl 0,25+0×i – also die Zahl 0,25. Sie gehört tat­säch­lich zur Man­del­brot­men­ge und befin­det sich in der Mit­te des in fol­gen­dem Bild der Man­del­brot­men­ge dar­ge­stell­ten roten Krei­ses:In ent­spre­chen­der Ver­grö­ße­rung sieht der zuge­hö­ri­ge Bild­be­reich unge­fähr so aus, wobei die 0,25 wie­der­um rot ein­ge­kreist ist:

Genau genom­men ist die 0,25 die größ­te reel­le Zahl (also die größ­te Zahl mit einem ima­gi­nä­ren Anteil von 0), die noch Ele­ment der Man­del­brot­men­ge ist. Jede reel­le Zahl, die grö­ßer ist als 0,25 – und sei es auch nur ein klit­ze­klei­nes Biss­chen – ist dem­zu­fol­ge nicht mehr in der Man­del­brot­men­ge ent­hal­ten.

Schau­en wir uns jetzt doch mal die Abbruch­an­zah­len (also die Anzahl an Trans­for­ma­tor­durch­läu­fen, bis zum ers­ten Mal eine Zahl mit einem Betrag grö­ßer als 2 erscheint) für ver­schie­de­ne (reel­le) Zah­len in der Nähe von 0,25 an:

Wir sehen hier unten die 0,251, dann die 0,2501, dann die 0,25001 usw. bis zur 0,250000000001. Offen­bar sind die­se Zah­len zuneh­mend näher an der 0,25, trotz­dem aber alle noch ein win­zi­ges Biss­chen grö­ßer als 0,25, so dass sie gemäß unse­ren obi­gen Aus­füh­run­gen nicht in der Man­del­brot­men­ge ent­hal­ten sind. Links sehen wir eine Ska­la, die in 500.000er-Schritten von 0 bis 3.500.000 (drei­ein­halb Mil­lio­nen) läuft. Die oran­gen Punk­te ent­lang der blau­en Linie zei­gen nun die Abbruch­an­zah­len zu den unten auf­ge­lis­te­ten Nach­barn unse­rer 0,25. Sind es bei 0,251 noch knapp 100, so sind es bei 0,2500001 schon knapp 1.000, bei 0,25000000001 knapp eine Mil­li­on und bei 0,250000000001 schon über drei Mil­lio­nen Tra­fo-Durch­läu­fe. Je näher man also der Man­del­brot­men­ge kommt, des­to höhe­re Abbruch­an­zah­len erhält man. Das war ja auch schon bei unse­rem 31×31-Lehrbeispiel ganz gut zu erken­nen – wenn­gleich nicht so extrem krass wie hier.

Das bedeu­tet aber, dass ent­spre­chend vie­le Ite­ra­tio­nen sind nötig sind, um neben­ein­an­der lie­gen­den Punk­ten in gro­ßer Nähe zur Man­del­brot­men­ge ver­schie­de­ne Far­ben zuord­nen zu kön­nen. Wür­de man etwa die maxi­ma­le Zahl an Ite­ra­tio­nen auf eine Mil­li­on begren­zen (was ja nicht gera­de wenig ist), so käme man bei Zah­len rund um unse­re 0,250000000001 (für die wir ja über drei Mil­lio­nen Durch­läu­fe benö­ti­gen, um fest­zu­stel­len, dass sie nicht zur Man­del­brot­men­ge gehört) immer zuerst an die­ses vor­ge­ge­be­ne Maxi­mum und damit zu dem Ergeb­nis, dass die Zah­len alle­samt schein­ba­re Ele­men­te der Man­del­brot­men­ge sei­en. Eine farb­li­che Unter­schei­dung zwi­schen all den Zah­len in unmit­tel­ba­rer Nähe unse­rer 0,250000000001 wäre dem­nach nicht mehr mög­lich, denn alle erschie­nen als ver­meint­li­che Ele­men­te der Man­del­brot­men­ge glei­cher­ma­ßen in tie­fem Schwarz.

Wel­che dras­ti­schen Aus­wir­kun­gen die Wahl der maxi­ma­len Ite­ra­tio­nen haben kann, soll an fol­gen­dem Bei­spiel illus­triert wer­den:

Es zeigt den Aus­schnitt der Man­del­brot­men­ge in unmit­tel­ba­rer Nähe zu unse­rer legen­dä­ren 0,25, näm­lich den­je­ni­gen zwi­schen den reel­len Zah­len 0,2508571069945988 (lin­ker Rand) und 0,25085723659336423 (rech­ter Rand) bzw. den ima­gi­nä­ren Zah­len 0,00004638390046295605 (unte­rer Rand) und  0,000046481099537030607 (obe­rer Rand) mit einer Auf­lö­sung von 900 Zei­len à 1.200 Pixeln. Die maxi­ma­le Anzahl an Ite­ra­tio­nen ist dabei auf 2.000 begrenzt. Daher erscheint der größ­te Teil des Bil­des in Man­del­brot­men­gen-Schwarz.

Was pas­siert aber, wenn wir die maxi­ma­le Anzahl an Ite­ra­tio­nen um den Fak­tor 10 (also auf 20.000) erhö­hen? Dann erhal­ten wir plötz­lich für genau den­sel­ben Aus­schnitt das fol­gen­de Bild:

Ein Ham­mer, oder? Der eben noch weit­ge­hend schwar­ze Berich erscheint nun in umwer­fen­der Kom­ple­xi­tät und es zeigt sich, das sich eine leicht ver­zerr­te Kopie des Apfel­männ­chens selbst in die­sem eben noch pech­schwar­zen Nichts ver­steckt hat­te. Sol­che Kopi­en erschei­nen übri­gens immer und immer wie­der, wenn man nur lan­ge genug im Grenz­be­reich des Apfel­männ­chens her­um­sucht. Sie wer­den “Satel­li­ten” oder manch­mal auch salopp “Mini­bro­te” genannt und sind immer durch die dün­ne, ver­äs­tel­te Struk­tur in ihrem “Hin­tern” mit dem Haupt­kör­per der Man­del­brot­men­ge ver­bun­den.

Wir sehen also: will man in die Man­del­brot­men­ge hin­ein­zoo­men und sich ihre wun­der­sam reich­hal­ti­gen und end­los kom­ple­xen Mus­ter anse­hen, so geht das nur um den Preis einer stän­dig stei­gen­den Anzahl von Durch­läu­fen durch unse­ren Trans­for­ma­tor – und zwar für jedes ein­zel­ne Pixel. So hat etwa die Her­stel­lung des  Teaser-Vide­os aus dem ers­ten Bei­trag die­ser Serie – wie in des­sen Titel­ein­blen­dung unschwer zu erken­nen ist – für die letz­ten Bil­der der gigan­ti­schen Zoom-Sequenz bis zu 750.000.000 Ite­ra­tio­nen pro Pixel benö­tigt. Das sind 750 Mil­lio­nen Durch­läu­fe durch unse­ren Trans­for­ma­tor für einen ein­zi­gen mick­ri­gen Bild­punkt der über einer Mil­li­on Punk­te pro Bild!

Aus­ge­bremst

Es liegt auf der Hand, dass für der­ar­ti­ge Berech­nun­gen selbst bei moder­nen Rech­ner­sys­te­men eine erheb­li­che Men­ge Rechen­zeit erfor­der­lich ist. Aber es ist nicht nur die eben beschrie­be­ne Not­wen­dig­keit der zuneh­mend wach­sen­den Anzahl an maxi­ma­len Ite­ra­tio­nen, durch wel­che die Dar­stel­lung klei­ne­rer Aus­schnit­te der Man­del­brot­men­ge erheb­lich ver­lang­samt wird. Will man näm­lich dem zuerst geschil­der­ten Pro­blem mit der begrenz­ten Genau­ig­keit der Zah­len­dar­stel­lung bei­kom­men, so geht das letzt­lich nur, indem man die fest ein­ge­bau­te Zah­len­dar­stel­lung des gege­be­nen Rech­ners igno­riert und sich statt­des­sen sei­ne eige­ne Gleit­kom­ma-Arith­me­tik pro­gram­miert. Das ist auch durch­aus mög­lich und – ehr­lich gesagt – bereits mit Pro­gram­mier­kennt­nis­sen aus den ers­ten Semes­tern eines klas­si­schen Infor­ma­tik­stu­di­ums pro­blem­los zu stem­men. Damit kann man also letzt­lich einen nahe­zu belie­bi­gen Genau­ig­keits­grad für das Rech­nen mit Zah­len in Dezi­mal­dar­stel­lung errei­chen.

Ey Aldä – wenn gipps Löz­zung für Prro­blem, war­um stres­su uns damit?

Naja, ich habe ja nicht gesagt, dass die­se Lösung wirk­lich der Weis­heit letz­ter Schluss ist. Wahr ist halt lei­der auch, dass eine sol­che “pro­gram­mier­te” Zah­len­dar­stel­lung unfass­bar viel lang­sa­mer arbei­tet, als die fest im Rech­ner ein­ge­bau­te Arith­me­tik. Die­se ist näm­lich auf abso­lut bra­chia­le Per­for­mance getrimmt. So kann etwa ein typi­scher Haupt­pro­zes­sor aus Intels Core-i7-Serie (also genau so einer, wie er in Eurem Lap­top oder Tisch­rech­ner tickt) locker um die 100 Mil­li­ar­den Gleit­kom­ma­ope­ra­tio­nen pro Sekun­de aus­füh­ren. HUNDERT MILLIARDEN Gleit­kom­m­a­mul­ti­pli­ka­tio­nen in EINER SEKUNDE! Ist das nicht abge­fah­ren? So ein Ding tickt voll­kom­men unmerk­lich in Eurem Rech­ner und kei­ner macht sich eigent­lich klar, was für eine enor­me Leis­tungs­fä­hig­keit in so einem Chip steckt.

Pro­gram­miert man sich hin­ge­gen sei­ne eige­ne Gleit­kom­ma-Arith­me­tik, so benö­tigt man für jede damit zu berech­nen­de Mul­ti­pli­ka­ti­on hun­der­te – wenn nicht gar tau­sen­de – von Arbeits­tak­ten unse­res Haupt­pro­zes­sors. Das wäre unge­fähr so, als wür­de ich nicht direkt mit mei­nem Auto fah­ren, son­dern statt­des­sen mit der Dre­hung der Räder mei­nes Autos einen Strom­ge­ne­ra­tor antrei­ben wol­len, des­sen Strom eine Spu­le erhitzt, die wie­der­um den Kes­sel einer Dampf­ma­schi­ne auf­heizt, mit der ein Pro­pel­ler ange­trie­ben wird, des­sen Rück­stoß mich dann letz­ten Endes zum Rol­len bringt:

Es liegt auf der Hand, dass auf die­sem Wege fast die gesam­te Vor­triebs­en­er­gie mei­nes Autos auf der Stre­cke bleibt. Auf ver­gleich­bar dras­ti­sche Wei­se wür­de die Rechen­leis­tung mei­nes Com­pu­ters ver­geu­det, wenn anstel­le der ein­ge­bau­ten Arith­me­tik eine selbst pro­gram­mier­te ver­wen­det wür­de.

Kurz: wenn man mit Hil­fe selbst pro­gram­mier­ter Arith­me­tik eine erhöh­te Genau­ig­keit erzie­len möch­te, erkauft man sich die­se durch eine extre­me Ver­lang­sa­mung der zuge­hö­ri­gen Berech­nun­gen.

Die­ser Effekt zusam­men mit dem zuvor dis­ku­tier­ten Phä­no­men, dass man immer mehr Ite­ra­tio­nen pro Pixel berech­nen muss, wenn man die Details kleins­ter Aus­schnit­te der Man­del­brot­men­ge erken­nen kön­nen möch­te, führt bedau­er­li­cher Wei­se dazu, dass die Berech­nung sol­cher Aus­schnit­te in aller Regel sehr viel Zeit in Anspruch nimmt. Sicher: die Com­pu­ter unse­rer Zeit war­ten mit einer noch vor weni­gen Jah­ren abso­lut unvor­stell­ba­ren Rechen­leis­tung auf. So brin­gen es Spe­zi­al­pro­zes­so­ren, wie sie heu­te in moder­nen Gra­fik­kar­ten ver­baut wer­den, ohne mit der Wim­per zu zucken gut und ger­ne auf über 10 Bil­lio­nen Gleit­kom­ma­ope­ra­tio­nen pro Sekun­de! Und den­noch: zoomt man weit genug in die Man­del­brot­men­ge hin­ein, so ist es am Ende nur eine Fra­ge der Zeit, bis man so tief vor­ge­drun­gen ist, dass auch die schnells­ten Pro­zes­so­ren klein­laut in die Knie gehen und man dann see­ehr lan­ge auf sein hüb­sches Man­del­brot-Bild war­tet. Wenn wir uns dazu noch­mals das obi­ge Abbruch­an­zah­len-Dia­gramm anse­hen, wird näm­lich deut­lich, dass sich allein die Anzahl an min­dest-Ite­ra­tio­nen pro hun­dert­fa­cher Erhö­hung der Ver­grö­ße­rungs­stu­fe schon ver­zehn­facht:

So sieht man bei 0,250000001 einen klei­nen grü­nen Strich bis zum dar­über gele­ge­nen gel­ben Punkt, der bei rund 100.000 Ite­ra­tio­nen liegt. Bei 0,25000000001 sind es hin­ge­gen zehn Stri­che der­sel­ben Län­ge bis zum zuge­hö­ri­gen gel­ben Punkt bei ca. 1.000.000 Ite­ra­tio­nen. Das­sel­be gilt für das Ver­hält­nis zwi­schen 0,2500000001 und 0,250000000001: bei ers­te­rem haben wir etwas über 300.000 Ite­ra­tio­nen (ein lila Strich), bei zwei­te­rem über 3.000.000 Ite­ra­tio­nen (zehn Stri­che der­sel­ben Län­ge). Und bei alle­dem ist das Pro­blem mit der Rechen­ge­nau­ig­keit noch gar nicht berück­sich­tigt.

In der Pra­xis führt das dazu, dass die Aller­meis­ten der am Markt erhält­li­chen Programme/Apps zur Dar­stel­lung der Man­del­brot­men­ge ab einer gewis­sen Ver­grö­ße­rungs­stu­fe ein­fach nicht mehr wei­ter­rech­nen. Man gelangt also gefühlt an eine Art Ende der Rei­se in die Tie­fen des Apfel­männ­chens. Die­je­ni­gen Pro­gram­me, die den­noch ein wei­te­res Hin­ein­zoo­men erlau­ben, wer­den ab dann erheb­lich lang­sa­mer, so dass einem auch ohne künst­li­ches Ende der Zoo­me­rei irgend­wann schlicht­weg die Geduld aus­geht.

Und doch: es gibt da ein paar gal­li­sche Dör­fer unter den Man­del­brot­men­gen-Visua­li­sie­rungs­pro­gram­men, die es trotz­dem schaf­fen, extre­me Zoom-Stu­fen zu berech­nen. Dazu nut­zen sie den Umstand aus, dass die Unter­schie­de in den Abbruch­an­zah­len zwi­schen benach­bar­ten Pixeln bei höhe­ren Ver­grö­ße­rungs­stu­fen in der Regel nur sehr klein sind. Man kann also aus den Aus­ga­be­wer­ten unse­res Trans­for­ma­tors für ein bestimm­tes Pixel mit rela­tiv gerin­gem Auf­wand die Aus­ga­be­wer­te der benach­bar­ten Pixel bestim­men. Für die­se Berech­nung genügt dann die Genau­ig­keit der ein­ge­bau­ten Gleit­zahl­arith­me­tik unse­res Com­pu­ters. Mit der­ar­ti­gen Ver­fah­ren wird somit erreicht, dass man sich die voll­stän­di­ge Berech­nung der aller­meis­ten Pixel inner­halb eines Bil­des spa­ren kann. Statt­des­sen ermit­telt man ihre Fär­bung aus den Wer­ten eini­ger weni­ger Refe­renz-Pixel. Man muss also nur noch die­se weni­gen Refe­renz-Pixel auf die unge­lieb­te Hard­core-Art berech­nen – der Rest geht dann erstaun­lich schnell.

Wer auf sowas kommt und war­um er das tut? Ey Leu­te, Ihr habt ja kei­ne Ahnung, wie ech­te Nerds ticken. Wer will denn schon mit Freun­den quat­schen oder sich gar in der undank­ba­ren Jagd nach dem ande­ren Geschlecht auf­rei­ben? Sperrt uns Nerds lie­ber mit unse­rem Rech­ner in ein dunk­les Käm­mer­lein, schiebt uns zwei­mal am Tag eine Piz­za und ein paar Cola-Dosen unterm Tür­schlitz durch – und schon flutscht das mit den Pro­gram­men, die die Welt nicht braucht.

Fazit

In die­sem Bei­trag haben wir erfah­ren, wie man die legen­dä­ren Visua­li­sie­run­gen der Man­del­brot­men­ge tat­säch­lich berech­nen kann. Wir haben gese­hen, dass man dafür die ein­zel­nen Pixel sei­nes Dis­plays durch­geht und zu jedem die­ser Pixel den Man­del­brot-Trans­for­ma­tor lau­fen lässt. Die dafür vor­ein­zu­stel­len­de Zahl ergibt sich dabei aus dem jeweils gewähl­ten Aus­schnitt der kom­ple­xen Ebe­ne und der Lage des gera­de betrach­te­ten Pixels inner­halb die­ses Aus­schnitts.

Wei­ter haben wir gese­hen, dass wir dabei nicht nur unter­schei­den, ob unser Pixel einer Zahl ent­spricht, die zur Man­del­brot­men­ge gehört, oder nicht. Viel­mehr schau­en wir uns für die­je­ni­gen Pixel, die nicht zur Man­del­brot­men­ge gehö­ren, genau­er an, nach wie vie­len Trans­for­ma­tor-Durch­läu­fen (Ite­ra­tio­nen) wir zum ers­ten Mal den ver­rä­te­ri­schen Aus­ga­be­wert mit einem Betrag grö­ßer als 2 erhal­ten. Die­se Anzahl an Durch­läu­fen – wir hat­ten sie “Abbruch­an­zahl” genannt – bestimmt dann die Far­be für unser Pixel. Dabei haben wir fest­ge­stellt, dass man umso höhe­re Abbruch­an­zah­len erhält, je näher man dem Grenz­be­reich zur Man­del­brot­men­ge kommt.

Schließ­lich haben wir gelernt, dass die Betrach­tung immer klei­ne­rer Aus­schnit­te der Man­del­brot­men­ge zu einem immer wei­ter zuneh­men­den Rechen­auf­wand führt, da wir einer­seits zur Dif­fe­ren­zie­rung der Pixel-Ein­fär­bung immer mehr Ite­ra­tio­nen zulas­sen müs­sen, ande­rer­seits aber auch den Genau­ig­keits­ein­schrän­kun­gen der fest ein­ge­bau­ten Arith­me­tik unse­res Com­pu­ters bei­kom­men müs­sen, indem wir unse­re eige­ne Gleit­kom­ma-Arith­me­tik pro­gram­mie­ren, was aber dum­mer­wei­se mit extrem gestei­ger­tem Rechen­auf­wand ein­her­geht.

Die gute Nach­richt: mit frei erhält­li­chen Pro­gram­men zur visu­el­len Erfor­schung der Man­del­brot­men­ge kann man sich den­noch sehr vie­le Berei­che der Man­del­brot­men­ge erschlie­ßen und sich von der fas­zi­nie­ren­den Ästhe­tik die­ser Dar­stel­lun­gen gera­de­zu berau­schen las­sen. Das aller­dings schau­en wir uns im nächs­ten Bei­trag mal etwas genau­er an. Da zei­ge ich Euch dann mal ein paar spek­ta­ku­lä­re Bil­der und Zoom-Sequen­zen und wer­de zudem auf frei erhält­li­che Soft­ware ver­wei­sen, mit der Ihr Euch selbst auf For­schungs­rei­se in die Tie­fen der Man­del­brot­men­ge bege­ben könnt.

Alles Lie­be

Dani­el

Kommentiere diesen Beitrag als Erste(r)

Kommentar verfassen

Letz­te Bei­trä­ge

Kate­go­ri­en

%d Bloggern gefällt das: