5
1

Mit pgfplots habe ich eine Funktion dargestellt, deren Ableitung leicht zu bestimmen war. Nun sollen an zwei Stellen a und b (zum Beispiel 1.5 und 3) die Tangenten eingezeichnet werden. Außerdem müssen die Berührungspunkte von Kurve und Tangente auf den Achsen mit a und f(a) bzw. b und f(b) beschriftet werden. Dabei möchte ich weder die Funktionswerte noch die Anstiege in den Punkten selbst berechnen und explizit angeben müssen. Gibt es dafür eine Möglichkeit?

\documentclass[margin=5mm]{standalone} 
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

\begin{document} 
\begin{tikzpicture} 
  \newcommand\funktion{2*sin(0.5*deg(\x)) + 1.5}% dargestellte Funktion
  \newcommand\ableitung{cos(0.5*deg(\x))}% Ableitung der Funktion
%
  \begin{axis}[axis lines=middle,enlargelimits,
    xlabel=$x$,xlabel style={anchor=north},xtick=\empty,
    ylabel=$y$,ylabel style={anchor=east},ytick=\empty
  ]
  \addplot[domain=0:10,samples=200]{\funktion};
  \end{axis}
\end{tikzpicture}
\end{document}

alt text

gefragt 08 Dez '13, 17:04

welle's gravatar image

welle
106222631
Akzeptiert-Rate: 0%

bearbeitet 08 Dez '13, 18:09


Eine Tangente an (u|f(u)) ist ja gegeben durch

t(x) = f'(u)(x-u) + f(u)

Mit Deinen beiden Makros bist Du also schon fast am Ziel für den Automatismus:

\documentclass[margin=5mm]{standalone} 
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

