Ich plotte manchmal komplexe Funktionen, wo sehr oft Sinus und Kosinus auftauchen. pgfplots erwartet ja Grad als Einheit für das Argument einer trigonometrischen Funktion, ich rechne jedoch eigentlich mit Radiant.

Nun kann man einfach mit deg() umrechnen lassen. Doch in großer Menge sieht das nicht mehr schön aus. Hier ein Beispiel, wo ich eine parametrische pseudosphärische Blasebalg-Oberfläche plotte. Oder auch Parametric Breather Pseudospherical Surface. Ich kann sie ja mal als Blüte ausgeben ;-) daher habe ich sie entsprechend eingefärbt.

Ich übersetze mit LuaTeX, da bei hoher Sample-Anzahl wie hier sonst mit pdfLaTeX ein Fehler kommt, kleinere Sample-Zahlen von ca. 40 sind hingegen kein Problem mit pdfLaTeX.

Open in writeLaTeX
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
      view = {60}{-60},
      hide axis,
      colormap = {flower}{%
        color(0cm)  = (yellow);       color(4cm)  = (orange);
        color(8cm)  = (red!40!black); color(12cm) = (red!80!black); 
        color(16cm) = (green);        color(20cm) = (green!20!black)},
    ]
    \addplot3[
      surf,
      z buffer = sort,       point meta = u,
      domain   = -13.2:13.2, domain y   = -37.4:37.4,
      samples  = 80,         samples y  = 120,
      variable = \u,         variable y = \v      
    ] 
    ( { -u + (2*0.84*cosh(0.4*u)*sinh(0.4*u))/(0.4*((sqrt(0.84)*cosh(0.4*u))^2
        + (0.4*sin(deg(sqrt(0.84)*v)))^2)) },
      { (2*sqrt(0.84)*cosh(0.4*u)*(-(sqrt(0.84)*sin(deg(v))
        * cos(deg(sqrt(0.84)*v))) + cos(deg(v))*sin(deg(sqrt(0.84)*v))))/(0.4
        * ((sqrt(0.84)*cosh(0.4*u))^2 + (0.4*sin(deg(sqrt(0.84)*v)))^2)) },
      { (2*sqrt(0.84)*cosh(0.4*u)*(-(sqrt(0.84)*cos(deg(v))
        * cos(deg(sqrt(0.84)*v))) - sin(deg(v))*sin(deg(sqrt(0.84)*v))))/(0.4
        * ((sqrt(0.84)*cosh(0.4*u))^2 + (0.4*sin(deg(sqrt(0.84)*v)))^2)) });
    \end{axis}
\end{tikzpicture}
\end{document}

Parametric Breather Pseudospherical Surface Plot

Kann man durch ein Feature von pgfplots von degree auf radian umstellen? Oder durch eine eigene kleine Reprogrammierung? Wenn das eher ein Feature-Request ist, dann möchte ich meinen Wunsch mit dieser Blume freundlich überreichen.

gefragt 30 Jun '14, 18:37

stefan's gravatar image

stefan ♦♦
18.1k143048
Akzeptiert-Rate: 48%

Mit LuaLaTeX aus MiKTeX 2.9 bekomme ich bei der Sample-Anzahl auch einen Fehler. Unter TL 2014 funktioniert das dagegen.

(01 Jul '14, 09:00) esdd

Innerhalb der naechsten vier Wochen wird die neue Version pgfplots 1.11 rauskommen.

Diese wird mit global konfigurierbarem Format fuer trigonometrische Funktionen kommen: man schreibt dann \pgfplotsset{trig format plots=rad} in die Praeambel -- und alle plot expressions werden automatisch mit radians gerechnet.

Das angefragte Beispiel wuerde damit

Open in writeLaTeX
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}

\pgfplotsset{trig format plots=rad}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[
      view = {60}{-60},
      hide axis,
      colormap = {flower}{%
        color(0cm)  = (yellow);       color(4cm)  = (orange);
        color(8cm)  = (red!40!black); color(12cm) = (red!80!black); 
        color(16cm) = (green);        color(20cm) = (green!20!black)},
    ]
    \addplot3[
      surf,
      z buffer = sort,       point meta = u,
      domain   = -13.2:13.2, domain y   = -37.4:37.4,
      samples  = 80,         samples y  = 120,
      variable = \u,         variable y = \v      
    ] 
    ( { -u + (2*0.84*cosh(0.4*u)*sinh(0.4*u))/(0.4*((sqrt(0.84)*cosh(0.4*u))^2
        + (0.4*sin(sqrt(0.84)*v))^2)) },
      { (2*sqrt(0.84)*cosh(0.4*u)*(-(sqrt(0.84)*sin(v)
        * cos(sqrt(0.84)*v)) + cos(v)*sin(sqrt(0.84)*v)))/(0.4
        * ((sqrt(0.84)*cosh(0.4*u))^2 + (0.4*sin(sqrt(0.84)*v))^2)) },
      { (2*sqrt(0.84)*cosh(0.4*u)*(-(sqrt(0.84)*cos(v)
        * cos(sqrt(0.84)*v)) - sin(v)*sin(sqrt(0.84)*v)))/(0.4
        * ((sqrt(0.84)*cosh(0.4*u))^2 + (0.4*sin(sqrt(0.84)*v))^2)) });
    \end{axis}
\end{tikzpicture}
\end{document}

alt text

Vorab Versionen wird es in Kuerze unter http://pgfplots.sourceforge.net/ geben.

