¿Cómo dibujar el gráfico del teorema del valor medio con TikZ?

¿Cómo dibujar el gráfico del teorema del valor medio con TikZ?

(Editado el 23 de marzo de 2014) ¿Alguien puede darme una solución TikZ a mi pregunta?

Quiero agregar una ilustración del teorema del valor medio (Lagrange) como esta: ingrese la descripción de la imagen aquí

\begin{center}
{\Huge \shadowbox{\textbf{Teorema del Valor Medio (Lagrange)}}}
\end{center}

\[\frac{{f(b) - f(a)}}{{b - a}} = f'(c)\]

Básicamente, necesito el eje con las etiquetas x e y, la función, la secante, la tangente y algo que falta en la imagen: f(a), f(b) y f(c).

La foto que quiero hacer con TikZ la hice con GeoGebra: ingrese la descripción de la imagen aquí

Respuesta1

Mi intento con MetaPost, principalmente por diversión, ya que ya existen soluciones muy buenas arriba. La macro principal, find_all_direction_pointsbasada en la directiontimemacro MetaPost, teóricamente devuelve cada punto cuyas tangentes comparten la misma dirección y el número de estos puntos.

El siguiente código LaTeX utiliza el gmppaquete como interfaz para Metapost y debe escribirse con la opción Shell-escape activada.

\documentclass[12pt]{scrartcl}
\usepackage[latex, shellescape]{gmp}
  \gmpoptions{everymp={input latexmp; 
    setupLaTeXMP(options="12pt", textextlabel=enable, mode=rerun);}}
\begin{document}
\begin{mpost*}[mpmem=metafun]
  % Macro that finds all points of p where the tangents share the same direction v
  vardef find_all_direction_points(expr p, v)(suffix C, n) =
    save s, q; path q; q = p;
    n:= 0; 
    s = directiontime v of p; 
    forever:
      exitunless s<>-1; 
      n := n+1;
      C[n] := point s of q;
      q := subpath(s+epsilon, infinity) of q;
      s := directiontime v of q;
    endfor;
  enddef;
  % Axes, graph, tangents and secant definitions
  u := 2cm; xmin := -0.5; xmax := 6; ymin := -0.5; ymax := 4.5;
  pair A, B, C; A = (1, 3); B = (5, 1); 
  pair C[], v; 
  v = unitvector(B-A);
  path p, secant; p = A{dir 70} ..  B{dir 60}; secant = A--B;
  find_all_direction_points(p, B-A)(C,n);
  % Function graph, and secant
  draw p scaled u ;
  draw secant scaled u withcolor red;
  % Tangent drawing
  for k= 1 upto n:
    draw (C[k]-v -- C[k] + v) scaled u withcolor green;
    draw C[k] scaled u withpen pencircle scaled 3bp;
  endfor;
  % axes and locations
  drawarrow (xmin*u, 0) -- (xmax*u, 0) ;
  drawarrow (0, ymin*u) -- (0, ymax*u) ;
  for M = A, B, C1:
    draw (u*xpart M, 0) -- u*M -- (0, u*ypart M) dashed evenly;
  endfor;
  % Labels
  label.bot("$a$", (u*xpart A, 0)); label.bot("$b$", (u*xpart B, 0)); 
  label.bot("$c$", (u*xpart C1, 0)); label.bot("$x$", (xmax*u, 0));
  label.lft("$f(a)$", (0, u*ypart A)); label.lft("$f(b)$", (0, u*ypart B)); 
  label.lft("$f(c)$", (0, u*ypart C1)); label.lft("$y$", (0, ymax*u));
  label.top("Tangent at $c$", C1*u) rotatedaround (C1*u, angle(B-A));
  label.bot("Secant", u*0.4[A,B]) rotatedaround (u*0.4[A,B], angle(B-A));
  label.bot("Another tangent", C2*u) rotatedaround (C2*u, angle(B-A));
  tN := 0.45; pair N; N = point tN along p;
  label.top("$y=f(x)$", u*N) rotatedaround(u*N, angle(direction tN of p));
\end{mpost*}
\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Con un nuevo método en el que la abscisa cse determina automáticamente sin tener que evaluar la derivada f(x)a mano. ¿Es agradable?

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-eucl,pstricks-add}

