Fraktale mit pgfplots
Nach dem Start von [PGFplots.net][1] experimentierte ich ein bisschen mehr mit pgfplots. Dabei fragte ich mich, wie ich das bei jeder Grafiksoftware tue, wie sich damit Fraktale darstellen lassen und ob es dabei evtl. nützliche oder interessante Aspekte gibt. Geschwindigkeit und Speicherplatz sind hier nebensächlich, Kapazitäten ändern sich eh mit der Zeit.
Mich interessiert beispielsweise
- ob ich iterativ definierte Funktionen übergeben und plotten kann
- ob sich Farbräume (colormaps) nutzen lassen, wie für die Iterationszahl
- sind geometrische Transformationen gut einsetzbar, wie bei iterierten Funktionssystemen (IFS, wie Barnsley Farn)
- geht es auch dreidimensional
Es sind viele Fragen - wenn es sich ergibt, teilen wir das gern auf (kommentiert gern hierzu), jede interessante Antwort mit Beispiel ist willkommen.
Hier habe ich ein Beispiel gemacht, inspiriert von [Herberts][2] Darstellung einer [Weierstraß-Funktion][3]. Die mit Lua errechneten Werte werden in einer Tabelle gespeichert (hier 0,6 MB groß), die dann mit geringem Aufwand geplottet wird. Kann pgfplots hier mehr übernehmen, während der Berechnung, so dass ich keine externen Tabelle brauche? Kann man Farbigkeit einbringen, wie in den bekannten bunten Mandelbrot-Bildern?
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.8}
\usepackage{luacode}
\begin{luacode}
function mandelbrot(x0, x1, y0, y1, steps, max_iter, max)
local dx = (x1-x0)/steps
local dy = (y1-y0)/steps
local cx = x0
local out=assert(io.open("tmp.data","w"))
local x,y,cy,xtemp,ytemp,squaresum,iter
while (cx <= x1) do
cy = y0
while (cy <= y1) do
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
if (iter >= max_iter) then out:write(cx, " ", cy, " ", "\string\n") end
cy = cy + dy
end
cx = cx + dx
end
out:close()
end
\end{luacode}
\begin{document}
\begin{tikzpicture}
\directlua{mandelbrot(-2,1,-2,2,500,10000,9999)}
\directlua{mandelbrot(-2,1,-2,2,500,1000,4)}
\begin{axis}[domain=-2:2,tick label style={font=\tiny},]
\addplot [only marks, mark=*, mark size=0.06pt] table {tmp.data};
\end{axis}
\end{tikzpicture}
\end{document}
![Mandelbrot-Menge][4]
[1]: http://pgfplots.net
[2]: http://texwelt.de/wissen/benutzer/15/herbert
[3]: http://pgfplots.net/tikz/examples/weierstrass-function/
[4]: http://texwelt.de/wissen/upfiles/mandelbrot-menge.pnghttp://texwelt.de/wissen/upfiles/mandelbrot-menge.png