Zu beachten ist, dass der systemdefault in den folgenden Versionen nicht auf Radians umgestellt wird - das waere doch ein grosser Bruch (selbst mit compat=1.11 wird weiterhin deg verwendet). Man wird manuell trig format plots=rad schreiben, wenn man umstellen will.

Permanenter link

beantwortet 07 Jul '14, 21:13

cfeuersaenger's gravatar image

cfeuersaenger
3.7k23
Akzeptiert-Rate: 34%

bearbeitet 07 Jul '14, 21:15

Man kann auch den Bereich der Parameter umstellen, z.B. von 0:pi auf 0:180, dann kann man auf deg() in den Argumenten trigonometrischer Funktionen verzichten. Ggf. muss man anderswo jedoch noch rad() anwenden, wie etwa oben bei cosh oder sinh.

Hier ein Beispiel, was komplett in Grad rechnet. Es ist die Oberfläche einer Kugelflächenfunktion, spherical harmonic surface, entsprechend einer Funktion hier, original in Radiant. Wieder mit LuaLaTeX zu übersetzen, weil bei der hohen Anzahl samples pdfLaTeX TeX capacity exceeded kommt.

Open in writeLaTeX
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\renewcommand*{\r}{(sin(4*u)^3 + cos(2*u)^3 + sin(6*v)^2 + cos(6*v)^4)}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
      view = {120}{310},
      hide axis,
      colormap = {flower}{
        color(0cm)  = (yellow);       color(4cm)  = (yellow!70!red);
        color(8cm)  = (red!60!black); color(12cm) = (red!90!black); 
        color(16cm) = (green);        color(20cm) = (green!20!black)},
    ]
    \addplot3[
      surf,
      z buffer = sort,  point meta = u,
      domain   = 0:180, domain y   = 0:360,
      samples  = 80,    samples y  = 80,
      variable = \u,    variable y = \v      
    ] 
    ( { \r*sin(u)*cos(v) },
      { \r*cos(u) },
      { \r*sin(u)*sin(v) } );
  \end{axis}
\end{tikzpicture}
\end{document}

Spherical harmonic surface plot

Permanenter link

beantwortet 01 Jul '14, 00:20

stefan's gravatar image

stefan ♦♦
18.1k143048
Akzeptiert-Rate: 48%

Eine einfache Umstellung von Grad auf Radiant ist vermutlich bisher nicht vorgesehen. Aber man kann sich zum Beispiel mittels declare function so eine Art Abkürzung dafür definieren:

Open in writeLaTeX
\tikzset{
  declare function={
    sinr(\w)=sin(deg(\w));
    cosr(\w)=cos(deg(\w));
  }
}

Das kann man dann aber auch benutzen, um die gesamte Koordinatenangabe übersichtlicher zu machen und auch eine Parameteränderung zu erleichtern:

Open in writeLaTeX
\tikzset{
  declare function={
    a=.4;% Parameterangabe
    b=1-a^2;
    sinr(\w)=sin(deg(\w));
    cosr(\w)=cos(deg(\w));
    nenner(\u,\v)=(a*((sqrt(b)*cosh(a*\u))^2+ (a*sinr(sqrt(b)*\v))^2));
  }
}

Damit ergibt sich der folgende Code:

Open in writeLaTeX
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\begin{document}
\begin{tikzpicture}
  \tikzset{
    declare function={
      a=.4;% Parameter
      b=1-a^2;
      sinr(\w)=sin(deg(\w));
      cosr(\w)=cos(deg(\w));
      nenner(\u,\v)=(a*((sqrt(b)*cosh(a*\u))^2+ (a*sinr(sqrt(b)*\v))^2));
    }
  }
  \begin{axis}[
      view = {60}{-60},
      hide axis,
      colormap = {flower}{%
        color(0cm)  = (yellow);       color(4cm)  = (orange);
        color(8cm)  = (red!40!black); color(12cm) = (red!80!black); 
        color(16cm) = (green);        color(20cm) = (green!20!black)},
    ]
    \addplot3[
      surf,
      z buffer = sort,       point meta = u,
      domain   = -13.2:13.2, domain y   = -37.4:37.4,
      samples  = 80,         samples y  = 120,
      variable = \u,         variable y = \v      
    ] 
    ( { -u + (2*b*cosh(a*u)*sinh(a*u))/nenner(u,v) },
      { (2*sqrt(b)*cosh(a*u)
        *(-(sqrt(b)*sinr(v)* cosr(sqrt(b)*v)) + cosr(v)*sinr(sqrt(b)*v)))
        /nenner(u,v) },
      { (2*sqrt(b)*cosh(a*u)
        *(-(sqrt(b)*cosr(v)* cosr(sqrt(b)*v)) - sinr(v)*sinr(sqrt(b)*v)))
        /nenner(u,v) });
    \end{axis}
\end{tikzpicture}
\end{document}

Das Ergebnis für a=.4 ist das gleiche wie in der Frage, deshalb folgt hier das Resultat für a=.6

alt text

Permanenter link

beantwortet 01 Jul '14, 08:56

esdd's gravatar image

esdd
17.7k254256
Akzeptiert-Rate: 62%

declare function ist hier sehr hilfreich! Schön, dass gleich eine Variation genommen wurde für mehr Abwechslung.

(01 Jul '14, 10:30) stefan ♦♦
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:

×728
×296
×20
×10

gestellte Frage: 30 Jun '14, 18:37

Frage wurde gesehen: 18,627 Mal

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