xxxxxxxxxx
#(c) Vincenz Busch
# [edit] Jens Kwasniok April 2016
var('x,y,s,t')
#Die Funktion mit dem interact Decorator
def _(p0 = input_box(default=(0,1),label='$(x_0,y_0) = $',width=10),
show_graph = checkbox(default=True,label='Graph von $f$ anzeigen')):
#Definition von f
f = sin(x^2/4+3*x-y)+cos(y^3/9+x^2/4-y+2)
#Berechnung vom Gradienten
df = f.gradient()
#Berechnung des Gradienten an der Staelle (x_0,y_0)
grad_p0 = df(x=p0[0],y=p0[1])
#Zur besseren Darstellung normieren wir den Gradienten
grad_p0 = grad_p0/abs(grad_p0)
#Berechnung der Ableitung in Richtung des Gradienten an der Stelle (x_0,y_0)
dfg(x,y) = df*grad_p0
#Berechung des sichtbaren Bildauschnittes
xmin = p0[0] - 2*max(abs(grad_p0[0]),abs(grad_p0[1]))
xmax = p0[0] + 2*max(abs(grad_p0[0]),abs(grad_p0[1]))
ymin = p0[1] - 2*max(abs(grad_p0[1]),abs(grad_p0[0]))
ymax = p0[1] + 2*max(abs(grad_p0[1]),abs(grad_p0[0]))
# image_3D soll den 3dimensionalen Graphen samt Gradienten und Schnitt(-ebene) zeigen
image_3D = Graphics()
#Falls der Graph von f gezeichnet werden soll, wird er geplottet.
if show_graph:
image_3D += plot3d(f,(x,xmin,xmax),(y,ymin,ymax), adaptive=True, color=['red','white'], opacity=0.75)
#Der Punkt (x_0,y_0,f(x_0,y_0)) wird gezeichnet
image_3D += point3d([p0[0],p0[1],f(x=p0[0],y=p0[1])], size=15)
#Der Gradient wird als Vektor gezeichnet
image_3D += line3d([[p0[0],p0[1],f(x=p0[0],y=p0[1])],[p0[0]+grad_p0[0],p0[1]+grad_p0[1],f(x=p0[0],y=p0[1])]],
color='blue', arrow_head=True, thickness=3)
#Der sichtbare Bereich der z-Achse wird berechnet
# Die Strittgroesse wurde herabgesenkt, damit der Rechenprozess weniger Zeit beansprucht [Jens]
# Fuer den Startwert (2,1) beanspruchte der Algorithmus zuvor bei mir ueber 4min. und anschliessend
# nur noch 15 sec. .
zmax = max([(f(x=p0[0]+i*grad_p0[0],y=p0[1]+i*grad_p0[1])) for i in srange(-2,2,0.25)])
zmin = min([(f(x=p0[0]+i*grad_p0[0],y=p0[1]+i*grad_p0[1])) for i in srange(-2,2,0.25)])
#Die blau-graue Ebene wird gezeichnet
if show_graph:
image_3D += parametric_plot([p0[0]+s*grad_p0[0],p0[1]+s*grad_p0[1],t],(s,-2,2),(t,zmin,zmax),color='lavender',opacity=.75)
#Die Tangente in Richtung des Gradienten wird so gezeichnet, dass sie innerhalb der gezeichneten blau-grauen Ebene bleibt.
tmin = -(zmin-f(x=p0[0],y=p0[1]))/dfg(x=p0[0],y=p0[1])
tmax = (zmax-f(x=p0[0],y=p0[1]))/dfg(x=p0[0],y=p0[1])
image_3D += line3d([[p0[0]-tmin*grad_p0[0],p0[1]-tmin*grad_p0[1],f(x=p0[0],y=p0[1])-tmin*dfg(x=p0[0],y=p0[1])],[p0[0]+tmax*grad_p0[0],p0[1]+tmax*grad_p0[1],f(x=p0[0],y=p0[1])+tmax*dfg(x=p0[0],y=p0[1])]],
color='black', thickness=3)
#Die gelbe Kurve, der Schnitt der blau-grauen Ebene mit dre Flaeche wird gezeichnet.
image_3D += parametric_plot([p0[0]+t*grad_p0[0],p0[1]+t*grad_p0[1],f(x=p0[0]+t*grad_p0[0],y=p0[1]+t*grad_p0[1])], (t,-2,2),color='yellow',thickness=3)
#image_3D wird angezeigt.
image_3D.show(figsize=10)
#Das zweite Bild mit den Hoehenlinien wird definiert
image_2D = contour_plot(f,(x,xmin, xmax), (y,ymin, ymax),fill=False,cmap=[(1-i/20,0,i/20) for i in range(21)],contours=20)
#Der Gradient wird eingezeichnet
image_2D += arrow([p0[0],p0[1]],[p0[0]+grad_p0[0],p0[1]+grad_p0[1]],color='blue')
#Das image_2D wird angezeigt
image_2D.show(axes_labels=['$x$','$y$'])
Diese Animation wurde von Vincenz Busch im Rahmen eines Projekts zur Verbesserung der Lehre im Lehrlabor des Universitätskollegs der Universität Hamburg erarbeitet. Hamburg, Januar 2013. (ü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.