![Мотивация](https://rvso.com/image/400377/%D0%9C%D0%BE%D1%82%D0%B8%D0%B2%D0%B0%D1%86%D0%B8%D1%8F.png)
Я уже некоторое время использую 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
.
Обсуждение
Я проанализирую ошибку в три части:
- минимальный проблемный пример (МПЭ)
- максимальные размеры PGF
- краткое объяснение о
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
.
Данная кубическая кривая определяется каку"="Икс³/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}
Лимит не используется полностью, но, по крайней мере, компилятор больше не жалуется.
Для растягивания кривой я обнаружил, что [3*ymin,3*ymax]
подходит y domain
. Я не знаю, может быть, 2
здесь не работает коэффициент масштабирования.
Этот подход гораздо проще программировать: вы можете (регулярное выражение) искать вхождение \begin{axis}[
, затем вставлять строку " restrict y to domain=xxx:yyy
". Вы можете разработать свою функцию для вычисления верхнего и нижнего пределов xxx
и yyy
из ymin
и ymax
, чьи числовые значения могут быть извлечены программно. Например, я просто умножил оба числа на 3
.
Оригинальный пример
Я изменил только две строки вашего кода, содержащие \draw [...] plot (\x,{...})
to, заменив на \addplot [...] (x,{...})
, не трогая то, что находится внутри квадратных скобок .\x
x
[...]
\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}
Обратите внимание, что середина вашего графика очень маленькая.
ДЕЛАТЬ
Пришло время поработать над некоторыми манипуляциями со строками, чтобы:
- округлить каждую десятичную дробь до двух знаков после запятойесли необходимо
- замените
[10pt]{article}
на{standalone}
, чтобы увеличить выходное изображение. - введите,
restrict y domain={...},
чтобы избежатьDimensions too large
.