Motivación

Motivación

He estado usando GeoGebra para dibujar algunas figuras desde hace un tiempo, ya que soy totalmente nuevo en TikZ. Hasta ahora estoy bien con las figuras que creé con GeoGebra, aunque el código es tremendamente complicado. Esta vez, sin embargo, tengo un error que no puedo resolver.

El mensaje de error dice:

Dimension too large.

<to be read again>

   \relax

l.34 \end{axis}

I can't work with sizes bigger than about 19 feet. Continue and I'll use the largest value I can.

Aunque recibo ese mensaje, puedo ver la trama, que se muestra aquí:

ingrese la descripción de la imagen aquí

Mi código (complicado) tiene el siguiente aspecto:

\documentclass[10pt]{article}
\usepackage{pgf,tikz,pgfplots}
\pgfplotsset{compat=1.15}
\usepackage{mathrsfs}
\usetikzlibrary{arrows}
\pagestyle{empty}
\begin{document}
\begin{tikzpicture}[line cap=round,line join=round,>=triangle 45,x=1.0cm,y=1.0cm, scale = 1.2, transform shape]
\begin{axis}[
x=1.0cm,y=1.0cm,
axis lines=middle,
xmin=-1.129485186780251,
xmax=5.72744433329757,
ymin=-0.96997054991852,
ymax=5.616499082403562,
xtick={0.0},
ytick={0.0}, restrict y to domain=-0.96997054991852:5.616499082403562,]
\clip(-1.129485186780251,-0.76997054991852) rectangle (5.82744433329757,5.916499082403562);
\draw[line width=0.8pt,smooth,samples=100,domain=-3.129485186780251:10.42744433329757] plot(\x,{(\x)-2.25E-50});
\draw[line width=0.8pt,smooth,samples=100,domain=-3.129485186780251:10.42744433329757] plot(\x,{0-0.07123888916965247*(\x)^(4.0)+1.5096421986752417*(\x)^(3.0)-9.579592272284225*(\x)^(2.0)+23.93776936035761*(\x)-17.586966972004486});
\draw (5.196549774492815,0.49322601353710884) node[anchor=north west] {$x$};
\draw (0.020629571335991016,5.575885328535428) node[anchor=north west] {$f(x)$};
\draw [line width=0.8pt,dash pattern=on 2pt off 2pt] (1.5,1.5)-- (1.5,0.);
\draw [line width=0.8pt,dash pattern=on 2pt off 2pt] (3.,0.)-- (3.,3.);
\draw [line width=0.8pt,dash pattern=on 2pt off 2pt] (4.5,4.5)-- (4.501485877435332,0.);
\draw (1.2137496293807978,0.021729881572188525) node[anchor=north west] {$x_0$};
\draw (2.700437452518166,0.021729881572188525) node[anchor=north west] {$x_1$};
\draw (4.228710949030006,0.021729881572188525) node[anchor=north west] {$x_2$};
\begin{scriptsize}
\draw [fill=black] (1.5,1.5) circle (1.2pt);
\draw [fill=black] (4.5,4.5) circle (1.2pt);
\draw [fill=black] (3.,3.) circle (1.2pt);
\end{scriptsize}
\end{axis}
\end{tikzpicture}
\end{document}

Ha habido usuarios que han informado mensajes de error similares. A veces, agregar restrict y to domainparecía haber resuelto el problema, pero en mi caso parece que no es así. ¿Alguien puede ayudarme a resolver mi problema?

Respuesta1

En mi humilde opinión, GeoCobra es una herramienta que no debe usarse para dibujar gráficos. Si desea trazar una función, pgfplotsque carga, es apropiado, pero no toda la salida de algún cuadro negro que no comprende y que produce estos errores. Más bien, puedes simplemente trazar la función, deja que TikZ encuentra las intersecciones y así sucesivamente.

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\begin{axis}[domain=0:5,axis lines=middle,ymin=-1,ymax=6,xticklabels={},
yticklabels={},xlabel={$x$},ylabel={$f(x)$}]
 \addplot[no marks,smooth,name path=curve]{0.5*(x-2)^3-0.5*(x-2)^2+2.25};
 \addplot[no marks,name path=line]{x};
 \path (0,0) coordinate (O);
 \draw[dashed,name intersections={of=curve and line,total=\t}]
 foreach \X in {1,...,\t} {(intersection-\X) node[circle,fill,inner sep=1pt]{}
 -- (intersection-\X|-O) node[below]{$x_{\the\numexpr\X-1}$}};
