Motivação

Motivação

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:

insira a descrição da imagem 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 domainparecia 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, pgfplotsa 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}

insira a descrição da imagem aqui

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 domainnã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:

  1. exemplo problemático mínimo (MPE)
  2. dimensões máximas de PGF
  3. breve explicação sobrerestrict 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é standaloneem vez de articleampliar a imagem e remover os espaços em branco desnecessários ao redor.
  • compat=1.18em vez de compat=1.15como 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=1cme y=1cmem 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 é sobre, 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 600cmcomo comprimento acionaria o erro Dimension too large.

Curva cúbica TikZ

A curva cúbica dada é definida comosim=x³/2 - 2xem [-5,13,6]. Quandox= 13,sim= 1072,5 > 600. Desde x=1cme y=1cmpor padrão, quando osim-coordenada 1072.5cmfor 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 domaininside \begin{axis}, esta chave PGF Plots será aplicada a todos \addplot(ou \addplot+) dentro deste axisambiente, mas não aos \drawelementos.

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}

A curva cúbica TikZ restringe y ao domínio

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 2não funciona aqui.

PGF traça curva cúbica com restrição relaxada

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 xxxe yyyde ymine 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 \xsubstituído por xsem 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.

insira a descrição da imagem aqui

PENDÊNCIA

É hora de trabalhar em algumas manipulações de strings para:

  1. arredondar cada decimal para duas casas decimaisse necessário
  2. substitua [10pt]{article}para {standalone}para aumentar a imagem de saída.
  3. injete o restrict y domain={...},para evitar Dimensions too large.

informação relacionada