动机

动机

由于我对 TikZ 还很陌生,所以我已经使用 GeoGebra 绘制了一些图形一段时间了。到目前为止,我对使用 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

我认为 GeoCobra 是一款不适合用来绘制图形的工具。如果你想绘制一个函数,pgfplots你加载的 是合适的,但并非所有输出都来自你不理解的黑匣子,并且会产生这些错误。相反,你可以只绘制函数,让 TiZ 找到交叉点等等。

\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在 OP 的例子中不起作用。

此外,它主要依靠硬编码来截断曲线(在本段的其余部分x domain我简称为“ ”)。我们必须先查看图形(以视觉/分析的方式),然后才能选择合适的。(多项式/指数)曲线可以在整个图形的右侧/左侧部分快速增加/减少。指示机器自动裁剪合适的曲线并非易事。domaindomaindomain

讨论

我将分三个部分来分析这个错误:

  1. 最小问题示例(MPE)
  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 和您的代码之间存在一些细微的差别:

  • \documentclassstandalone而不是放大article图片并删除周围不必要的空白。
  • compat=1.18而不是compat=1.15像我的 PDFLaTeX 所建议的那样。
  • 为方便阅读,数字四舍五入到小数点后两位。
  • 我在这里删除了restrict y to domain={...}。即使你将其添加回我的 MPE,编译器也会给出相同的错误。我将在本节的最后一小节中详细说明这一点。
  • 我已经删除了x=1cmy=1cm中的\begin{tikzpicture}\begin{axis},但没关系,因为它们是 TikZ 和 PGF 图中默认值。

我将留下视觉输出

pdftoppm -png graph.pdf > graph.png

转到下一小节。

此时,我们看到这个问题不是关于,因为上述 MPE 可以在没有 Geometry 套件的情况下构建。

最大 PGF 尺寸

接受相关问题的答案 \usepgflibrary{fpu}表明600cm大于\maxdimen,这是 TeX 维度的最大可能值。 \maxdimen(2^14-2e-5)pt = 16383.99998pt,但是600cm大于17000pt,因此使用600cm作为长度会触发错误Dimension too large

TikZ三次曲线

给定的三次曲线定义为=X³/2 - 2X在 [-5,13.6] 上。当X= 13,= 1072.5 > 600。由于x=1cmy=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”。您可以开发函数来计算 和 的上限和下限xxxyyyymin数值ymax可以通过编程提取。例如,我只是将两个数字乘以3

原始示例

我只更改了包含 的两行代码,用替换为 ,\draw [...] plot (\x,{...})而没有触及方括号内的内容。\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

相关内容