![Motivação](https://rvso.com/image/400377/Motiva%C3%A7%C3%A3o.png)
Já faz algum tempo que uso o GeoGebra para desenhar algumas figuras, pois sou totalmente novo no TikZ. Até agora estou bem com as figuras que criei com o GeoGebra, embora o código seja muito complicado. Desta vez, porém, tenho um erro que não consigo resolver.
A mensagem de erro diz:
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.
Embora eu receba essa mensagem, posso ver o enredo, que é mostrado aqui:
Meu código (complicado) é o seguinte:
\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}
Houve usuários relatando mensagens de erro semelhantes. Às vezes, adicionar restrict y to domain
parecia ter resolvido o problema, mas no meu caso parece que não. Alguém pode ajudar a resolver meu problema?
Responder1
IMHO GeoCobra é uma ferramenta que não deve ser usada para desenhar gráficos. Se você deseja plotar uma função, pgfplots
a que você carrega é apropriada, mas não toda a saída de alguma caixa preta que você não entende e que produz esses erros. Em vez disso, você pode apenas traçar a função, seja TikZ encontre as interseções e assim por diante.
\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}
Portanto, esta não é uma resposta real à sua pergunta no sentido técnico, mas uma tentativa de convencê-lo a não usar coisas como o GeoCobra para algo onde existem alternativas que permitem resolver os problemas de forma sistemática.
Responder2
Motivação
A resposta aceita atualmente não explica por que
Dimension too large
restrict y to domain
não funciona no exemplo do OP.
Além disso, ele depende principalmente de codificação para cortar as curvas x domain
(que eu simplesmente chamo de " domain
" no restante deste parágrafo). Temos que visualizar o gráfico primeiro (de forma visual/analítica) antes de podermos escolher um arquivo domain
. Uma curva (polinomial/exponencial) pode aumentar/diminuir rapidamente na parte direita/esquerda de todo o gráfico. Não é trivial instruir uma máquina para cortar automaticamente um arquivo domain
.
Discussão
Vou analisar o erro em três partes:
- exemplo problemático mínimo (MPE)
- dimensões máximas de PGF
- breve explicação sobre
restrict y to domain
EMA
A maioria das linhas do código TikZ gerado são boas. Em outras palavras, essas linhas corretas podem ser descartadas sem afetar a mensagem de erro.
\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}
Algumas pequenas diferenças entre meu MPE e seu código:
\documentclass
éstandalone
em vez dearticle
ampliar a imagem e remover os espaços em branco desnecessários ao redor.compat=1.18
em vez decompat=1.15
como meu PDFLaTeX sugere.- números arredondados com duas casas decimais para facilitar a leitura.
- Eu tirei
restrict y to domain={...}
aqui. Mesmo que você adicione isso de volta ao meu MPE, o compilador apresentará o mesmo erro. Vou elaborar isso na última subseção desta seção. - Eu removi
x=1cm
ey=1cm
em ambos\begin{tikzpicture}
e\begin{axis}
, mas tudo bem, pois esses são os valores padrão nos gráficos TikZ e PGF.
Vou deixar a saída visual de
pdftoppm -png graph.pdf > graph.png
para a próxima subseção.
Neste ponto, vemos queessa pergunta não é sobregeogebra, porque o MPE acima pode ser construído sem o conjunto Geometry.
Dimensões máximas do PGF
Oresposta aceita de uma pergunta relevante \usepgflibrary{fpu}
para mostrar que 600cm
é maior que \maxdimen
, que é o maior valor possível das dimensões do TeX. \maxdimen
é (2^14-2e-5)pt = 16383.99998pt
, mas 600cm
é maior que 17000pt
, portanto, usar 600cm
como comprimento acionaria o erro Dimension too large
.
A curva cúbica dada é definida comosim=x³/2 - 2xem [-5,13,6]. Quandox= 13,sim= 1072,5 > 600. Desde x=1cm
e y=1cm
por padrão, quando osim-coordenada 1072.5cm
for convertida em pt
, excederá \maxdimen
, causando o erro.
breve explicação sobrerestrict y to domain
A chave é encontrada na (seção 4.22Ignorando ou alterando coordenadas – filtrosde) Manual PGF Plots, mas não no manual TikZ. Tentei deixar isso para trás \draw[]
, o sistema não reconheceu a chave /tikz/restrict y to domain
. Também tentei colocar isso para trás plot
, mas não ajudou, porque \draw
é um comando TikZ em vez de PGF Plots.
Quando você coloca restrict y to domain
inside \begin{axis}
, esta chave PGF Plots será aplicada a todos \addplot
(ou \addplot+
) dentro deste axis
ambiente, mas não aos \draw
elementos.
Solução
Primeiro resolverei meu problema mais simples, antes de resolver o seu.
EMA
Converter \draw[domain={...}] plot (\x,{...});
em \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}
O limite não é totalmente utilizado, mas pelo menos o compilador não reclama mais.
Para esticar a curva, descobri que [3*ymin,3*ymax]
é um arquivo y domain
. Não sei se o fator de escala 2
não funciona aqui.
Essa abordagem é muito mais fácil de programar: você pode procurar (regex) pela ocorrência de \begin{axis}[
e depois injetar a linha " restrict y to domain=xxx:yyy
". Você pode desenvolver sua função para calcular os limites superior e inferior xxx
e yyy
de ymin
e ymax
, cujos valores numéricos podem ser extraídos programaticamente. Por exemplo, simplesmente multipliquei os dois números por 3
.
Exemplo original
Alterei apenas duas linhas do seu código contendo \draw [...] plot (\x,{...})
to \addplot [...] (x,{...})
com \x
substituído por x
sem tocar no que está dentro do colchete [...]
.
\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}
Observe que seu gráfico é muito pequeno no meio.
PENDÊNCIA
É hora de trabalhar em algumas manipulações de strings para:
- arredondar cada decimal para duas casas decimaisse necessário
- substitua
[10pt]{article}
para{standalone}
para aumentar a imagem de saída. - injete o
restrict y domain={...},
para evitarDimensions too large
.