\begin{document} 
\begin{tikzpicture} 
  \newcommand*\funktion[1]{2*sin(0.5*deg(#1)) + 1.5}% dargestellte Funktion
  \newcommand*\ableitung[1]{cos(0.5*deg(#1))}% Ableitung der Funktion
  \newcommand*\tangente[2]{\ableitung{#2}*(#1-#2)+\funktion{#2}}

  \begin{axis}[axis lines=middle,,enlargelimits,
    xlabel=$x$,xlabel style={anchor=north},xtick=\empty,
    ylabel=$y$,ylabel style={anchor=east},ytick=\empty
  ]
  \addplot[domain=-1:10,samples=200]{\funktion{\x}};
  \addplot[domain=4:8]{\tangente{\x}{6}};
  \coordinate (P) at (axis cs:6,{\funktion{6}}) ;
  \coordinate (Q) at (axis cs:0,{\funktion{6}}) ;
  \coordinate (R) at (axis cs:6,0) ;
  \node[coordinate,pin=30:{$(u,f(u))$}] at (P) {};
  \draw[red,dotted] (P) -- (Q) node[left] {$f(u)$} ;
  \draw[red,dotted] (P) -- (R) node[below] {$u$} ;
  \end{axis}
\end{tikzpicture}
\end{document}

alt text

Permanenter link

beantwortet 08 Dez '13, 17:50

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%

bearbeitet 08 Dez '13, 18:14

Wenn man die Ableitung nicht kennt, gibt es scheints keine einfache Lösung mehr, richtig?

(02 Apr '17, 13:57) cis

@cis das Tangentenproblem ist in der Schule in der Regel das, mit dem die Ableitung im Matheunterricht eingeführt wird, da man merkt, dass man ohne sie die Tangentensteigung nicht bzw nur näherungsweise bestimmen kann…

(02 Apr '17, 14:01) cgnieder

Ne, mich interessiert, ob eine reine pgf-Lösung für beliebige Kurven möglich ist; über die Ableitungsfunktion ist es klar.

(02 Apr '17, 15:41) cis

Die reinen Tikz-Lösungen, die ich geshen habe, sehen kompliziert aus. Ich empfehle, die Ableitung in der Form \newcommand*\ableitung[1]{(\funktion{#1+0.01}-\funktion{#1})/0.01} anzusetzen, da so unabhängig vom Funktionsterm.

(03 Apr '17, 10:28) cis

Hier ist noch ein anderer Ansatz, bei dem zunächst ein Befehl für das Zeichnen einer Geraden durch einen Punkt definiert wird, der sich auch für das Zeichnen einer Tangente bei gegebener Funktion und Ableitung eignet. Außerdem wird für das Beschriften den Punkte ebenfalls ein eigener Befehl definiert.

\documentclass[margin=5mm]{standalone} 
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

% Syntax für das Zeichnen einer Gerade durch einen vorgegebenen Punkt:
%  #1 Optionen für die Gerade, z.B. Farbe und Plotbereich (optional)
%  #2 x-Koordinate des Punktes
%  #3 y-Koordinate des Punktes, kann auch eine Formel in Abhängigkeit von \x sein
%  #4 Anstieg der Geraden, kann auch eine Formel in Abhängigkeit von \x sein
%  #5 Nodenname für den Punkt
\newcommand\Gerade[5][]{% 
   \pgfmathsetmacro\x{#2}
   \expandafter\pgfmathsetmacro\csname#5x\endcsname{#2}%
   \expandafter\pgfmathsetmacro\csname#5y\endcsname{#3}%
   \pgfmathsetmacro\m{#4}
   \pgfmathsetmacro\n{\csname#5y\endcsname-\m*\csname#5x\endcsname} 
   \addplot[#1] {\m*(\x-\csname#5x\endcsname)+\csname#5y\endcsname};
   \coordinate (#5) at (axis cs:{\csname#5x\endcsname,\csname#5y\endcsname});
}

% Syntax für das Beschriftung eines Punktes:
%  #1 Optionen für die Beschriftung (optional)
%  #2 kommaseparierte Liste mit Nodennamen/Beschriftung an x-Achse/Beschriftung an y-Achse
%  die Koordinate O muss innerhalb der axis Umgebung definiert wurden sein
\newcommand\Beschriftung[2][]{%
  \foreach \name/\beschrx/\beschry in {#2}
    \path[#1](O-|\name)node[below]{\strut\beschrx}--(\name)node[punkt]{}--(\name-|O)node[left]{\beschry};%
}
\tikzset{punkt/.style={circle,minimum width=4\pgflinewidth,inner sep=0pt,fill}}

\begin{document} 
\begin{tikzpicture} 
  \newcommand\funktion{2*sin(0.5*deg(\x)) + 1.5}
  \newcommand\ableitung{cos(0.5*deg(\x))}
  %
  \begin{axis}[axis lines=middle,enlargelimits,
      xlabel=$x$,xlabel style={anchor=north},xtick=\empty,
      ylabel=$y$,ylabel style={anchor=east},ytick=\empty
    ]
    \addplot[domain=0:10,samples=200]{\funktion};
    \coordinate (O) at (axis cs:0,0); % wird für Beschriftung benötigt
    \Gerade[green!80!black,domain=0.2:3]{1.5}{\funktion}{\ableitung}{eins}
    \Gerade[blue,dashed,domain=1:5]{3}{\funktion}{\ableitung}{zwei}
    \Gerade[brown,domain=4:8]{6}{\funktion}{\ableitung}{drei}
  \end{axis}
  \Beschriftung[red,draw,thin,dotted,text=gray]{eins/$a$/$f(a)$,zwei/$b$/$f(b)$,drei/$c$/$f(c)$}
\end{tikzpicture}

\end{document}

alt text

Permanenter link

beantwortet 08 Dez '13, 20:30

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 08 Dez '13, 22:14

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:

×298

gestellte Frage: 08 Dez '13, 17:04

Frage wurde gesehen: 13,230 Mal

zuletzt geändert: 03 Apr '17, 10:28