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í:
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 domain
parecí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, pgfplots
que 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}
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 domain
no 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:
- ejemplo problemático mínimo (MPE)
- dimensiones máximas de PGF
- breve explicación sobre
restrict 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:
\documentclass
esstandalone
en lugar dearticle
hacer zoom en la imagen y eliminar los espacios en blanco circundantes innecesarios.compat=1.18
en lugar decompat=1.15
como 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=1cm
andy=1cm
en 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 degeogebra, 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 600cm
es mayor que \maxdimen
, que es el mayor valor posible de las dimensiones TeX. \maxdimen
es (2^14-2e-5)pt = 16383.99998pt
, pero 600cm
es mayor que 17000pt
, por lo que usarlo 600cm
como longitud provocaría el error Dimension too large
.
La curva cúbica dada se define comoy=X³/2 - 2Xen [-5,13,6]. CuandoX= 13,y= 1072.5 > 600. Desde x=1cm
y y=1cm
por defecto, cuando ely-la coordenada 1072.5cm
se 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 \draw
es 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 axis
entorno, pero no a \draw
los 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}
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 2
no funciona aquí.
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 xxx
y yyy
desde ymin
y 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 \x
sin x
tocar 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.
HACER
Es hora de trabajar en algunas manipulaciones de cadenas para:
- redondear cada decimal a dos decimalessi necesario
- reemplace
[10pt]{article}
con{standalone}
para agrandar la imagen de salida. - inyectar el
restrict y domain={...},
para evitarDimensions too large
.