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, 11:04

welle's gravatar image

welle
10642631
Akzeptiert: 100%

bearbeitet 08 Dez '13, 12: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, 11:50

Clemens's gravatar image

Clemens
20.1k123360

bearbeitet 08 Dez '13, 12:14

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

(02 Apr, 07: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, 08:01) Clemens

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

(02 Apr, 09: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, 04: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, 14:30

esdd's gravatar image

esdd
15.6k53753

bearbeitet 08 Dez '13, 16:14

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

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:

×201

Frage gestellt: 08 Dez '13, 11:04

Frage wurde angeschaut: 5,610 Mal

Zuletzt aktualisiert: 03 Apr, 04:28