モチベーション

モチベーション

私は 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 domainOP の例では機能しません。

さらに、曲線の(この段落の残りの部分ではx domain単に「 」と呼ぶ) を切り取るには、主にハードコーディングに依存しています。適切な を選択する前に、まずグラフを (視覚的/分析的に) 確認する必要があります。(多項式/指数) 曲線は、グラフ全体の右側/左側で急激に増加/減少することがあります。適切な を自動的に切り取るようにマシンに指示するのは簡単なことではありません。domaindomaindomain

議論

エラーを 3 つの部分に分けて分析します。

  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私の PDFLaTeX が提案する代わりにcompat=1.15
  • 読みやすくするために、数値は小数点第 2 位に丸められています。
  • ここで削除しましたrestrict y to domain={...}。これを MPE に追加しても、コンパイラは同じエラーを返します。このセクションの最後のサブセクションで詳しく説明します。
  • との両方でx=1cmと を削除しましたが、これらは TikZ および PGF プロットのデフォルト値なので問題ありません。y=1cm\begin{tikzpicture}\begin{axis}

視覚的な出力は

pdftoppm -png graph.pdf > graph.png

次のサブセクションへ。

この時点で、この質問は上記の MPE は Geometry スイートなしでも構築できるためです。

最大PGF寸法

関連する質問に対する受け入れられた回答 \usepgflibrary{fpu}600cmはより大きいことを示します\maxdimen。これは TeX 次元の最大値です。 \maxdimenは です(2^14-2e-5)pt = 16383.99998pt600cmより大きいため17000pt、 を600cm長さとして使用するとエラー が発生しますDimension too large

TikZ 3次曲線

与えられた3次曲線は次のように定義される。ええ=バツ³/2 - 2バツ[-5,13.6]。バツ= 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が、役に立ちませんでした。 は\drawPGF Plots コマンドではなく TikZ コマンドだからです。

restrict y to domain内部に を配置すると、この PGF Plots キーはこの環境内のすべての(または)\begin{axis}に適用されますが、要素には適用されません。\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 3次曲線はyをドメインに制限します

制限は完全には使用されていませんが、少なくともコンパイラは文句を言わなくなりました。

曲線を伸ばすには、 が[3*ymin,3*ymax]適切であることがわかりました。スケーリング係数がここでは機能しないかy domainどうかはわかりません。2

PGF 緩和された制限を持つ 3 次曲線をプロットします

このアプローチはプログラミングがはるかに簡単です。 の出現を (正規表現で) 検索し\begin{axis}[、行 " " を挿入します。およびからrestrict y to domain=xxx:yyy上限と下限を計算する関数を開発できます。これらの数値はプログラムで抽出できます。たとえば、両方の数値に を掛けるだけです。xxxyyyyminymax3

元の例

角括弧内の内容には触れずに、を含むコードの 2 行のみを\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桁を四捨五入する必要であれば
  2. 出力画像を大きくするには[10pt]{article}を に置き換えます。{standalone}
  3. restrict y domain={...},を避けるためにを注入しますDimensions too large

関連情報