image image


image

Die Reise ins Seepferdchental

Inspiriert durch ein Kapitel des am Freitag vorgestellten Processing-Buches hatte ich mich am Wochenende hingesetzt und mich erneut an die Urmutter aller Fraktale, die Mandelbrotmenge (auch Apfelmännchen genannt) gewagt. Ich wollte das »Seepferdchental« (Seahorse Valley) erkunden, das ist der Bereich zwischen Kopf und Körper des Apfelmännchens, der viele spiralähnliche Strukturen aufweist, die ein wenig an Seepferdchen erinnern. Und natürlich wollte ich es in Python programmieren.

image image image image
image image image image

Die Bilder zeigen: Wenn man tief genug in den Rand der Mandelbrotmenge hineinzoomt, erscheint in der siebten Abbildung wieder eine Untermenge der Madelbrotmenge.

Hier der Quelltext, mit dem ich diese Bilder erzeugt habe:

from PIL import Image
import os

maxlimit = 2.0
size = 600
file_path = os.path.dirname(os.path.abspath(__file__))
os.chdir(file_path)

# Parameter
left   = -2.25
right  = 0.75
bottom = -1.5
top    = 1.5
maxiter = 20

def mandelbrot():
    img = Image.new("RGB", (size, size), (0, 0, 0))
    for x in range(size):
        cr = left + x*(right - left)/size
        for y in range(size):
            ci = bottom + y*(top - bottom)/size
            c = complex(cr, ci)
            z = 0.0
            i = 0
            for i in range(maxiter):
                if abs(z) > maxlimit:
                    break
                z = (z**2) + c
                if i == (maxiter - 1):
                    color = (0, 0, 0)
                else:
                    color = (i%17*16, i%9*32, i%5*64)
                img.putpixel((x, y), color)
    return img


mandel = mandelbrot()

mandel.save("images/mandel1.png")
mandel.show()

print("I did it, Babe!")

Die Parameter im Quelltext ergeben das erste Bild mit der vollständigen Mandelbrotmenge. Die Parameter für alle Bilder sind der untenstehenden Tabelle zu entnehmen:

Abb.left … rightbottom … topIterationen
1-2.25 … 0.75-1.5 … 1.520
2-0.8578 … -0.66230.0225 … 0.169280
3-0.75075 … -0.738520.09898 … 0.10816160
4-0.74647 … -0.745010.1046 … 0.105694200
5-0.74598 … -0.74570.10543 … 0.105636300
6-0.745885 … -0.7458210.105481 … 0.105526600
7-0.745856 … -0.7458520.105502 … 0.1055051000
8-0.745856 … -0.7458550.1055033 … 0.1055041000

Wie Ihr seht, steigt die Anzahl der Iterationen mit jeder Vergrößerung stark an. Diese habe ich experimentell herausgefunden, während ich mich bei den anderen Paramtern an das schon über 20 Jahre alte Buch »Chaos und Fraktale selbst programmieren« von Herbert Voß gehalten habe. Dieses Buch ist ein wahre Fundgrube mit vielen Pascal-Programmen zu allem, was mit Fraktalen und Chaostheorie zusammen hängt. Es stammt aus der Zeit, als ich zum ersten Mal mit dem Thema in Berührung kam und meine ersten eigenen Apfelmännchen programmiert hatte. Wenn Ihr es irgendwo antiquarisch erstehen könnt, greift zu.

Der starke Anstieg der Iterationen geht einher mit einem ebenso starken Anstieg der benötigten Rechenzeit, für die letzten beiden Bilder muß man schon mit 100 Sekunden und mehr rechnen. Wenn man aber überlegt, daß ich in den 1980er Jahren mit meinem Atatri ST stundenlang auf ein fertiges Bild gewartet hatte, ist die heute benötigte Rechenzeit ein Riesenfortschritt. Trotzdem möchte ich in einem nächsten Beitrag zeigen, wie man das Berechnen der Bilder noch beschleunigen kann.

Da Tkinter das Objekt point nicht kennt, habe ich zur Erstellung des Bildes das Paket Pillow benutzt, die aufrufkonforme Alternative zur Python Image Library (PIL), die ja leider unter Python 3 nicht mehr läuft.

Die Farben sind ein einfacher Hack mit der Modulo-Funktion, wenn Ihr den Aufruf

color = (i%17*16, i%9*32, i%5*64)

zum Beispiel durch den Aufruf

color = (i%5*64, i%17*16, i%9*32)

ersetzt, kommt statt der blaubetonten Farbgebung eher eine Farbgebung heraus, die die rötlichen Farben in den Vordergrund stellt. Hier seid Ihr aufgefordert, selber mit den Farben zu experimentieren.

Auch ich werde meine Reise nach Fraktalien mit weiteren Experimenten fortsetzen. Ich hätte nämlich nicht gedacht, daß die Beschäftigung damit mir nach so vielen Jahren immer noch Spaß bringt. Still digging!

[Update (15. Januar 2019)]: In der ursprünglichen Version des Quellcodes gab es noch ein paar von der ersten (numpy-basierten) Version des Sketches übriggebliebene Artefakte. Die habe ich heute beseitigt.


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung


Werbung


image  image  image
image  image  image


image