Мотивация

Мотивация

Я уже некоторое время использую GeoGebra для рисования некоторых фигур, так как я новичок в TikZ. До сих пор меня устраивали фигуры, созданные с помощью GeoGebra, хотя код ужасно сложен. Однако на этот раз у меня возникла ошибка, которую я не могу исправить.

Сообщение об ошибке гласит:

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.

Хотя я и получаю это сообщение, я вижу сюжет, который показан здесь:

введите описание изображения здесь

Мой (сложный) код выглядит следующим образом:

\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}

Пользователи сообщали о подобных сообщениях об ошибках. Иногда добавление, restrict y to domainказалось, решало проблему, но в моем случае, похоже, нет. Может ли кто-нибудь помочь решить мою проблему?

решение1

IMHO GeoCobra — это инструмент, который не следует использовать для рисования графиков. Если вы хотите построить график функции, pgfplots, который вы загружаете, подходит, но не все выходные данные из какого-то черного ящика, который вы не понимаете, и который выдает эти ошибки. Вместо этого вы можете просто построить график функции, пусть TiкZ найти пересечения и т.д.

\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}

введите описание изображения здесь

Так что это не настоящий ответ на ваш вопрос в техническом смысле, а попытка убедить вас не использовать такие вещи, как GeoCobra, там, где существуют альтернативы, позволяющие вам решать проблемы систематически.

решение2

Мотивация

Текущий принятый ответ не объясняет, почему

  • Dimension too large
  • restrict y to domainне работает в примере ОП.

Более того, он в основном полагается на жесткое кодирование для обрезки кривых x domain(которые я просто называю " domain" для остальной части этого абзаца). Мы должны сначала просмотреть график (визуально/аналитически), прежде чем сможем выбрать подходящий domain. (Многочленная/экспоненциальная) кривая может быстро увеличиваться/уменьшаться в правой/левой части всего графика. Нетривиально указать машине автоматически обрезать подходящий domain.

Обсуждение

Я проанализирую ошибку в три части:

  1. минимальный проблемный пример (МПЭ)
  2. максимальные размеры PGF
  3. краткое объяснение оrestrict y to domain

МПЭ

Большинство строк в сгенерированном коде TikZ хорошие. Другими словами, эти правильные строки можно отбросить, не влияя на сообщение об ошибке.

\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}

Некоторые незначительные различия между моим MPE и вашим кодом:

  • \documentclassвместо standaloneтого, articleчтобы увеличить изображение и удалить ненужные окружающие пробелы.
  • compat=1.18а не compat=1.15как предлагает мой PDFLaTeX.
  • Для удобства чтения числа округлены до двух знаков после запятой.
  • Я убрал restrict y to domain={...}здесь. Даже если вы добавите это обратно в мой MPE, компилятор выдаст ту же ошибку. Я расскажу об этом подробнее в последнем подразделе этого раздела.
  • Я удалил x=1cmи y=1cmв обоих \begin{tikzpicture}и \begin{axis}, но это нормально, так как это значения по умолчанию в TikZ и PGF Plots.

Я оставлю визуальный вывод

pdftoppm -png graph.pdf > graph.png

к следующему подразделу.

В этот момент мы видим, чтоэтот вопрос не о, поскольку вышеуказанный MPE может быть построен без пакета Geometry.

Максимальные размеры PGF

Theпринятый ответ на соответствующий вопрос \usepgflibrary{fpu}чтобы показать, что 600cmбольше \maxdimen, что является максимально возможным значением TeX-размерности. \maxdimenравно (2^14-2e-5)pt = 16383.99998pt, но 600cmбольше 17000pt, поэтому использование 600cmв качестве длины приведет к ошибке Dimension too large.

Кубическая кривая TikZ

Данная кубическая кривая определяется каку"="Икс³/2 - 2Иксна [-5,13.6].КогдаИкс= 13,у= 1072,5 > 600. Так как x=1cmи y=1cmпо умолчанию, когдау-координата 1072.5cmпреобразуется в pt, она превысит \maxdimen, что приведет к ошибке.

краткое объяснение оrestrict y to domain

Ключ находится в (раздел 4.22)Пропуск или изменение координат – фильтрыиз) Руководство по PGF Plots, но не в руководстве TikZ. Я пробовал поместить это позади \draw[], система не распознала ключ /tikz/restrict y to domain. Я также пробовал поместить это позади plot, но это не помогло, потому что \drawэто команда TikZ, а не PGF Plots.

При помещении restrict y to domainвнутрь \begin{axis}этот ключ PGF Plots будет применен к каждому \addplot(или \addplot+) внутри этой axisсреды, но не к \drawэлементам.

Решение

Сначала я решу свою более простую задачу, прежде чем решать вашу.

МПЭ

Конвертировать \draw[domain={...}] plot (\x,{...});в \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}

Кубическая кривая TikZ ограничивает y областью

Лимит не используется полностью, но, по крайней мере, компилятор больше не жалуется.

Для растягивания кривой я обнаружил, что [3*ymin,3*ymax]подходит y domain. Я не знаю, может быть, 2здесь не работает коэффициент масштабирования.

PGF строит кубическую кривую с ослабленными ограничениями

Этот подход гораздо проще программировать: вы можете (регулярное выражение) искать вхождение \begin{axis}[, затем вставлять строку " restrict y to domain=xxx:yyy". Вы можете разработать свою функцию для вычисления верхнего и нижнего пределов xxxи yyyиз yminи ymax, чьи числовые значения могут быть извлечены программно. Например, я просто умножил оба числа на 3.

Оригинальный пример

Я изменил только две строки вашего кода, содержащие \draw [...] plot (\x,{...})to, заменив на \addplot [...] (x,{...}), не трогая то, что находится внутри квадратных скобок .\xx[...]

\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}

Обратите внимание, что середина вашего графика очень маленькая.

введите описание изображения здесь

ДЕЛАТЬ

Пришло время поработать над некоторыми манипуляциями со строками, чтобы:

  1. округлить каждую десятичную дробь до двух знаков после запятойесли необходимо
  2. замените [10pt]{article}на {standalone}, чтобы увеличить выходное изображение.
  3. введите, restrict y domain={...},чтобы избежать Dimensions too large.

Связанный контент