\end{axis}
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

Entonces, esta no es una respuesta real a su pregunta en el sentido técnico, sino un intento de convencerlo de que no use cosas como GeoCobra para algo donde existen alternativas que le permiten resolver los problemas sistemáticamente.

Respuesta2

Motivación

La respuesta actualmente aceptada no explica por qué

  • Dimension too large
  • restrict y to domainno funciona en el ejemplo de OP.

Además, se basa principalmente en codificación para cortar las curvas x domain(que simplemente llamo " domain" durante el resto de este párrafo). Primero tenemos que ver el gráfico (de forma visual/analítica) antes de poder elegir un adecuado domain. Una curva (polinomial/exponencial) puede aumentar/disminuir rápidamente en la parte derecha/izquierda de todo el gráfico. No es trivial indicarle a una máquina que recorte automáticamente un archivo adecuado domain.

Discusión

Analizaré el error en tres partes:

  1. ejemplo problemático mínimo (MPE)
  2. dimensiones máximas de PGF
  3. breve explicación sobrerestrict y to domain

MPE

La mayoría de las líneas del código TikZ generado son buenas. En otras palabras, esas líneas correctas se pueden descartar sin afectar el mensaje de error.

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
  xmin=-5,
  xmax=13.6,
  ymin=-5,
  ymax=6.55,
]
  \clip (-5,-5) rectangle (13.6,6.55);
  \draw (-4.9,-4.9) rectangle (13.3,6.5);
  \draw[domain=-5:13.6] plot (\x,{1/2*(\x)^3-2*\x});
\end{axis}
\end{tikzpicture}
\end{document}

Algunas diferencias menores entre mi MPE y su código:

  • \documentclasses standaloneen lugar de articlehacer zoom en la imagen y eliminar los espacios en blanco circundantes innecesarios.
  • compat=1.18en lugar de compat=1.15como sugiere mi PDFLaTeX.
  • Números redondeados a dos decimales para facilitar la lectura.
  • Me he llevado restrict y to domain={...}aquí. Aunque vuelvas a agregar eso a mi MPE, el compilador dará el mismo error. Explicaré esto en detalle en la última subsección de esta sección.
  • Eliminé x=1cmand y=1cmen ambos \begin{tikzpicture}y \begin{axis}, pero está bien ya que esos son los valores predeterminados en TikZ y PGF Plots.

Dejaré la salida visual de

pdftoppm -png graph.pdf > graph.png

a la siguiente subsección.

En este punto vemos queesta pregunta no se trata de, porque el MPE anterior se puede construir sin la suite Geometry.

Dimensiones máximas de PGF

Elrespuesta aceptada de una pregunta relevante \usepgflibrary{fpu}para mostrar que 600cmes mayor que \maxdimen, que es el mayor valor posible de las dimensiones TeX. \maxdimenes (2^14-2e-5)pt = 16383.99998pt, pero 600cmes mayor que 17000pt, por lo que usarlo 600cmcomo longitud provocaría el error Dimension too large.

Curva cúbica TikZ

La curva cúbica dada se define comoy=X³/2 - 2Xen [-5,13,6]. CuandoX= 13,y= 1072.5 > 600. Desde x=1cmy y=1cmpor defecto, cuando ely-la coordenada 1072.5cmse convierte a pt, excederá \maxdimen, provocando el error.

breve explicación sobrerestrict y to domain

La clave se encuentra en (sección 4.22Saltar o cambiar coordenadas – filtrosde) Manual de PGF Plots, pero no en el manual de TikZ. Intenté dejar esto atrás \draw[], el sistema no reconoció la clave /tikz/restrict y to domain. También intenté dejar esto atrás plot, pero eso no ayudó, porque \drawes un comando TikZ en lugar de uno de PGF Plots.

Cuando ingresa restrict y to domain, \begin{axis}esta clave PGF Plots se aplicará a cada \addplot(o \addplot+) dentro de este axisentorno, pero no a \drawlos elementos.

Solución

Primero resolveré mi problema más simple, antes de resolver el tuyo.

MPE

