Motivation

Motivation

Ich verwende GeoGebra schon seit einiger Zeit zum Zeichnen einiger Figuren, da ich bei TikZ völlig neu bin. Bis jetzt komme ich mit den Figuren, die ich mit GeoGebra erstellt habe, gut zurecht, obwohl der Code furchtbar kompliziert ist. Dieses Mal habe ich jedoch einen Fehler, den ich nicht lösen kann.

Die Fehlermeldung lautet:

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.

Obwohl ich diese Nachricht erhalte, kann ich die Handlung sehen, die hier dargestellt ist:

Bildbeschreibung hier eingeben

Mein (komplizierter) Code sieht wie folgt aus:

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

Es gab Benutzer, die ähnliche Fehlermeldungen gemeldet haben. Manchmal restrict y to domainschien das Hinzufügen das Problem zu lösen, aber in meinem Fall scheint es nicht so zu sein. Kann mir jemand bei der Lösung meines Problems helfen?

Antwort1

Meiner bescheidenen Meinung nach ist GeoCobra ein Werkzeug, das nicht zum Zeichnen von Graphen verwendet werden sollte. Wenn Sie eine Funktion zeichnen möchten, pgfplotsist , das Sie laden, geeignet, aber nicht die gesamte Ausgabe einer Blackbox, die Sie nicht verstehen und die diese Fehler erzeugt. Vielmehr können Sie einfach die Funktion zeichnen, TikZ finde die Schnittpunkte und so weiter.

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

Bildbeschreibung hier eingeben

Dies ist also keine wirkliche Antwort auf Ihre Frage im technischen Sinne, sondern ein Versuch, Sie davon zu überzeugen, Dinge wie GeoCobra nicht für etwas zu verwenden, wo es Alternativen gibt, mit denen Sie die Probleme systematisch lösen können.

Antwort2

Motivation

Die aktuell akzeptierte Antwort erklärt nicht, warum

  • Dimension too large
  • restrict y to domainfunktioniert im Beispiel des OP nicht.

Darüber hinaus beruht es hauptsächlich auf Hardcoding, um die Kurven abzuschneiden x domain(die ich domainim Rest dieses Absatzes einfach " " nenne). Wir müssen uns zuerst den Graphen ansehen (auf visuelle/analytische Weise), bevor wir einen geeigneten auswählen können domain. Eine (polynomische/exponentielle) Kurve kann auf der rechten/linken Seite des gesamten Graphen schnell ansteigen/abfallen. Es ist nicht trivial, eine Maschine anzuweisen, automatisch einen geeigneten abzuschneiden domain.

Diskussion

Ich werde den Fehler in drei Teilen analysieren:

  1. minimales problematisches Beispiel (MPE)
  2. maximale PGF-Abmessungen
  3. kurze Erklärung zurestrict y to domain

MPE

Die meisten Zeilen im generierten TikZ-Code sind gut. Mit anderen Worten, die korrekten Zeilen können verworfen werden, ohne dass sich dies auf die Fehlermeldung auswirkt.

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

Einige geringfügige Unterschiede zwischen meinem MPE und Ihrem Code:

  • \documentclassbesteht standalonestattdessen darin, articlein das Bild hineinzuzoomen und den unnötigen umgebenden Leerraum zu entfernen.
  • compat=1.18anstatt compat=1.15wie mein PDFLaTeX vorschlägt.
  • Zur leichteren Lesbarkeit wurden die Zahlen auf zwei Dezimalstellen gerundet.
  • Ich habe es hier weggenommen restrict y to domain={...}. Auch wenn Sie das wieder zu meinem MPE hinzufügen, gibt der Compiler denselben Fehler aus. Darauf werde ich im letzten Unterabschnitt dieses Abschnitts näher eingehen.
  • Ich habe x=1cmund y=1cmsowohl in \begin{tikzpicture}als auch entfernt \begin{axis}, aber das ist in Ordnung, da dies die Standardwerte in TikZ- und PGF-Plots sind.

Ich lasse die visuelle Ausgabe von

