Mathematik Labor Projekt Auto (Lösung)

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