Convertir \draw[domain={...}] plot (\x,{...});en \addplot[domain={...}] (x,{...});.

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
  xmin=-5,
  xmax=13.6,
  ymin=-5,
  ymax=6.55,
  restrict y to domain=-5:6.55,
]
  \clip (-5,-5) rectangle (13.6,6.55);
  \draw (-4.9,-4.9) rectangle (13.3,6.5);
  \addplot[domain=-5:13.6] (x,{1/2*(x)^3-2*x});
\end{axis}
\end{tikzpicture}
\end{document}

La curva cúbica de TikZ restringe y al dominio

El límite no se utiliza por completo, pero al menos el compilador ya no se queja.

Para estirar la curva, encontré que [3*ymin,3*ymax]es adecuado y domain. No sé si el factor de escala 2no funciona aquí.

PGF Traza una curva cúbica con restricción relajada

Este enfoque es mucho más fácil de programar: puede (expresión regular) buscar la aparición de \begin{axis}[y luego insertar la línea " restrict y to domain=xxx:yyy". Puede desarrollar su función para calcular los límites superior e inferior xxxy yyydesde yminy ymax, cuyos valores numéricos se pueden extraer mediante programación. Por ejemplo, simplemente multipliqué ambos números por 3.

Ejemplo original

Solo cambié dos líneas de su código que contienen \draw [...] plot (\x,{...})reemplazado \addplot [...] (x,{...})por \xsin xtocar lo que está dentro del corchete [...].

\documentclass[10pt]{article}
\usepackage{pgf,tikz,pgfplots}
\pgfplotsset{compat=1.15}
\usepackage{mathrsfs}
\usetikzlibrary{arrows}
\pagestyle{empty}
\begin{document}
\begin{tikzpicture}[line cap=round,line join=round,>=triangle 45,x=1.0cm,y=1.0cm, scale = 1.2, transform shape]
\begin{axis}[
x=1.0cm,y=1.0cm,
axis lines=middle,
xmin=-1.129485186780251,
xmax=5.72744433329757,
ymin=-0.96997054991852,
ymax=5.616499082403562,
xtick={0.0},
ytick={0.0}, restrict y to domain=-0.96997054991852:5.616499082403562,]
\clip(-1.129485186780251,-0.76997054991852) rectangle (5.82744433329757,5.916499082403562);
\addplot[line width=0.8pt,smooth,samples=100,domain=-3.129485186780251:10.42744433329757] (x,{(x)-2.25E-50});
\addplot[line width=0.8pt,smooth,samples=100,domain=-3.129485186780251:10.42744433329757] (x,{0-0.07123888916965247*(x)^(4.0)+1.5096421986752417*(x)^(3.0)-9.579592272284225*(x)^(2.0)+23.93776936035761*(x)-17.586966972004486});
\draw (5.196549774492815,0.49322601353710884) node[anchor=north west] {$x$};
\draw (0.020629571335991016,5.575885328535428) node[anchor=north west] {$f(x)$};
\draw [line width=0.8pt,dash pattern=on 2pt off 2pt] (1.5,1.5)-- (1.5,0.);
\draw [line width=0.8pt,dash pattern=on 2pt off 2pt] (3.,0.)-- (3.,3.);
\draw [line width=0.8pt,dash pattern=on 2pt off 2pt] (4.5,4.5)-- (4.501485877435332,0.);
\draw (1.2137496293807978,0.021729881572188525) node[anchor=north west] {$x_0$};
\draw (2.700437452518166,0.021729881572188525) node[anchor=north west] {$x_1$};
\draw (4.228710949030006,0.021729881572188525) node[anchor=north west] {$x_2$};
\begin{scriptsize}
\draw [fill=black] (1.5,1.5) circle (1.2pt);
\draw [fill=black] (4.5,4.5) circle (1.2pt);
\draw [fill=black] (3.,3.) circle (1.2pt);
\end{scriptsize}
\end{axis}
\end{tikzpicture}
\end{document}

Observa que tu gráfica es muy pequeña en el medio.

ingrese la descripción de la imagen aquí

HACER

Es hora de trabajar en algunas manipulaciones de cadenas para:

  1. redondear cada decimal a dos decimalessi necesario
  2. reemplace [10pt]{article}con {standalone}para agrandar la imagen de salida.
  3. inyectar el restrict y domain={...},para evitar Dimensions too large.

información relacionada