\def\f(#1){((#1)*(#1-5)*(#1-6)/4+1.5*(#1)-5)}
\def\m(#1,#2){(\f(#2)-\f(#1))/(#2-#1)}
\def\fp(#1){Derive(1,\f(#1))}% f'(x) 

\def\L#1{\uput[-90](#1|0,0){$#1\mathstrut$}\uput[180](0,0|#1){$f(#1)$}\psCoordinates[linestyle=dashed,linecolor=gray](#1)}

\begin{document}

\begin{pspicture}[algebraic,saveNodeCoors,PointSymbol=none,PointName=none](-1,-1)(8,8)
    \psaxes[labels=none,ticks=none]{->}(0,0)(-.5,-.5)(7.5,7.5)[$x$,0][$y$,90]
    \pstGeonode(*1 {\f(x)}){a}(*6.5 {\f(x)}){b}
    \makeatletter\pst@Verb{/ax N-a.x def /bx N-b.x def}\makeatother
    \psplot[linecolor=blue]{ax}{bx}{\f(x)}
    \pstInterFF{\m(ax,bx)}{\fp(x)}{4}{temp}
    \pstGeonode(*N-temp.x {\f(x)}){c}
    \pcline[nodesep=-1,linecolor=green](a)(b)
    \psxline[linecolor=red](c){.1(a)-.1(b)}{.1(b)-.1(a)}
    \psset{linecolor=gray,linestyle=dashed}
    \foreach \i in {a,b,c}{\L{\i}}
\end{pspicture}

\end{document}

ingrese la descripción de la imagen aquí

Respuesta3

Una solución de PSTricks:

\documentclass{article}

\usepackage{pstricks-add}
\usepackage{xfp}

\newcommand*\Function[1]{\fpeval{(-3*(#1)^3+45*(#1)^2-189*(#1))/65+7}}
\newcommand*\ParallelPoint{\fpeval{5+sqrt(7)}}                         % need to calculate yourself
\newcommand*\ParallelTangent[1]{\fpeval{(-27*(#1)+395+42*sqrt(7))/65}} % need to calculate yourself
\begin{document}

\begin{pspicture}(-0.8,-0.4)(10.9,5.9)
{\psset{linestyle = dashed}
  \psline[linecolor = blue](1,\Function{1})(0,\Function{1})
  \psline[linecolor = blue](10,\Function{10})(0,\Function{10})
  \psline[linecolor = orange](1,0)(1,\Function{1})
  \psline[linecolor = orange](10,\Function{10})(10,0)
  \psline[linecolor = green!60](10,\ParallelTangent{10})(10,\Function{10})
  \psline[linecolor = green!60](\ParallelPoint,0)(\ParallelPoint,\Function{\ParallelPoint})(0,\Function{\ParallelPoint})}
  \psline[linecolor = orange]{->}(1,\Function{1})(10,\Function{10})
  \pcline[linestyle = none, offset = -9pt](1,\Function{1})(10,\Function{10})
  \ncput[nrot = :U]{Secant}
  \psline[linecolor = green!60]{->}(5,\ParallelTangent{5})(10,\ParallelTangent{10})
  \psaxes[labels = none, ticks = none]{->}(0,0)(-0.2,-0.2)(10.5,5.5)[$x$,0][$y$,90]
  \psplot[algebraic, linecolor = blue]{1}{10}{(-3*x^3+45*x^2-189*x)/65+7}
  \psdots(1,\Function{1})(10,\Function{10})
  \uput[270](3,\Function{3}){$y = f(x)$}
  \uput[180](5,\ParallelTangent{5}){Tangent at $c$}
  \uput[270](1,0){$a$}
  \uput[150](0,\Function{1}){$f(a)$}
  \uput[270](\ParallelPoint,0){$c$}
  \uput[210](0,\Function{\ParallelPoint}){$f(c)$}
  \uput[270](10,0){$b$}
  \uput[180](0,\Function{10}){$f(b)$}
\end{pspicture}

\end{document}

producción

Respuesta4

¿Es esto un truco? Se siente como un truco...

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}[thick]
  \path ( 1,4)        node[coordinate] (a1) {}
        (10,5)        node[coordinate] (b1) {}
        (a1) ++(0,-2) node[coordinate] (a2) {}
        (b1) ++(0,-2) node[coordinate] (b2) {};

  \path[draw,green] (a1) -- (b1);

  \path[draw,red] (a2) --
    node[coordinate,pos=0.05] (c1) {}
    node[coordinate,pos=0.2 ] (c2) {}
    node[coordinate,pos=0.4 ] (c3) {}
    (b2);

  \draw[densely dashed] (a1)
    .. controls +(0,0) and  (c1)   .. (c2)
    .. controls  (c3)  and +(-2,2) .. (b1);

  \foreach \point/\text in {a1/a , b1/b , c2/c}
    \draw[dotted]
        let \p1 = (\point)
      in
           (0  ,\y1) node[anchor=east ] {$f(\text)$}
        -- (\p1)
        -- (\x1,0  ) node[anchor=north] {$\text$};

  \draw[->] (-1.5, 0  ) -- (11,0  ) node[anchor=south east] {\textsf{x}};
  \draw[->] (   0,-1.5) -- ( 0,6.5) node[anchor=north west] {\textsf{y}};

\end{tikzpicture}
\end{document}

Funciona haciendo uso de puntos de control. Del manual:

Se necesitan uno o dos "puntos de control". Las matemáticas detrás de ellos no son del todo triviales, pero aquí está la idea básica: supongamos que estás en el punto x y el primer punto de control es y. Entonces la curva comenzará a "ir en la dirección de y en x", es decir,la tangente de la curva en x apuntará hacia y. (Sección 2.4, énfasis añadido)

Producción:

ingrese la descripción de la imagen aquí

información relacionada