![Motivation](https://rvso.com/image/400377/Motivation.png)
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:
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 domain
schien 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, pgfplots
ist , 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}
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 domain
funktioniert im Beispiel des OP nicht.
Darüber hinaus beruht es hauptsächlich auf Hardcoding, um die Kurven abzuschneiden x domain
(die ich domain
im 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:
- minimales problematisches Beispiel (MPE)
- maximale PGF-Abmessungen
- kurze Erklärung zu
restrict 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:
\documentclass
bestehtstandalone
stattdessen darin,article
in das Bild hineinzuzoomen und den unnötigen umgebenden Leerraum zu entfernen.compat=1.18
anstattcompat=1.15
wie 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=1cm
undy=1cm
sowohl 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 umgeogebra, 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 600cm
größer ist als \maxdimen
, was der größtmögliche Wert der TeX-Dimensionen ist. \maxdimen
ist (2^14-2e-5)pt = 16383.99998pt
, aber 600cm
größer als 17000pt
, deshalb 600cm
würde die Verwendung als Länge den Fehler auslösen Dimension too large
.
Die gegebene kubische Kurve ist definiert alsj=X³/2 - 2Xauf [-5,13.6]. WennX= 13,j= 1072,5 > 600. Da x=1cm
und y=1cm
standardmäßig, wenn diej-Koordinate 1072.5cm
in konvertiert wird pt
, überschreitet sie \maxdimen
und 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 \draw
es ein TikZ-Befehl ist und kein PGF Plots-Befehl.
Wenn Sie restrict y to domain
hineingeben \begin{axis}
, wird dieser PGF-Plot-Schlüssel auf jedes \addplot
(oder \addplot+
) innerhalb dieser axis
Umgebung angewendet, aber nicht auf \draw
Elemente.
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}
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 2
hier nicht funktioniert.
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 xxx
und yyy
aus ymin
und 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 \x
durch „ ersetzt wurden, x
ohne 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.
MACHEN
Zeit, an einigen Zeichenfolgenmanipulationen zu arbeiten, um:
- runden Sie jede Dezimalstelle auf zwei DezimalstellenFalls benötigt
- Ersetzen Sie
[10pt]{article}
es durch{standalone}
, um das Ausgabebild zu vergrößern. - injizieren
restrict y domain={...},
um das zu vermeidenDimensions too large
.