Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

03 Jul '14, 22:58

stefan's gravatar image

stefan
18.4k163148

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
Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

03 Jul '14, 22:12

stefan's gravatar image

stefan
18.4k163148

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 für j, 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 = 1, 200 do x = map(r,x) end for j = 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 [color=black!10, mesh, only marks, mark size = 0.05pt, opacity = 0.1] coordinates{ \directlua{logistic()} };} \plot \end{axis} \end{tikzpicture} \end{document} Mit r=0.001 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 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 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, 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
Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

03 Jul '14, 22:09

stefan's gravatar image

stefan
18.4k163148