Anzeige:
Ergebnis 1 bis 3 von 3

Thema: Probleme mit \ifthenelse

  1. #1
    Registrierter Benutzer
    Registriert seit
    16.02.2018
    Beiträge
    4

    Probleme mit \ifthenelse

    Guten Morgen Community,

    in Rahmen einer Studienarbeit animiere ich verschiedene dynamische Systeme.
    Mein erstes System sind zwei einfache Wurfparabeln. Nun muss ich die zweite Wurfparabel begrenzen, weil diese sonst zu weit erscheint.
    Nutzen wollte ich dazu den \ifthenelse Befehl. Jedoch bekomm ich immer wieder einen Fehler ausgeworfen. Ich habe schon viel verschiedenes Versucht.
    Verzeiht mir mein Unwissen, ich bin noch Anfänger auf dem Gebiet.

    Code:
    \documentclass[8pt]{beamer}
    
    \usepackage{sansmathaccent}
    \pdfmapfile{+sansmathaccent.map} 
    % https://duckduckgo.com/?q=miktex+the+mathkerncmssi+could+not+be+found&t=ffab&ia=qa   
    
    
    \usepackage[ngerman]{babel}
    \usepackage[utf8x]{inputenc}
    \usepackage{pgfplots,tikz,tikzscale,animate,ifthen}
    \usetikzlibrary{backgrounds, shapes.geometric, arrows,snakes}
    \pgfplotsset{compat=newest}
    \tikzset{dashdot/.style={dash pattern=on .4pt off 3pt on 4pt off 3pt}} 
    \beamertemplatenavigationsymbolsempty
    
    	
    \begin{document}
    	%Position der Nockenwelle festlegen und verändern falls nötig
    	\def\nx{-2}
    	\def\ny{12}
    	\def\nxshift{-2cm}
    	\def\nyshift{12cm}
    	
    	\begin{frame}{Aufgabe 12. Wurfparabel}
    
    	%Aufgabentext
    	Zwei Bälle werden unter unterschiedlichen Winkeln $\varphi$ und mit unterschiedlicher Anfangsgeschwindigkeit abgeworfen. Beide landen wie unten skizziert nach der Strecke L wieder auf dem Erdboden.
    	Die Anfangsgeschwindigkeit der Bälle wird beschrieben durch
    	\begin{tabbing}
    		
    	$ v(\varphi)$\=$= \sqrt{\frac{L\cdot g}{2\cdot sin(\varphi)\cdot cos(\varphi)}} $  \quad \= für $0\leq\varphi\leq90^{\circ}$ \\
    
    	\end{tabbing}
    
    	Es ist die Anfangsgeschwindigkeit $v_{20}(\varphi) $ gesucht.
    	\quad geg.: $\varphi_{1}, \varphi_{2}$ 
    	
    	\begin{animateinline} [controls]{40} %loop zum automatischen wiederholen
    		   	\multiframe{121}{Rx=0+0.01} { \scalebox{0.6} {
    		   			{\centering \begin{tikzpicture} 
    						
    			%Bounding Box 1
    			\draw [white] (-2.5,15cm) -- (-2.5,7.5cm);        %Vertikal links
    			\draw [white] (-2.5,15cm) -- (5.5cm,15cm);    %Horizontal oben
    			\draw [white] (-2.5,7.5cm) -- (5.5cm,7.5cm);      %Horizontal unten
    			\draw [white] (5.5cm,15cm) -- (5.5cm, 7.5cm); %Vertikal rechts 
    
    			%Berechnung der Parameter und festlegung der Variablen	
    				\pgfmathparse{\Rx}
    				\let\t\pgfmathresult
    				
    			%Ball 1 y-Richtung	
    	 			\pgfmathparse{(-4.905)*\t*\t+(1/sqrt(2))*8.2867*\t}   %t^2 mit t*t ersetzt
    			    \let\h\pgfmathresult
    
    			%Ball 1 x-Richtung
    			    \pgfmathparse{(1/sqrt(2))*8.2867*\t}
    			 	\let\s\pgfmathresult
    
    			%Ball 2 y-Richtung
    				\pgfmathparse{(-4.905)*\t*\t+0.5*8.9047*\t}			  %t^2 mit t*t ersetzt		
    				\let\y\pgfmathresult
    				
    			%Ball 2 x-Richtung
    				\pgfmathparse{(sqrt(3)/2)*8.9047*\t}
    				\let\x\pgfmathresult					 
    													 
    		%	\def\position{(1/sqrt(2))*8.2867*\t}
    		%	\def\hoehe{(-4.905)*\t*\t+(1/sqrt(2))*8.2867*\t}     %t^2 mit t*t ersetzt
    
    	%Start Modellierung der Geometrie
    		
    		%Zeichnung der Flugumgebung
    			%Grundlinie
    			\draw[line width=1.25] (\nx-0.02,\ny) -- (7.02+ \nx,\ny);
    			%Maßhilfslinien
    			\draw (\nx-0.02,\ny) -- (\nx-0.02,-0.6+ \ny); \draw (7.02+ \nx, \ny) -- (7.02+ \nx,-0.6+ \ny);
    			%Maßpfeil
    			\draw[<->] (\nx-0.02,-0.55+ \ny) -- (7.02+ \nx,-0.55+ \ny) node [midway, above] {L};
    			%Geschwindigkeitsvektoren
    		%	\draw[->, line width=0.85pt] (\nx-0.02,\ny) -- (30:1.5) node (v20) at (1.75+ \nx,0.65+ \ny) {$v_{20}$};
    		%	\draw[->, line width=0.85pt] (\nx-0.02,\ny) -- (45:1.5) node (v10) at (0.8+ \nx,1.2+ \ny) {$v_{10}$};
    			%Alle Linien wurden an Kurve 1 angepasst (bevor ich wusste, wie es richtig bei der Kurve funktioniert :D). Node wurde statt [midway, above] usw. auf manuelle Platzierung umgestellt
    			
    			%Flugkurve für Phi=45° nach (h(s)=-(1/7)*s^2+s
    			\begin{axis} [width=10.05cm, height=3.725cm, axis line style={draw=none}, ytick=\empty, xtick=\empty, scale=1, yshift=-6.05+ \nyshift, xshift=-21+ \nxshift]
    			\addplot[mark=none, color=black] coordinates
    			{
    				(0,0)	
    				(0.35,0.3325)
    				(0.70,0.6300)
    				(1.05,0.8925)
    				(1.4,1.12000)
    				(1.75,1.3125)
    				(2.1,1.47000)
    				(2.45,1.5925)
    				(2.8,1.68000)
    				(3.15,1.7325)
    				(3.5,1.75000)
    				(3.85,1.7325)
    				(4.2,1.68000)
    				(4.55,1.5925)
    				(4.9,1.47000)
    				(5.25,1.3125)
    				(5.6,1.12000)
    				(5.95,0.8925)
    				(6.30,0.6300)
    				(6.65,0.3325)
    				(7,0)
    			};
    			\end{axis}
    			
    			%Flugkurve für Phi=30° nach h(s)=-(2180/26431)*s^2+(1/sqrt(3))*s
    			\begin{axis} [width=10.1cm, height=2.85cm, axis line style={draw=none}, ytick=\empty, xtick=\empty, scale=1, yshift=-4+ \nyshift, xshift=-22 + \nxshift]
    			\addplot[dashdot] coordinates
    			{
    				(0,0)	
    				(0.35,0.19197)
    				(0.70,0.36373)
    				(1.05,0.51528)
    				(1.4,0.646630)
    				(1.75,0.75777)
    				(2.1,0.848700)
    				(2.45,0.91943)
    				(2.8,0.969950)
    				(3.15,1.00026)
    				(3.5,1.010360)
    				(3.85,1.00026)
    				(4.2,0.969950)
    				(4.55,0.91943)
    				(4.9,0.848700)
    				(5.25,0.75777)
    				(5.6,0.646630)
    				(5.95,0.51528)
    				(6.30,0.36373)
    				(6.65,0.19197)
    				(7,0)
    			};
    			\end{axis}
    
    			%Ball 1 zeichnen und bewegen
    			\fill[blue, draw=black] (\s+ \nx,\h+ \ny) circle (0.15);
    
    			%Ball 2 zeichnen, bewegen und begrenzen
    			\fill[green, draw=black] (\x+ \nx, \y+ \ny) circle (0.15);
    		        \ifthenelse{\Rx<7}{\fill[green, draw=black] (\x+\nx,\y + \ny)  circle (0.15)}{\fill[green] (\nx+7,\ny)  circle (0.15)};
    				
    	%Ende Modellierung Geometrie
    	
    	%Start Ballposition (Diagramm)
    	
    		
    			\begin{axis}[
    			xlabel={\huge$t$},
    			ylabel={\huge$h$},
    			xtick=\empty, 
    			ytick=\empty,
    			scale=1.3,
    			every axis x label/.style={	at={(ticklabel* cs:1.0)}, anchor=west},
    			every axis y label/.style={	at={(ticklabel* cs:1.0)}, anchor=south},
    			x axis line style={->},
    			y axis line style={->},
    			legend style={at={(2 cm,4 cm)}, anchor=north east},
    			at={(6.5 cm, 7.5 cm)},
    			axis x line*=middle,
    			axis y line*=left,
    			xmin=0, xmax=1.2,
    			ymin=0]
    			
    		
    			\addplot[line width=2pt, green, smooth] coordinates 
    			{
    					(0,0)	
    					(0.1,0.39619)
    					(0.2,0.69427)
    					(0.3,0.89426)
    					(0.4,0.99614)
    					(0.5,0.99993)
    					(0.6,0.90561)
    					(0.7,0.71319)
    					(0.8,0.42268)
    					(0.9,0.03407)
    					(0.9077166,0)
    			};
    
    			\addplot[line width=2pt, blue,smooth] coordinates
    			{
    					(0,0)
    					(0.05,0.28072)
    					(0.1,0.53691)
    					(0.2,0.97572)
    					(0.3,1.31642)
    					(0.4,1.55903)
    					(0.5,1.70354)
    					(0.55,1.73637)
    					(0.6,1.74995)
    					(0.65,1.73637)
    					(0.7,1.69826)
    					(0.8, 1.54847)
    					(0.9, 1.30057)
    					(1.0,0.95458)
    					(1.1,0.51049)
    					(1.15,0.25166)
    					(1.19,0.02693)
    					(1.19461402,0)
    					
    			
    			};
    
    			\end{axis}
    			
    	% Ende Ballposition (Diagramm)
    									
    				\end{tikzpicture}
    			}
    			}
    			}
    	\end{animateinline}
    
    
    	
    	\end{frame}
    
    \end{document}
    Der Fehler befindet sich unter dem Kommentar "Ball 2 zeichnen, bewegen und begrenzen", über dem Diagramm-Kommentar.
    Kommentiere ich den \ifthenelse Befehl aus wird ohne Probleme kompiliert. Ich kann mir nicht erklären, was ich in dem Befehl falsch eingetragen habe.

    Vielen Dank für eure Hilfe!
    Grüße,

    Chris

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Der Vergleich in ifthenelse geht nur mit Integerzahlen. Dein \Rx ist aber eine Dezimalzahl. Du must also einen anderen Test verwenden. Z.B. \lengthtest oder den ifthenelse-Befehl von pgf. Ich würde expl3 + \fp_compare:NTF benutzen.

    Code:
    \documentclass{article}
    
    \usepackage{tikz,ifthen,expl3}
    
    \ExplSyntaxOn
    \let\fpcompareTF\fp_compare:nTF
    \ExplSyntaxOff
    	
    \begin{document}
    \ifthenelse{1<7}{yes}{no}
    %\ifthenelse{1.1<7}{yes}{no} %fehler
    
    \ifthenelse{\lengthtest{1pt<7pt}}{yes}{no}
    \ifthenelse{\lengthtest{1.1pt<7pt}}{yes}{no} 
    
    
    \pgfmathifthenelse{1<7}{"yes"}{"no"}\pgfmathresult, 
    \pgfmathifthenelse{1.1<7}{"yes"}{"no"}\pgfmathresult
    
    \fpcompareTF{1 < 7}{yes}{no}, 
    \fpcompareTF{1.1 < 7}{yes}{no} 
    
    \end{document}

  3. #3
    Registrierter Benutzer
    Registriert seit
    16.02.2018
    Beiträge
    4
    Hi u_fischer,

    danke für deine schnelle Antwort. Nun ist es so, dass ich den fp_compare nach deinem Vorbild genutzt habe. Jedoch kompiliert er aktuell sehr lange. Steigt die Rechenanforderung durch diesen Befehl extrem?
    Normalerweise dauert es ohne einen derartigen Befehl max. 30sek, bis fertig kompiliert wurde. Jetzt dauert es allerdings schon über eine halbe Stunde. Oder hat sich das Programm in eine endlosschleife begeben?

    Code:
    [...]
    			\ExplSyntaxOn
    			\let\fpcompareTF\fp_compare:NTF
    			\ExplSyntaxOff
    			
    			\fpcompareTF{\Rx < 7}{\fill[green, draw=black] (\x+\nx, \y + \ny)  circle (0.15cm)}{\fill[green, draw=black] (5,12)  circle (0.15cm)};
    
    [...]
    EDIT: Alles gut! Ich war kurz dumm und habe den \ExplSyntaxOn.... Teil nicht vor das \begin{document} geschrieben!
    Vielen Dank für deine Hilfe.
    Geändert von .cHAIN (19-02-2018 um 15:21 Uhr) Grund: [GELÖST]

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •