Mathematik Labor Projekt Auto (Lösung) 1 Vorbereitung Alle Befehle zum Erstellen der Grafik werden in einem Scilab-Skript gespeichert. Mit der Anweisung −−> e d i t c a r . s c e wird die Datei car.sce neu erstellt. Falls die Datei bereits existiert wird der bestehende Inhalt angezeigt. Das Verzeichnis indem sich die Datei befindet zeigt der File Browser an. Bitte achten Sie darauf, dass Sie in diesem Verzeichnis Schreibrechte besitzen. Das Skript kann durch Eingabe des Befehls −−> e x e c c a r . s c e in der Console oder über die Auswahl einer Execute Methode im Editor ausgeführt werden. 2 Grafik mit Gitterlinien Mit der Anweisung 7 clear ; wird der Workspace von Scilab gelöscht. Dadurch stellen wir sicher, dass wir beim Ausführen des Skripts nur die Variablen verwenden, die in dem Skript auch definiert werden. Ein Fenster wird durch 18 f1 = f i g u r e (1); geöffnet. Falls das Fenster bereits geöffnet ist, wir durch 23 c l f ( f1 ) ; die alte Grafik gelöscht. Eine Grafik mit Gitterlinien mit x-Werten zwischen −20 und 20 und y-Werten zwischen −10 und 12 wird durch 32 33 34 m t l b _ a x i s ([ −20 20 −10 12 ] ) ; mtlb_axis ( ’ equal ’ ) ; m t l b _ g r i d ( ’ on ’ ) ; erzeugt. Der Befehl mtlb_axis(’equal’) sorgt dabei dafür, dass die Skalierung der x- und y-Werte im Verhältnis 1 : 1 erfolgt. Dadurch werden die Räder später ohne Verzerrung als Kreis dargestellt. 3 Linien für Boden und Heck Die geraden Linien für den Boden und das Heck können mit einem einzigen plot-Befehl erstellt werden: 43 44 x _ l i n e s = [ −16 y_lines = [ 0 Prof. Dr. Jürgen Koch −12 %nan 0 %nan −6 0 6 0 %nan %nan 1 12 0 16 0 15]; 8]; 24. Oktober 2015 Mathematik Labor Projekt Auto (Lösung) 45 p l o t ( x _ l i n e s , y _ l i n e s , ’−k ’ , ’ t h i c k n e s s ’ , 3 ) ; Dabei muss an den beiden Stellen, an denen die Linie unterbrochen wird, %nan in die x- und y-Werte eingefügt werden. 4 Räder Die Räder werden durch zwei Kreise mit Radius r = 3 dargestellt: 54 t = l i n s p a c e ( 0 , 2 ∗ %pi ) ; 55 x_wheel = 3∗ c o s ( t ) ; 56 y_wheel = 3∗ s i n ( t ) ; 57 p l o t ( x_wheel −9, y_wheel , ’−k ’ , ’ t h i c k n e s s ’ , 3 ) ; 58 p l o t ( x_wheel +9, y_wheel , ’−k ’ , ’ t h i c k n e s s ’ , 3 ) ; Genau genommen sind es keine Kreise sondern zwei reguläre 99-Ecke. Mit dem linspace-Befehl erzeugen wir 100 t-Werte im Intervall [0, 2π]. Der plot-Befehl verbindet die entsprechenden Punkte durch gerade Strecken. Zur Darstellung der beiden Räder müssen wir jeweils noch eine entsprechende Verschiebung in x-Richtung vornehmen. 5 Dach Das Dach wird durch eine Parabel, die durch die drei Punkte mit den Koordinaten (−9, 5), (0, 9) und (12, 7) geht, beschrieben. Die Parabel kann als Schaubild eines Polynoms vom Grad 2 in der Form p(x) = a0 + a1 x + a2 x2 , x ∈ [−9, 12], dargestellt werden. Die Koeffizienten a0 , a1 und a2 berechnet man mithilfe eines linearen Gleichungssystems. Dazu setzt man die x- und y-Werte der Punkte in die Gleichung des Polynoms ein und löst das lineare Gleichungssystem in Matrixform: a0 + a1 · (−9) + a2 · (−9)2 = 5 1 −9 (−9)2 a0 5 a0 + a1 · ( 0) + a2 · ( 0)2 = 9 0 ( 0)2 · a1 = 9 ⇐⇒ 1 a0 + a1 · ( 12) + a2 · ( 12)2 = 7 1 12 ( 12)2 a2 7 | {z } | {z } | {z } a y A Die x- und y-Werte der Punkte speichert man in einem Vektor. Achten Sie dabei darauf, dass es Spaltenvektoren und keine Zeilenvektoren sind. 67 px = [ 68 py = [ −9; 0 ; 5; 9; 12]; 7]; Die roten Punkte in der Grafik erzeugt man auch mit dem plot-Befehl. Durch die Option ’.r’ werden rote Marker gesetzt. 72 p l o t ( px , py , ’ . r ’ , ’ m a r k s i z e ’ , 1 0 ) Die Matrix A des linearen Gleichungssystems erzeugt man aus dem Vektor mit den x-Werten der Punkte: 76 A = [ px . ^ 0 px . ^ 1 px . ^ 2 ] ; Prof. Dr. Jürgen Koch 2 24. Oktober 2015 Mathematik Labor Projekt Auto (Lösung) Dabei ist wichtig, dass man die Punktoperation .^ verwendet. Die Lösung des linearen Gleichungssystems berechnet man durch \. 80 a = A\ py ; Die Koeffizienten a0 , a1 und a2 des Polynoms stehen nun im Vektor a. Für das Schaubild des Polynoms erzeugen wir x-Werte im Bereich zwischen −9 und 12 und berechnen die entsprechenden y-Werte als Funktionswerte des Polynoms: 84 85 86 x_roof = l i n s p a c e ( −9 ,12); y _ r o o f = a (1)+ a ( 2 ) ∗ x _ r o o f+a ( 3 ) ∗ x _ r o o f . ^ 2 ; p l o t ( x_roof , y_roof , ’−k ’ , ’ t h i c k n e s s ’ , 3 ) 6 Profilkurve Die Profilkurve ermittelt man im Prinzip genau gleich wie die Parabel für das Dach. Da die Kurve durch sechs Punkte geht, benötigen wir ein Polynom vom Grad 5 p(x) = b0 + b1 x + b2 x2 + b3 x3 + b4 x4 + b5 x5 , 95 96 97 98 99 100 101 102 103 x ∈ [−16, 15]. qx = [ −16; −12; −9; 0 ; 1 2 ; 1 5 ] ; qy = [ 0 ; 4 ; 5 ; 4 ; 7 ; 8]; p l o t ( qx , qy , ’ . r ’ , ’ m a r k s i z e ’ , 1 0 ) B = [ qx . ^ 0 qx . ^ 1 qx . ^ 2 qx . ^ 3 qx . ^ 4 qx . ^ 5 ] ; b = B\ qy ; x _ p r o f i l e = l i n s p a c e ( −16 ,15); y _ p r o f i l e = b (1)+ b ( 2 ) ∗ x _ p r o f i l e+b ( 3 ) ∗ x _ p r o f i l e .^2+b ( 4 ) ∗ x _ p r o f i l e . ^ 3 + . . . b ( 5 ) ∗ x _ p r o f i l e .^4+b ( 6 ) ∗ x _ p r o f i l e . ^ 5 ; p l o t ( x _ p r o f i l e , y _ p r o f i l e , ’−k ’ , ’ t h i c k n e s s ’ , 3 ) 7 Transformation Die gestrichelte Grafik entsteht durch eine Rotation der ursprünglichen Grafik um den Winkel α = 300 im Uhrzeigersinn. Genauer gesagt handelt es sich um eine Rotation um den Ursprung O(0/0), die mathematisch durch Multiplikation mit einer Rotationsmatrix R beschrieben werden kann: cos α − sin α x x cos α − y sin α · = . sin α cos α y x sin α + y cos α | {z } R Dabei ist jedoch zu beachten, dass diese Rotation in mathematische positiver Richtung, also gegen den Uhrzeigersinn, erfolgt. Wir geben den Winkel in Bogenmaß deshalb negativ an: 113 a l p h a = −%pi / 6 ; 114 R = [ c o s ( a l p h a ) − s i n ( a l p h a ) ; . . . 115 s i n ( alpha ) cos ( alpha ) ] ; Prof. Dr. Jürgen Koch 3 24. Oktober 2015 Mathematik Labor Projekt Auto (Lösung) In Scilab können die Koordinaten der Punkte der rotierten Grafik durch eine einzige Matrixmultiplikation berechnet werden. Dazu fasst man alle x- und y-Koordinaten der Punkte der ursprünglichen Grafik in einer Matrix XY zusammen: x1 x2 . . . %nan . . . xn XY = =⇒ R · XY. y1 y2 . . . %nan . . . yn Um zusätzliche ungewollte Verbindungslinien zu vermeiden, kann man auch hier wieder den Trick mit %nan verwenden: 119 XY = [ x _ l i n e s %nan x_wheel −9 %nan x_wheel+9 %nan x _ r o o f %nan x _ p r o f i l e ; . . . 120 y _ l i n e s %nan y_wheel %nan y_wheel %nan y _ r o o f %nan y _ p r o f i l e ] ; 121 RXY = R∗XY ; 122 p l o t (RXY ( 1 , : ) , RXY ( 2 , : ) , ’ : r ’ ) Die Koordinaten aller rotierten Punkte stehen in der Matrix RXY. Alle x-Werte in der ersten Zeile der Matrix werden durch RXY(1,:) und alle y-Werte in der zweiten Zeile der Matrix werden durch RXY(2,:) an den plotBefehl übergeben. Prof. Dr. Jürgen Koch 4 24. Oktober 2015 Mathematik Labor Projekt Auto (Lösung) 8 Zusatzaufgabe Für die Animation wird ein zweites Fenster geöffnet. Damit die Animation flüssig abläuft wählen wir eine Wiederholrate von 24 Bildern pro Sekunde. Eine volle Drehung soll in 10 Sekunden ablaufen. Insgesamt erzeugen wir für eine volle Umdrehung 10 · 24 = 240 Winkelwerte zwischen 0 und 2π. 131 f 2 = f i g u r e ( 2 , ’ f i g u r e _ s i z e ’ , [ 1 0 2 4 , 1 0 2 4 ] , ’ b a c k g r o u n d ’ , c o l o r ( ’ w h i t e ’ ) ) ; 132 133 f r a m e s = 2 4 ; 134 s e c o n d s = 1 0 ; 135 a l p h a s = l i n s p a c e ( 0 , 2 ∗ %pi , s e c o n d s ∗ f r a m e s ) ; 136 137 w h i l e ( 1 ) 138 tic (); 139 for alpha = alphas 140 141 R = [ cos ( alpha ) −s i n ( alpha ) ; . . . 142 s i n ( alpha ) cos ( alpha ) ] ; 143 RXY = R∗XY ; 144 drawlater (); 145 c l f ( f2 ) ; 146 m t l b _ a x i s ([ −20 20 −20 2 0 ] ) ; 147 mtlb_axis ( ’ equal ’ ) ; 148 m t l b _ g r i d ( ’ on ’ ) 149 p l o t (RXY ( 1 , : ) , RXY ( 2 , : ) , ’−k ’ , ’ t h i c k n e s s ’ , 3 ) ; 150 drawnow ( ) ; 151 // s l e e p ( . . . ) ; 152 153 end 154 d i s p ( ’ e l a p s e d time : ’ + s t r i n g ( toc ( ) ) ) ; 155 d i s p ( ’ a b o r t / resume ? ’ ) ; 156 pause 157 a l p h a s = −a l p h a s ; 158 end Für jeden Winkelwert wird die Grafik zunächst gelöscht und dann wieder komplett neu erzeugt. Das erzeugen der Grafik wird in einen Block mit \drawlater() und \drawnow() eingeschlossen. Dadurch wird jede Grafik nur ein einziges mal angezeigt. Das ist für eine ruckelfreie Animation wichtig. Die Laufzeit für eine volle Umdrehung wird mit den Befehlen tic() und toc() ermittelt. Der Aufbau einer neuen Grafik benötigt soviel Zeit, dass kein zusätzlicher sleep()-Befehl erforderlich ist. Der pause-Befehl ermöglicht es, die Animation nach jeweils einer vollen Umdrehung durch -->abort abzubrechen oder durch -->resume fortzusetzen. Damit die Rotation abwechselnd um 3600 gegen den Uhrzeigersinn und danach um 3600 im Uhrzeigersinn erfolgt, ändert man das Vorzeichen der Winkelwerte nach jedem vollen Durchlauf. Prof. Dr. Jürgen Koch 5 24. Oktober 2015
© Copyright 2024 ExpyDoc