pdftoppm -png graph.pdf > graph.png

zum nächsten Unterabschnitt.

An diesem Punkt sehen wir, dassbei dieser Frage geht es nicht um, da die obige MPE ohne die Geometrie-Suite erstellt werden kann.

Maximale PGF-Abmessungen

Derakzeptierte Antwort auf eine relevante Frage \usepgflibrary{fpu}um anzuzeigen, dass 600cmgrößer ist als \maxdimen, was der größtmögliche Wert der TeX-Dimensionen ist. \maxdimenist (2^14-2e-5)pt = 16383.99998pt, aber 600cmgrößer als 17000pt, deshalb 600cmwürde die Verwendung als Länge den Fehler auslösen Dimension too large.

TikZ kubische Kurve

Die gegebene kubische Kurve ist definiert alsj=X³/2 - 2Xauf [-5,13.6]. WennX= 13,j= 1072,5 > 600. Da x=1cmund y=1cmstandardmäßig, wenn diej-Koordinate 1072.5cmin konvertiert wird pt, überschreitet sie \maxdimenund verursacht den Fehler.

kurze Erklärung zurestrict y to domain

Der Schlüssel befindet sich in (Abschnitt 4.22Überspringen oder Ändern von Koordinaten – Filtervon) PGF Plots-Handbuch, aber nicht im TikZ-Handbuch. Ich habe versucht, dies hinter einzufügen \draw[], das System hat den Schlüssel nicht erkannt /tikz/restrict y to domain. Ich habe auch versucht, dies hinter einzufügen plot, aber das hat nicht geholfen, weil \drawes ein TikZ-Befehl ist und kein PGF Plots-Befehl.

Wenn Sie restrict y to domainhineingeben \begin{axis}, wird dieser PGF-Plot-Schlüssel auf jedes \addplot(oder \addplot+) innerhalb dieser axisUmgebung angewendet, aber nicht auf \drawElemente.

Lösung

Ich werde zuerst mein einfacheres Problem lösen, bevor ich Ihr Problem tatsächlich löse.

MPE

Konvertieren \draw[domain={...}] plot (\x,{...});in \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 kubische Kurve beschränkt y auf Domäne

Das Limit wird zwar nicht komplett ausgeschöpft, aber immerhin meckert der Compiler nicht mehr.

Um die Kurve zu strecken, habe ich herausgefunden, dass dies [3*ymin,3*ymax]ein geeigneter Wert ist y domain. Ich weiß nicht, ob der Skalierungsfaktor 2hier nicht funktioniert.

PGF zeichnet eine kubische Kurve mit lockerer Einschränkung

Dieser Ansatz ist viel einfacher zu programmieren: Sie können (regulärer Ausdruck) nach dem Vorkommen von suchen \begin{axis}[und dann die Zeile " restrict y to domain=xxx:yyy" einfügen. Sie können Ihre Funktion so entwickeln, dass die oberen und unteren Grenzen xxxund yyyaus yminund berechnet werden ymax, deren numerische Werte programmgesteuert extrahiert werden können. Ich habe beispielsweise einfach beide Zahlen mit multipliziert 3.

Ursprüngliches Beispiel

Ich habe in Ihrem Code lediglich zwei Zeilen geändert, die „ \draw [...] plot (\x,{...})to“ enthalten \addplot [...] (x,{...})und \xdurch „ ersetzt wurden, xohne den Inhalt der eckigen Klammern zu verändern [...].

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

Beachten Sie, dass Ihr Diagramm in der Mitte sehr klein ist.

Bildbeschreibung hier eingeben

MACHEN

Zeit, an einigen Zeichenfolgenmanipulationen zu arbeiten, um:

  1. runden Sie jede Dezimalstelle auf zwei DezimalstellenFalls benötigt
  2. Ersetzen Sie [10pt]{article}es durch {standalone}, um das Ausgabebild zu vergrößern.
  3. injizieren restrict y domain={...},um das zu vermeiden Dimensions too large.

verwandte Informationen