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, 12:37

stefan's gravatar image

stefan ♦♦
5.8k11733
Akzeptiert: 30%

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

(01 Jul '14, 03:00) esdd

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 30 Jun '14, 18:20

stefan's gravatar image

stefan ♦♦
5.8k11733

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, 02:56

esdd's gravatar image

esdd
13.7k52950

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

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

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, 15:13

cfeuersaenger's gravatar image

cfeuersaenger
97723

bearbeitet 07 Jul '14, 15:15

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×472
×156
×17
×7

Frage gestellt: 30 Jun '14, 12:37

Frage wurde angeschaut: 6,137 Mal

Zuletzt aktualisiert: 07 Jul '14, 15:15