Seite 1 von 1

Stückweise definierte Funktion plotten

Verfasst: So 12. Mai 2013, 17:31
von Patrick1990
Hallo, ich möchte folgendes plotten:
http://s7.directupload.net/images/130512/d6v2qjkm.png

Dazu habe ich bisher versucht, dies so zu realisieren, dies klappt jedoch nicht so super.
\documentclass[11pt,fleqn]{scrartcl}

\usepackage[ngerman]{babel}
\usepackage{pgfplots,pgfplotstable} 

\begin{document} 
\begin{tikzpicture} 
\begin{axis}
\addplot gnuplot [black,domain=0:10, no marks] {1-exp(-(x/1.1))};
\addplot [black,domain=10:20, no marks] {6*exp(-(x/1.1))};
\end{axis}
\end{tikzpicture}
\end{document}
Habt ihr eine Idee?

Verfasst: So 12. Mai 2013, 18:06
von guy.brush™
Moin,

es ist meines Erachtens ein mathematisches Problem (und eines der Skalierung). Wenn du die zweite Funktion einzeln plottest, siehst du, dass sie nur noch einen sehr kleinen Bereich auf der y-Achse einnimmt. Der Grund dafuer ist, dass du die 2. Funktion nicht verschoben hast.

Wenn du die zweite Funktion jetzt um 10 nach rechts verschiebst und beide Funktionen mit 6 multiplizierst, sollte es gehen. (Ich habe den Code zur besseren Lesbarkeit etwas eingerueckt.)
\documentclass[11pt,fleqn]{scrartcl}

\usepackage[ngerman]{babel}
\usepackage{pgfplots,pgfplotstable}

\begin{document}

\begin{tikzpicture}
  \begin{axis}
    \addplot [black,domain=0:10, no marks] {6 * (1-exp(-(x/1.1)))};
    \addplot [black,domain=10:20, no marks] {6 * exp(-((x-10)/1.1))};
  \end{axis}
\end{tikzpicture}

\end{document}

Viele Gruesse

guy.brush

Verfasst: So 12. Mai 2013, 23:48
von Patrick1990
Vielen Dank,
bisher sieht es nun so aus:
\documentclass[11pt,fleqn]{scrartcl} 

\usepackage[ngerman]{babel} 
\usepackage{pgfplots,pgfplotstable} 
\usepackage[locale=DE]{siunitx}  

\begin{document} 

  \begin{tikzpicture}[scale=2]

    \begin{axis}[ 
      axis lines=middle, 
      xmin=-0.5, xmax=21, xtick={0,5,10,...,20},
      ymin=-0.5, ymax=7, ytick={0,1,2,...,6}, yscale=0.5,
      xlabel={\hspace*{5mm}t / \si{\milli\second}}, 
      ylabel={U / \si{\volt}} 
    ] 
    \addplot [black,domain=0:10, no marks] {6 * (1-exp(-(x/1.1)))}; 
    \addplot [black,domain=10:20, no marks] {6 * exp(-((x-10)/1.1))};    
    \end{axis} 
  \end{tikzpicture} 

  \begin{tikzpicture}[scale=2]

    \begin{axis}[ 
      axis lines=middle, 
      xmin=-0.5, xmax=21, xtick={0,5,10,...,20},
      ymin=-6, ymax=7, ytick={-6,-4,-2,...,6}, yscale=0.5,
      xlabel={\hspace*{5mm}t / \si{\milli\second}}, 
      ylabel={I / \si{\milli\ampere}} 
    ] 
    \addplot [blue,domain=0:10, no marks] {5.45 * (exp(-(x/1.1)))};
    \addplot [blue,domain=10:20, no marks] {-5.45 * exp(-((x-10)/1.1))};    
    \end{axis} 
  \end{tikzpicture} 

\end{document} 
Ist es möglich bei x=10 einen senkrechten Strich (dashed) einzufügen? weiterhin würde ich auch gern im unteren Bild den Sprung des Stromes blau gekennzeichnet haben und eventuell die zahlen der Achseneinteilung etwas kleiner.


Vielen Dank.

Verfasst: Mo 13. Mai 2013, 01:59
von guy.brush™
Moin,

kloar geht das :).
\documentclass[11pt,fleqn]{scrartcl}

\usepackage[ngerman]{babel}
\usepackage{pgfplots,pgfplotstable}
\usepackage[locale=DE]{siunitx}  

\begin{document}

  \begin{tikzpicture}[scale=2]

    \begin{axis}[
      axis lines=middle,
      xmin=-0.5, xmax=21, xtick={0,5,10,...,20},
      ymin=-0.5, ymax=7, ytick={0,1,2,...,6}, yscale=0.5,
      xlabel={\hspace*{5mm}t / \si{\milli\second}},
      ylabel={U / \si{\volt}}
    ]
    \addplot [black,domain=0:10, samples=50] {6 * (1-exp(-(x/1.1)))};
    \addplot [black,domain=10:20, samples=50] {6 * exp(-((x-10)/1.1))};
    \addplot [dashed, domain=-1:7] (10, x);
    \end{axis}
  \end{tikzpicture}

  \begin{tikzpicture}[scale=2]

    \begin{axis}[
      axis lines=middle,
      xmin=-0.5, xmax=21, xtick={0,5,10,...,20},
      ymin=-6, ymax=7, ytick={-6,-4,-2,...,6}, yscale=0.5,
      xlabel={\hspace*{5mm}t / \si{\milli\second}},
      ylabel={I / \si{\milli\ampere}}
    ]
    \addplot [blue,domain=0:10, no marks] {5.45 * (exp(-(x/1.1)))};
    \addplot [blue,domain=10:20, no marks] {-5.45 * exp(-((x-10)/1.1))};
    \addplot [blue, dashed, domain=-5.5:0] (10, x);
    \end{axis}
  \end{tikzpicture}

