xxxxxxxxxx
#(c) Jason Grout/Vincenz Busch
# [edit] Jens Kwasniok April 2016
#Benoetigte Pakete werden importiert
from sage.ext.fast_eval import fast_float
from functools import partial
#Die Variablen werden definiert
var('x y u v')
#gezeichnet werden soll der Bereich:
(u_range,v_range)=([-5..5],[-5..5])
#Die Flaechentransformationsfunktion
def trans(A):
#x und y werden in Abhaengigkeit von u und v definiert
x = A[0,0]*u+A[0,1]*v
y = A[1,0]*u+A[1,1]*v
t_min = max(min(u_range),min(v_range))
t_max = min(max(u_range),max(v_range))
#Zuerst wird die uv-Ebene gezeichnet
#Der Plot der uv-Ebene wird initialisiert
uvplot = Graphics()
#Die schmalen roten vertikalen Linien werden gezeichnet
uvplot = sum([parametric_plot((i,v), (v,t_min,t_max), color='red',axes_labels=['u','v'],figsize=[5,5]) for i in u_range])
#Die schmalen blauen horizontalen Linien werden gezeichnet
uvplot += sum([parametric_plot((u,i), (u,t_min,t_max), color='blue',axes_labels=['u','v']) for i in v_range])
#Die breite rote vertikale Linie wird gezeichnet
uvplot += parametric_plot((1, v), (v,t_min,t_max),color='red',thickness=4)
#Die breite blaue horizontale Linie wird gezeichnet
uvplot += parametric_plot((u,1), (u,t_min,t_max), color='blue',thickness=4)
#Das lila Rechteck wird gezeichnet
pt = vector([1,1])
du = vector([2,0])
dv = vector([0,2])
uvplot += polygon([pt,pt+dv,pt+du+dv,pt+du],color='purple',alpha=0.7)
#Die xy-Ebene wird gezeichnet
#Der Plot der uv-Ebene wird initialisiert
xyplot = Graphics()
#Zur schnelleren Berechnung wird fast_float benutzt
#Da die Argumente der Reihenfolge nach abgearbeitet werden
#werden 2 Versionen gebraucht
xuv = fast_float(x,'u','v')
yuv = fast_float(y,'u','v')
xvu = fast_float(x,'v','u')
yvu = fast_float(y,'v','u')
#Die schmalen roten Linien werden gezeichnet
xyplot = sum([parametric_plot((partial(xuv,i),partial(yuv,i)), (v,t_min,t_max), color='red', axes_labels=['x','y'],figsize=[5,5]) for i in u_range])
#Die schmalen blauen horizontalen Linien werden gezeichnet
xyplot += sum([parametric_plot((partial(xvu,i),partial(yvu,i)), (u,t_min,t_max), color='blue') for i in v_range])
#Die breite rote Linie wird gezeichnet
xyplot += parametric_plot((partial(xuv,1),partial(yuv,1)),(v,t_min,t_max),color='red', linestyle='-',thickness=4)
#Die breite blaue Linie wird gezeichnet
xyplot += parametric_plot((partial(xvu,1),partial(yvu,1)), (u,t_min,t_max), color='blue', linestyle='-',thickness=4)
#Das lila Rechteck wird gezeichnet
t_vals = [0..1,step=5*.01]
vertices = [(x(u=1+t*2,v=1),y(u=1+t*2,v=1)) for t in t_vals]
vertices += [(x(u=1+2,v=1+t*2),y(u=1+2,v=1+2*t)) for t in t_vals]
vertices += [(x(u=1+2-2*t,v=1+2),y(u=1+2-2*t,v=1+2)) for t in t_vals]
vertices += [(x(u=1,v=1+2-2*t),y(u=1,v=1+2-2*t)) for t in t_vals]
xyplot += polygon(vertices,color='purple',alpha=0.7)
theta = 0
#Falls es eine Spiegelungsmatrix ist, zeichnen wir noch die Spiegelungsgerade ein
if A[0,0]==-A[1,1] and A[0,1]==A[1,0] and (abs(A[0,0]^2+A[0,1]^2)-1<10^(-5)):
theta = sign(A[0,1].n())*arccos(A[0,0])/2
factor = max(abs(tan(theta)),1)
t_min2 = max(min(u_range),min(v_range))/factor
t_max2 = min(max(u_range),max(v_range))/factor
if (A[0,0]==-1):
uvplot += parametric_plot((0, v), (v,t_min,t_max),color='yellow',thickness=4)
else:
uvplot += parametric_plot((v, v*tan(theta)), (v,t_min2,t_max2),color='yellow',thickness=4)
#Die beiden Plots werden ausgegeben
show(uvplot)
show(xyplot)
def matrix_chooser(choice=selector(['Beliebige Matrix','Streckungsmatrix','Drehmatrix','Drehstreckungsmatrix','Spiegelungsmatrix'],
default='Beliebige Matrix', label="Beispielarten von Matrizen: ")):
if (choice == 'Beliebige Matrix'):
#Auswahlfunktion fuer eine beliebige Matrix gefuellt mit Zufallseintraegen zwischen -10 und 10
pretty_print(html("Beliebige Matrix:"))
M=[[ceil(20*random())-10,ceil(20*random())-10],[ceil(20*random())-10,ceil(20*random())-10]]
def _(A=input_grid(2, 2, default=M, label='$A =$', to_value=matrix,width=5 )):
pretty_print(html(r"""
Fuer die gewaehlte Matrix $A$ gilt:
$\left(\begin{array}{c} x\\y \end{array}\right)=
%s\cdot
\left(\begin{array}{c}u\\v\end{array}\right)$
""" % latex(A)))
trans(A)
elif (choice == 'Streckungsmatrix'):
#Auswahlfunktion fuer eine Streckungsmatrix gefuellt mit Zufallseintraegen zwischen -10 und 10
pretty_print(html("Streckungsmatrix:"))
a=ceil(20*random())-10
if (a==0) :
a=1
def _(r=slider(-10,10,.1,default=a,label='$r = $')):
A=matrix([[r,0],[0,r]])
pretty_print(html(r"""
Eine Streckungsmatrix hat die Form
$\left(\begin{array}{c}r & 0 \\ 0 & r\end{array}\right)$
mit einem Skalierungsfaktor $r \in \mathbb{R}$."""))
pretty_print(html(r"""
Fuer das gewaehlte $r$ gilt:
$\left(\begin{array}{c} x\\y\end{array}\right)=
%s\cdot
\left(\begin{array}{c}u\\v\end{array}\right)$
""" % latex(A)))
trans(A)
elif (choice == 'Drehmatrix'):
#Auswahlfunktion fuer eine Drehmatrix gefuellt mit Zufallseintraegen
pretty_print(html("Drehmatrix:"))
a=ceil(20*random())/10
def _(theta = slider(0,2*pi,pi/10, default=a, label='$\\theta = $')):
A=matrix([[cos(theta),-sin(theta)],[sin(theta),cos(theta)]])
pretty_print(html(r"""
Eine Drehmatrix hat die Form
$\left(\begin{array}{r}
\cos(\theta)&-\sin(\theta)\\
\sin(\theta) & \cos(\theta)
\end{array}\right)$
mit einem Drehwinkel $0 \leq \theta \leq 2\pi$."""))
pretty_print(html(r"""
Fuer das gewaehlte $\theta$ gilt:
$\left(\begin{array}{c}
x\\y
\end{array}\right)=
\left(\begin{array}{r}
\cos(%s)&-\sin(%s)\\
\sin(%s) & \cos(%s)
\end{array}\right)\cdot
\left(\begin{array}{c}
u\\v
\end{array}\right)$
""" % (latex(theta), latex(theta), latex(theta), latex(theta))))
trans(A)
elif (choice == 'Drehstreckungsmatrix'):
#Auswahlfunktion fuer eine Drehstreckungsmatrix gefuellt mit Zufallseintraegen
pretty_print(html("Drehstreckungsmatrix:"))
a=ceil(20*random())/10
b=ceil(20*random())-10
if (b==0):
b=1
def _(r=slider(-10,10,1/10.,default=b,label='$r = $'),
theta = slider(0,2*pi,pi/10,default=a,label='$\\theta = $')):
A=matrix([[r*cos(theta),-r*sin(theta)],[r*sin(theta),r*cos(theta)]])
pretty_print(html(r"""
Eine Drehstreckungsmatrix hat die Form
$\left(\begin{array}{r}
r\cos(\theta)&-r\sin(\theta)\\
r\sin(\theta) & r\cos(\theta)
\end{array}\right)$
mit einem Drehwinkel $0 \leq \theta \leq 2\pi$
und einem Skalierungsfaktor $r \in \mathbb{R}$.
"""))
pretty_print(html(r"""
Fuer das gewaehlte $\theta$ und $r$ gilt:
$\left(\begin{array}{c}
x\\y
\end{array}\right)=
\left(\begin{array}{r}
%s \cos(%s)&%s \sin(%s)\\
%s \sin(%s) & %s \cos(%s)
\end{array}\right)\cdot
\left(\begin{array}{c}
u\\v
\end{array}\right)$
""" % (latex(r), latex(theta), latex(-r), latex(theta), latex(r), latex(theta), latex(r), latex(theta))))
trans(A)
elif (choice == 'Spiegelungsmatrix'):
#Auswahlfunktion fuer eine Spiegelungsmatrix gefuellt mit Zufallseintraegen
pretty_print(html("Spiegelungsmatrix:"))
a=ceil(20*random())/10
def _(theta=slider(-pi/2,pi/2,pi/10,default=a-pi/2,label='$\\theta = $')):
A=matrix([[cos(2*theta),sin(2*theta)],[sin(2*theta),-cos(2*theta)]])
theta2=2*theta
pretty_print(html(r"""
Sei $g$ die Gerade (in gelb gezeichnet) durch den Ursprung mit dem Steigungswinkel $\theta$, $-\frac{\pi}{2} \leq \theta \leq \frac{\pi}{2}$.<br>
Die Matrix der Spiegelung an der Geraden $g$ hat die Form
$\left(\begin{array}{r}
\cos(2\theta) & \sin(2\theta)\\
\sin(2\theta) & -\cos(2\theta)
\end{array}\right)$
"""))
pretty_print(html(r"""
Fuer das gewaehlte $\theta$ gilt:
$\left(\begin{array}{c}
x\\y
\end{array}\right)=
\left(\begin{array}{r}
\cos(%s) & -\sin(%s)\\
\sin(%s) & -\cos(%s)
\end{array}\right)\cdot
\left(\begin{array}{c}
u\\v
\end{array}\right)$
""" % (latex(theta2),latex(theta2),latex(theta2),latex(theta2))))
trans(A)
Diese Animation wurde von Vincenz Busch im Rahmen eines Projekts zur Verbesserung der Lehre im Lehrlabor des Universitätskollegs der Universität Hamburg erarbeitet. Die Animation basiert auf dem Beispiel Coordinate Transformations von Jason Grout. Hamburg, Oktober 2012. (überarbeitet Mai 2016)
Dieses Vorhaben wird innerhalb des gemeinsamen Bund-Länder-Programms für bessere Studienbedingungen und mehr Qualität in der Lehre aus Mitteln des Bundesministerium für Bildung und Forschung unter dem Förderkennzeichen 01PL12033 gefördert. Die Verantwortung für den Inhalt dieser Veröffentlichung liegt bei den Autor/-innen.