Ich verwende pgfplots zum Zeichnen eines Feigenbaum-Diagramms. Das ist ein Bifurkationsdiagramm der logistischen Gleichung, 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 Bereiche für i, dann ist die Grafik nicht mehr so fein und rechenintensiv. LuaTeX wird benötigt.

Open in writeLaTeX
\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 i = 1, 200 do
        x = map(r,x)
      end
      for 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\logisticplot{\noexpand\addplot [color=black!10, mesh, only marks,
      mark size = 0.05pt, opacity = 0.1] coordinates{ \directlua{logistic()} };}
    \logisticplot
  \end{axis}
\end{tikzpicture}
\end{document}

Mit r in Schritten von 0.001 erhalte ich diese Grafik:

Feigenbaum-Diagramm

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) 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 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 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.

gefragt 03 Jul '14, 22:09

stefan's gravatar image

stefan ♦♦
18.3k163148
Akzeptiert-Rate: 49%

bearbeitet 03 Jul '14, 22:58

Ich denke, dass das Problem schlicht darin besteht, dass auch bei den per luaTeX berechneten Punkten, noch immer pdfplots die Punkte noch immer auf TeX-Ebene verarbeiten muss. Die ganzen Punkte müssen also in den TeX-Hauptspeicher geschrieben und dort verarbeitet werden. Hier könnte eventuell ps-tricks überlegen sein, weil man dort das Berechnen und Plotten theoretisch auf PostScript-Ebene erledigen kann. Eine Lösung dafür habe ich aber nicht.

(04 Jul '14, 09:08) gast3

Performance oder Speicher betrachte ich erstmal nicht. Mich interessierte die Änderung des einfachen Plots von fertig berechneten Koordinaten zu einem Plot, der eine Koordinate r (oder noch besser eine Ebene r*i) durchsampelt. Für eine Koordinate r vmtl. kein Problem. Lässt man die 2. Koordinate i mit dem Plot laufen, also \addplot3 über die Variablen r,i mit Funktionswert x, hat man vmtl. das Problem, den vorangehenden Wert mitzuschleifen, etwa über z-Filter. Die Frage richtet sich auch eher pgfplots-Erfahrene, und ist eine reine Interesse-Frage, nichts dringendes.

(04 Jul '14, 15:01) stefan ♦♦

Ich denke, dass sowas schwierig ist. Die Sampling routinen von pgfplots sind als zustandslos gedacht. Ansaetze wie filter oder zustandsbehaftete pgf funktionen sind zwar denkbar, aber ich bin mir ziemlich sicher, dass Deine jetzige Implementierung uebersichtlicher und leichter anpassbar ist.

Permanenter link

beantwortet 06 Jul '14, 20:44

cfeuersaenger's gravatar image

cfeuersaenger
3.7k23
Akzeptiert-Rate: 34%

@cfeuersaenger Danke! Das ist plausibel, und mit Filter-Basteleien wird es nicht lesbarer. Wollte im Wesentlichen den Plot mal mitteilen und vllt. Verbesserungen erfahren, ähnlich wie in meinen vorangehenden pgfplots-Fragen. Vielleicht hast Du ja schon gesehen. :-) Ich experimentierte gerade gern mit pgfplots.

(06 Jul '14, 20:50) stefan ♦♦

Danke fuer den Hinweis. Freut mich, dass ich nuetzliches Beitragen konnte. Uebrigens finde ich die Resultate Deiner Experimente sehr ansehnlich und illustrativ, danke dafuer!

(07 Jul '14, 09:15) cfeuersaenger
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×731
×298
×28
×5

gestellte Frage: 03 Jul '14, 22:09

Frage wurde gesehen: 13,027 Mal

zuletzt geändert: 07 Jul '14, 09:15