Mit TikZ ist das wirklich leicht. Im folgenden habe ich Plain TeX verwendet, weshalb man `\input tikz.tex` machen muss statt `\usepackage{tikz}` und statt `\begin{document}...\end{document}` setzt man einfach `\bye` ans Ende des Dokuments.
Den folgenden Code setzt man mit `pdftex`
\input tikz.tex
\nopagenumbers% for cropping
\usetikzlibrary{arrows,intersections}
\tikzpicture[
thick,
>=stealth',
dot/.style = {
draw,
fill=white,
circle,
inner sep=0pt,
minimum size=4pt
}
]
\coordinate (O) at (0,0);
\draw[->] (-0.3,0) -- (8,0) coordinate[label={below:$x$}] (xmax);
\draw[->] (0,-0.3) -- (0,5) coordinate[label={right:$f(x)$}] (ymax);
\path[name path=x] (0.3,0.5) -- (6.7,4.7);
\path[name path=y] plot[smooth] coordinates {(-0.3,2) (2,1.5) (4,2.8) (6,5)};
\scope[name intersections={of=x and y,name=i}]
\fill[gray!20] (i-1) -- (i-2 |- i-1) -- (i-2) -- cycle;
\draw (0.3,0.5) -- (6.7,4.7) node[pos=0.8,below right] {Sekante};
\draw[red] plot[smooth] coordinates {(-0.3,2) (2,1.5) (4,2.8) (6,5)};
\draw (i-1) node[dot,label={above:$P$}] (i-1) {} -- node[left] {$f(x_0)$} (i-1 |- O) node[dot,label={below:$x_0$}] {};
\path (i-2) node[dot,label={above:$Q$}] (i-2) {} -- (i-2 |- i-1) node[dot] (i-12) {};
\draw (i-12) -- (i-12 |- O) node[dot,label={below:$x_0 + \varepsilon$}] {};
\draw[blue,<->] (i-2) -- node[right] {$f(x_0 + \varepsilon) - f(x_0)$} (i-12);
\draw[blue,<->] (i-1) -- node[below] {$\varepsilon$} (i-12);
\path (i-1 |- O) -- node[below] {$\varepsilon$} (i-2 |- O);
\draw[gray] (i-2) -- (i-2 -| xmax);
\draw[gray,<->] ([xshift=-0.5cm]i-2 -| xmax) -- node[fill=white] {$f(x_0 + \varepsilon)$} ([xshift=-0.5cm]xmax);
\endscope
\endtikzpicture
\bye
Die produziert die folgende Ausgabe (freigestellt)
> ![alt text][1]
Da die Schnittpunkt mit der `intersections` Bibliothek berechnet werden ist die Lösung adaptiv. In der folgenden Lösung wird nicht der Punkt Q bewegt, sondern einer Punkte auf der roten Linien, was dazu führt, dass sich Q bewegt (wenn man genau hinschaut, dass kann man sehen, dass die rote Linie eine hässliche Delle bekommt wenn Q nach rechts läuft).
Mein Arbeitsablauf zum Erstellen von Animationen ist der folgende:
* Verändere die Quelldatei, sodass für jede Variation des Parameters eine extra Seite ausgegeben wird (meistens mit Hilfe von der PGF `\foreach` Schleife, wie hier)
* Das resultierende PDF freistellen mit Heiko Oberdieks `pdfcrop`.
* Importieren der freigestellten PDF in [GIMP](http://www.gimp.org/).
* In GIMP: Umkehren der Layer Ordnung und Export als `.gif` mit der Option `Als Animation` ausgewählt und einer Verzögerung von 200 Millisekunden (andernfalls ist es mit zu schnell).
Im folgenden befindet sich der Code zum erstellen der Animation. Ich habe die zusätzlichen und veränderten Zeilen markiert um den Unterschied zum obigen Code hervorzuheben.
\input tikz.tex
\nopagenumbers% for cropping
\usetikzlibrary{arrows,intersections}
\foreach \Q in {4,4.1,4.2,...,5,4.9,4.8,...,4.1} {%<-- neu
\tikzpicture[
thick,
>=stealth',
dot/.style = {
draw,
fill=white,
circle,
inner sep=0pt,
minimum size=4pt
}
]
\coordinate (O) at (0,0);
\draw[->] (-0.3,0) -- (8,0) coordinate[label={below:$x$}] (xmax);
\draw[->] (0,-0.3) -- (0,5) coordinate[label={right:$f(x)$}] (ymax);
\path[name path=x] (0.3,0.5) -- (6.7,4.7);
\path[name path=y] plot[smooth] coordinates {(-0.3,2) (2,1.5) (\Q,2.8) (6,5)};%<-- geändert
\scope[name intersections={of=x and y,name=i}]
\fill[gray!20] (i-1) -- (i-2 |- i-1) -- (i-2) -- cycle;
\draw (0.3,0.5) -- (6.7,4.7) node[pos=0.8,below right] {Sekante};
\draw[red] plot[smooth] coordinates {(-0.3,2) (2,1.5) (\Q,2.8) (6,5)};%<-- geändert
\draw (i-1) node[dot,label={above:$P$}] (i-1) {} -- node[left] {$f(x_0)$} (i-1 |- O) node[dot,label={below:$x_0$}] {};
\path (i-2) node[dot,label={above:$Q$}] (i-2) {} -- (i-2 |- i-1) node[dot] (i-12) {};
\draw (i-12) -- (i-12 |- O) node[dot,label={below:$x_0 + \varepsilon$}] {};
\draw[blue,<->] (i-2) -- node[right] {$f(x_0 + \varepsilon) - f(x_0)$} (i-12);
\draw[blue,<->] (i-1) -- node[below] {$\varepsilon$} (i-12);
\path (i-1 |- O) -- node[below] {$\varepsilon$} (i-2 |- O);
\draw[gray] (i-2) -- (i-2 -| xmax);
\draw[gray,<->] ([xshift=-0.5cm]i-2 -| xmax) -- node[fill=white] {$f(x_0 + \varepsilon)$} ([xshift=-0.5cm]xmax);
\endscope
\endtikzpicture
\eject%<-- neu
}%<-- neu
\bye
> ![alt text][2]
---
Zum Spaß mit PSTricks vom TeX.SX [User](http://tex.stackexchange.com/users/19356/) der ständig seinen Namen ändert.
ändert, natürlich auf [TeX.SX](http://tex.stackexchange.com/a/168361/10995).
\documentclass[pstricks]{standalone}
\usepackage{pst-plot,pst-eucl}
\def\f(#1){((#1-1)^2+5)/5}
\def\L#1#2#3{\psCoordinates[linestyle=dashed](#1)\uput[-90](#1|0,0){$#2\mathstrut$}\uput[180](0,0|#1){$#3$}}
\begin{document}
\begin{pspicture}[algebraic,saveNodeCoors,NodeCoorPrefix=N](-2,-1)(7,5)
\psaxes[labels=none,ticks=none]{->}(0,0)(-1,-1)(6.5,4.5)[$x$,0][$y$,90]
\psplot[linecolor=red]{-1}{5}{\f(x)}
\pstGeonode[PosAngle=90](*1 {\f(x)}){P}(*3.5 {\f(x)}){Q}
\psdot(Q|P)
\pcline[nodesep=-2](P)(Q)
\L{P}{x}{f(x)}
\L{Q}{x+\varepsilon}{f(x+\varepsilon)}
\pcline[linecolor=blue](P)(Q|P)\nbput{$\varepsilon$}
\pcline[linecolor=blue](Q)(!NQx NPy)\naput{$f(x+\varepsilon)-f(x)$}
\uput[-45]([nodesep=-1]{p}Q){secant}
\uput[0](*5 {\f(x)}){\textcolor{red}{$y=f(x)$}}
\end{pspicture}
\end{document}
> ![alt text][3]
---
Mit MetaPost und dem Metafun-Format von [fpast](http://tex.stackexchange.com/users/25768/fpast) auf TeX.SX.
[TeX.SX](http://tex.stackexchange.com/a/168841/10995).
Das Bild übersetzt man mit `mpost --mem=metafun --tex=latex file.mp`
input latexmp; setupLaTeXMP(textextlabel=enable, mode=rerun);
vardef drawemptydot expr z =
save circle; path circle; circle = fullcircle scaled 3bp shifted z;
unfill circle;
draw circle;
enddef;
u := cm; % Unit length
beginfig(1);
xmin := -0.5; xmax := 9.5; ymin := -0.5; ymax := 6;
path curve; curve = (-0.5, 3.5){dir -30} .. (2.5, 2){dir 15} .. (5, 3.5) .. (8, 6){dir 30};
% Triangle and labels
z.P = point 1 of curve; z.Q = point 2 of curve;
z.R = (x.Q, y.P); z.S = (x.P, 0); z.T = (x.Q, 0);
fill z.P--z.Q--z.R--cycle scaled u withcolor 0.9[blue, white];
%
drawoptions(withcolor blue);
drawdblarrow (z.P -- z.R) scaled u shortened 2bp;
drawdblarrow (z.R -- z.Q) scaled u shortened 2bp;
label.bot("$\varepsilon$", u*.5[z.P, z.R]);
label.rt("$f(x_0+\varepsilon) - f(x_0)$", u*.5[z.R, z.Q]);
%
drawoptions(withcolor black);
draw ((x.P, 0) -- z.P) scaled u;
draw ((x.Q, 0) -- z.R) scaled u;
draw (z.Q -- (xmax, y.Q)) scaled u;
% The curve
draw curve scaled u withcolor red;
% Axes
drawarrow (xmin*u, 0) -- (xmax*u, 0);
drawarrow (0, ymin*u) -- (0, ymax*u);
label.bot("$x$", (xmax*u, 0));
label.lft("$f(x)$", (0, ymax*u));
% Other labels
label.ulft("$P$", u*z.P);
label.ulft("$Q$", u*z.Q);
label.bot("$x_0$", u*z.S);
label.bot("$x_0+\varepsilon$", u*z.T);
label.bot("$\varepsilon$", u*(.5(x.P+x.Q), 0));
label.lft("$f(x_0)$", u*(.5[z.S, z.P]));
z.U = (0.8[x.Q, xmax], y.Q);
drawdblarrow ((x.U, 0) -- z.U) scaled u shortened .5bp;
picture yQ_label; yQ_label = thelabel("$f(x_0+\varepsilon)$", u*.5[(x.U, 0), z.U]);
unfill bbox yQ_label; draw yQ_label;
% Secante
path secante; secante = 1.8[z.Q, z.P] -- 2.5[z.P, z.Q] ;
draw secante scaled u;
label.lrt("Sekante", u*point .9 of secante);
forsuffixes M = P, Q, R, S, T:
drawemptydot z.M scaled u;
endfor;
endfig;
end.
> ![alt text][4]
[1]: http://texwelt.de/wissen/upfiles/2_6.png
[2]: http://texwelt.de/wissen/upfiles/3.gif
[3]: http://texwelt.de/wissen/upfiles/s_7.png
[4]: http://texwelt.de/wissen/upfiles/4_3.png