由于我对 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
你加载的 是合适的,但并非所有输出都来自你不理解的黑匣子,并且会产生这些错误。相反,你可以只绘制函数,让 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
在 OP 的例子中不起作用。
此外,它主要依靠硬编码来截断曲线(在本段的其余部分x domain
我简称为“ ”)。我们必须先查看图形(以视觉/分析的方式),然后才能选择合适的。(多项式/指数)曲线可以在整个图形的右侧/左侧部分快速增加/减少。指示机器自动裁剪合适的曲线并非易事。domain
domain
domain
讨论
我将分三个部分来分析这个错误:
- 最小问题示例(MPE)
- 最大 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 图中默认值。
我将留下视觉输出
pdftoppm -png graph.pdf > graph.png
转到下一小节。
此时,我们看到这个问题不是关于geogebra,因为上述 MPE 可以在没有 Geometry 套件的情况下构建。
最大 PGF 尺寸
这接受相关问题的答案 \usepgflibrary{fpu}
表明600cm
大于\maxdimen
,这是 TeX 维度的最大可能值。 \maxdimen
是(2^14-2e-5)pt = 16383.99998pt
,但是600cm
大于17000pt
,因此使用600cm
作为长度会触发错误Dimension too large
。
给定的三次曲线定义为是=X³/2 - 2X在 [-5,13.6] 上。当X= 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,{...})
而没有触及方括号内的内容。\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
。