\end{document}
Inspiriert/uebernommen von hier. :)

Der Wert -5.5 ist pi * Daumen im Quadrat hingewackelt ;). Ich weiss gerade nicht, wofuer man "no marks" benoetigt, habe sie mal testweise entfernt und keine Aenderungen gesehen. Du kannst mit "samples=X" auch die Anzahl der Stuetzstellen beim Plotten erhoehen und bekommst somit glattere Ergebnisse. Aber Achtung: Plotten dauert dann gerne einmal laenger oder sprengt die TeX Kapazitaeten ;).

Falls du irgendwie die ganze Flaeche unter dem Graphen einfaerben moechtest, muesstest du einmal kurz ins pgfplots manual schauen, das weiss ich naemlich gerade auch nicht auswendig :).

Verfasst: Mo 13. Mai 2013, 09:54
von Patrick1990
Vielen Dank.

Ist es eigentlich auch möglich Ladevorgang und Entladevorgang (wie im Bild) einzufügen? ich habs bisher noch nicht hinbekommen.

Verfasst: Mo 13. Mai 2013, 20:08
von guy.brush™
Moin,

auch das geht :).
\documentclass[11pt,fleqn]{scrartcl}

\usepackage[ngerman]{babel}
\usepackage{pgfplots,pgfplotstable}
\usepackage[locale=DE]{siunitx}  

\begin{document}

  \begin{tikzpicture}[scale=2]

    \begin{axis}[
      axis lines=middle,
      xmin=-0.5, xmax=21, xtick={0,5,10,...,20},
      ymin=-0.5, ymax=7, ytick={0,1,2,...,6}, yscale=0.5,
      xlabel={\hspace*{5mm}t / \si{\milli\second}},
      ylabel={U / \si{\volt}},
      clip=false
    ]
    \addplot [black,domain=0:10, samples=50] {6 * (1-exp(-(x/1.1)))};
    \addplot [black,domain=10:20, samples=50] {6 * exp(-((x-10)/1.1))};
    \addplot [dashed, domain=-1:7] (10, x);
    
    \node at (axis cs:5,8) {Aufladen};
    \node at (axis cs:15,8) {Entladen};
    \end{axis}
  \end{tikzpicture}

  \begin{tikzpicture}[scale=2]

    \begin{axis}[
      axis lines=middle,
      xmin=-0.5, xmax=21, xtick={0,5,10,...,20},
      ymin=-6, ymax=7, ytick={-6,-4,-2,...,6}, yscale=0.5,
      xlabel={\hspace*{5mm}t / \si{\milli\second}},
      ylabel={I / \si{\milli\ampere}}
    ]
    \addplot [blue,domain=0:10, no marks] {5.45 * (exp(-(x/1.1)))};
    \addplot [blue,domain=10:20, no marks] {-5.45 * exp(-((x-10)/1.1))};
    \addplot [blue, dashed, domain=-5.5:0] (10, x);
    \end{axis}
  \end{tikzpicture}

\end{document}
"clip = false" ist, damit er den Text nicht abschneidet (teste ruhig einmal, wie es sonst aussieht ... du musst zum Testen aber den Text ggf. um 0.5 nach unten setzen, also auf 7.5).

Verfasst: Mo 13. Mai 2013, 22:05
von Patrick1990
Dankeschön.

Eine Frage habe ich noch. Es gibt ja den Befehl
grid=major
Kann ich dabei das Gitternetz irgendwie verfeinern?

Verfasst: Mo 13. Mai 2013, 22:22
von guy.brush™
Moin,

keine Ursache :).

Hm, das weiss ich jetzt auch nicht ganz auswendig bzw. ich habe einmal kurz ins manual geschaut. Da muesstest vermutlich auch ein wenig drin herumsuchen, aber so wie ich das verstehe, sind major grid lines an den major ticks und minor grind lines eben an den minor ticks. Und wenn du eben die Anzahl der ticks erhoehst (minor oder major), hast du bei grid=major|minor|both auch ein feineres Gitter.

Das muesste eigentlich auch irgendwie so gehen, dass man keine extra Beschriftung an den ticks dran hat. Schau mal im Handbuch z.B. Kapitel 4.14.

Dort siehst du auch, wie du mit extra x ticks z.B. weitere ticks setzen und sie individuell beschriften kannst (das koennte man leer lassen, wenn man keine Beschriftung moechte - wobei ich gerade nicht weiss, ob das die schoenste Variante ist).