Komplexe Fraktale mit TikZ

Neulich besann ich mich in nostalgischer Weise zurück an die Zeit der 80er, als ich auf einem 8-bit Kleincomputer Nächte hindurch Fraktale berechnete, angefangen mit dem “Apfelmännchen”. Unter dem Namen kennt man die Mandelbrot-Menge, eine sehr formenreiche Menge in der komplexen Zahlenebene. Das meinte ich mit komplex – ihre Struktur ist es aber auch. Faszinierend, dass innerhalb dieses chaotisch erscheinenden Konstrukts dennoch Ähnlichkeiten und Gesetzmäßigkeiten auftreten.

Wenn man früher einen Text über Fraktale schrieb, generierte man Grafiken mit speziellen Programmen, die man in sein Dokument hineinkopierte. Schreibe ich heute mit LaTeX einen Artikel über Fraktale, so könnte ich sie direkt im Dokument definieren und sie würden automatisch mit berechnet und im Text ausgegeben.

Das habe ich nun mal durchgezogen:

  • Berechnung des Fraktales durch einige eingebettete Lua-Zeilen
  • Ausgabe mit dem PGFPlots-Paket
  • Übersetzen mit LuaLaTeX

PGFPlots übernimmt gleich das Sampling, also das punktweise Durchgehen der Ebene als Ausgangswerte, Lua berechnet den jeweiligen Punkt, PGFplots färbt entsprechend ein und gibt aus. Wenn ich möchte, auch mit Achsen und Beschriftung.

Ich habe das einmal programmiert und auf TeXwelt gepostet, Christian brachte noch eine Verbesserung ein, so haben wir dieses Resultat:

% !TEX lualatex
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.8}
\usepackage{luacode}
\begin{luacode}
  function mandelbrot(cx, cy, max_iter, max)
    local x, y, xtemp, ytemp, squaresum, iter
    squaresum = 0
    x = 0
    y = 0
    iter = 0
    while (squaresum <= max) and (iter < max_iter) do
      xtemp = x * x - y * y + cx
      ytemp = 2 * x * y + cy
      x = xtemp
      y = ytemp
      iter = iter + 1
      squaresum = x * x + y * y
    end
    local result = 0
    if (iter < max_iter) then
        result = iter
    end
    tex.print(result);
  end
\end{luacode}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    colorbar,
    point meta max=30,
    tick label style={font=\tiny},
    view={0}{90}]
    \addplot3 [surf, domain = -1.5:0.5, shader = interp,
      domain y = -1:1, samples = 200] {
      \directlua{mandelbrot(\pgfmathfloatvalueof\x,
        \pgfmathfloatvalueof\y, 10000, 4)}
    };
  \end{axis}
\end{tikzpicture}
\end{document}

Das ist sogar ein 3D-Plot, mit der Iterations-Zahl als dritte Dimension, die wir aber nur mit view={0}{90} als “Draufsicht” mit ihrer Farbigkeit darstellen. Wir erhalten mit der Standard-Colormap:

Mandelbrot-Menge

Mit kleiner Modifikation, der Code steht hier, erhalten wir eine verwandte Julia-Menge, diesmal mit anderer Einfärbung:

Julia-Menge

Nun kann man mit erhöhter Iterations-Zahl hinein zoomen, das benötigt mehr Rechenleistung. Doch dann kann man wieder hochperformante Tools wie FractInt zum Forschen verwenden und damit gefundene interessante Intervalle hiermit darstellen.


Posted

in

by