Wie kann man einen iterativen Plot eleganter schreiben?
Ich verwende `pgfplots` zum Zeichnen eines Feigenbaum-Diagramms. Das ist ein [Bifurkationsdiagramm][1] der [logistischen Gleichung][2], ein klassisches Beispiel von chaotischem Verhalten nach einer einfachen Gleichung.
Mit einem simplen 2D-Plot `\addplots coordinates {...}` plotte ich eine Vielzahl von Koordinaten, die ich in einer verschachtelten Schleife mit Lua ausrechnen lasse. Die Berechnung ist langwierig - wer testet, sollte für r größere Schritte wählen (dritter Parameter der for-Schleife) und kleinere Werte Bereiche für j, i, dann ist die Grafik nicht mehr so fein und rechenintensiv. LuaTeX wird benötigt.
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\usepackage{luacode}
\begin{luacode*}
function logistic()
local function map(r,x)
return r*x*(1-x)
end
for r = 2.5,4,0.005 do
x = 0.1
for j i = 1, 200 do
x = map(r,x)
end
for j i = 1, 250 do
x = map(r,x)
tex.sprint("("..r..","..x..")")
end
end
end
\end{luacode*}
\begin{document}
\begin{tikzpicture}
\begin{axis}[tick label style={font=\tiny}]
\edef\plot{\noexpand\addplot \edef\logisticplot{\noexpand\addplot [color=black!10, mesh, only marks,
mark size = 0.05pt, opacity = 0.1] coordinates{ \directlua{logistic()} };}
\plot
\logisticplot
\end{axis}
\end{tikzpicture}
\end{document}
Mit r in Schritten von 0.001 erhalte ich diese Grafik:
![Feigenbaum-Diagramm][3]
Noch zur Info: für die Werte von r werden x-Werte iterativ ausgerechnet, eine erste Anzahl Werte verworfen und nicht geplottet, um bei einer gewissen Stabilität mit der Ausgabe zu beginnen.
Die Konstruktion mit `\edef` und `\noexpand` verwende ich, damit `\addplot` die Koordinaten expandiert übergeben erhält. mesh mit opacity (Transparenz) verwende benutze ich zusammen mit hellem Grau, um eine Dichte zu erkennen.
Nun endlich zur Problemstellung: kann man das sampling `pgfplots` überlassen, statt zwei Schleifen für r und j i zu schachteln? Ideen beispielsweise:
- r als Parameter von einem `\addplot` laufen zu lassen, mit einer vorgegebenen Zahl an samples
- einen 3D-Plot mit `\addplot3` erzeugen, als Argumente laufen r und j, i, die dritte berechnete Koordinate ist das x, ausgegeben wird ein 2D-Blick auf die t/x-Ebene mit view={0}{0}, mit einem `z filter` eine anfängliche Zahl von Werten wie oben verworfen, insgesamt ähnlich wie in [Christians Mandelbrot-Plot][4].
[1]: http://de.wikipedia.org/wiki/Bifurkationsdiagramm#Bifurkationsdiagramm
[2]: http://de.wikipedia.org/wiki/Logistische_Gleichung
[3]: http://texwelt.de/wissen/upfiles/feigenbaum.png
[4]: http://texwelt.de/wissen/fragen/3960/fraktale-mit-pgfplots/3993