\n",
" Vorbetrachtungen im 3-dimensionalen Raum\n",
"
\n",
"Betrachten wir zunächst das analoge Problem der Untersuchung einer 3-dimensionalen Fläche aus der Perspektive eines 2-dimensionalen Wesens - nennen wir es R2D2 - das nur die 2 Dimensionen einer Ebene $E$ wahrnehmen kann. Nehmen wir an, dass sich die Ebene $E$ durch den 3-dimensionalen Raum bewegt und dabei zeitweise die durch diese Gleichung $Fl$ definierte Fläche schneidet. \n",
"Betrachten wir z.B. die durch die folgende Gleichung implizit definierte Fläche."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"Fl: u^2 + x^2 + y^2 + cos(4*u) + cos(4*x) + cos(4*y) - 0.200000000000000 == 0"
]
},
"execution_count": 1,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"var('d,p,q,u,x,y')\n",
"assume(x,'real');assume(y,'real');assume(u,'real')\n",
"dmin=-2;dmax=2\n",
"pmin=-4;pmax=4\n",
"qmin=-4;qmax=4\n",
"xmin=-2;xmax=2\n",
"ymin=-2;ymax=2\n",
"umin=-2;umax=2\n",
"# Ändern Sie das Folgende, um eine andere Definition zu verwenden\n",
"#f(x,y,u)=(u-x*y)\n",
"#f(x,y,u)=x^3 + y^2 - u^2\n",
"f(x,y,u)=x^2 + y^2 + u^2 + cos(4*x) + cos(4*y) + cos(4*u) - 0.2\n",
"#f(x,y,u)=x^2+y^2+u^2-1\n",
"Fl=f(x,y,u)==0\n",
"show(LatexExpr(\"Fl: \"),Fl)\n",
"def N3(x): return N(x,digits=3)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Als erstes legen wir nun die Richtung fest, in der sich die Ebene im 3-dimensionalen Raum bewegt."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"jupyter": {
"source_hidden": true
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bf63ca8f020240d29fbdc34f98b39d4f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIF8gYXQgMHg3ZmMzYmJkOTJhMjg+IHdpdGggMyB3aWRnZXRzCiAgbl94MTogVHJhbnNmb3JtRmxvYXRTbGlkZXIodmFsdWU9MS4wLCBkZXPigKY=\n"
]
},
"execution_count": 2,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"@interact\n",
"def _(n_x1=slider(xmin,xmax,default=1,label=\"$n_x$\",step_size=0.1),n_y1=slider(ymin,ymax,default=1,label=\"$n_y$\",step_size=0.1),n_u1=slider(umin,umax,default=1,label=\"$n_u$\",step_size=0.1)):\n",
" global n_x\n",
" n_x=n_x1\n",
" global n_y\n",
" n_y=n_y1\n",
" global n_u\n",
" n_u=n_u1\n",
" global vn\n",
" vn=vector([n_x,n_y,n_u])\n",
" show(LatexExpr(\"\\\\vec{n} = \\\\begin{pmatrix} n_x \\\\\\\\ n_y \\\\\\\\ n_u\\\\end{pmatrix} =\"),latex(n(vn.column(),digits=2)))"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Wir bestimmen für diesen Vektor $\\vec{n}$ den zugehörigen Betrag $d_n = | \\vec{n}|$ und Einheitsvektor $\\vec{e_n}$, so dass $\\vec{n}=d_n\\vec{e_n}$ ist. Dabei ist XYY $\\vec{e_n}=\\frac{1}{d_n}\\vec{n} = \\left(\n",
"\\begin{array}{c}\n",
"e_{nx} \\\\\n",
"e_{ny} \\\\\n",
"e_{nu}\n",
"\\end{array}\\right)$."
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Wir bestimmen für diesen Vektor $\\vec{n}$ den zugehörigen Betrag $d_n = | \\vec{n}|$ und Einheitsvektor $\\vec{e_n}$, so dass $\\vec{n}=d_n\\vec{e_n}$ ist. Dabei ist $\\vec{e_n}=\\frac{1}{d_n}\\vec{n} = \\begin{pmatrix}e_{nx} \\\\ e_{ny} \\\\e_{nu}\\end{pmatrix}$."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"jupyter": {
"source_hidden": true
}
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"d_n= 1.73 , \\vec{e_n}= [0.577]\n",
"[0.577]\n",
"[0.577]"
]
},
"execution_count": 3,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"d_n=vn.norm()\n",
"e_n=(1/d_n)*vn\n",
"e_nx=e_n[0]; e_ny=e_n[1]; e_nu=e_n[2]\n",
"show(LatexExpr(\"d_n=\"),N(d_n,digits=3),LatexExpr(\", \\\\vec{e_n}=\"),N3(e_n.column()))"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Wir können nun die Ebene $E$ darstellen, in der unser 2-dimensionales Wesen R2D2 lebt. $\\vec{n_e}$ ist ein Normaleneinheitsvektor der Ebene und $d_n$ ist der Abstand zwischen der Ebene und dem Koordinatenursprung. \n",
"Die Lage dieser Ebene im 3-dimensionalen $(x,y,u)$-Raum können wir mit der Hessesche Normalform beschreiben als Menge aller Punkte $\\vec{z}$, die der Gleichung $\\vec{z}\\cdot \\vec{e_n} = d_n$ genügen; das dabei verwendete Produkt ist das Skalarprodukt. \n",
"Die Ebene ist also durch die Angabe des Normalenvektors $\\vec{n}$ eindeutig festgelegt."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"jupyter": {
"source_hidden": true
}
},
"outputs": [
{
"data": {
"text/html": "\n\n",
"text/plain": [
"Graphics3d Object"
]
},
"execution_count": 4,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"from sage.manifolds.utilities import set_axes_labels\n",
"gE_L(x,y,u)=e_nx*x+e_ny*y+e_nu*u\n",
"av=arrow(vector([0,0,0]),vn,color=\"green\")\n",
"E=implicit_plot3d(gE_L(x,y,u)==d_n,(x,xmin,xmax),(y,ymin,ymax),(u,umin,umax),opacity=0.5)\n",
"plot=av+E\n",
"plot1=set_axes_labels(plot,'x','y','u', color='red')\n",
"show(plot1,viewer=\"threejs\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Die durch $Fl$ definierte Fläche (grün) können wir zusammen mit der Ebene (blau) darstellen. Die Bewegung der Ebene können wir darstellen, indem wir den Abstand d der Ebene zum Koordinatenursprung verändern und die Ebene $E_d$ betrachten, die durch die Gleichung $\\vec{z}\\cdot \\vec{e_n} = d$ definiert wird:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"jupyter": {
"source_hidden": true
}
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"Fl: u^2 + x^2 + y^2 + cos(4*u) + cos(4*x) + cos(4*y) - 0.200000000000000 == 0"
]
},
"execution_count": 5,
"metadata": {
},
"output_type": "execute_result"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "eae2d41385e84b518643b23f7057115b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIF8gYXQgMHg3ZmMzYmIxMzk0ODg+IHdpdGggMSB3aWRnZXQKICBkMTogVHJhbnNmb3JtRmxvYXRTbGlkZXIodmFsdWU9MS43MzIwNTA4MDfigKY=\n"
]
},
"execution_count": 5,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"show(LatexExpr(\"Fl: \"),Fl)\n",
"@interact\n",
"def _(d1=slider(-dmax,dmax,default=d_n,label=\"$d_n$\",step_size=0.1)):\n",
" global d_n\n",
" d_n=d1\n",
" avd=arrow(vector([0,0,0]),vector([d1*e_nx,d1*e_ny,d1*e_nu]),color=\"green\")\n",
" Ed=implicit_plot3d(gE_L==d1,(x,xmin,xmax),(y,ymin,ymax),(u,umin,umax),opacity=0.5)\n",
" plotFl=implicit_plot3d(Fl,(x,xmin,xmax),(y,ymin,ymax),(u,umin,umax),color=\"green\",opacity=0.3)\n",
" plot=avd+Ed+plotFl\n",
" plot1=set_axes_labels(plot,'x','y','u', color='red')\n",
" show(plot1,viewer=\"threejs\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Geben wir nun R2D2 die Möglichkeit, die Kurve zu beschreiben, die unsere Fläche beim Durchgang durch dessen Welt - die Ebene $E$ - erzeugt. Dazu benötigt R2D2 ein Orthonormalsystem in $E$ als Koordinatensystem. \n",
"Es gibt dafür viele mögliche Koordinatensysteme. Wir konstruieren eines indem wir ein 3-dimensionals Orthonormalsystem im Koordinatenursprung bilden, dessen einer Vektor $\\vec{e_n}$ ist. Dieses Koordinatensystem verschieben wir dann längs $\\vec{n}$ in die Ebene. Der Vektor $\\vec{e_n}+\\vec{n}$, der dabei entsteht, wird nicht mehr benötigt, die übrigen 2 bilden ein Orthonormalsystem für $E$. \n",
"Die Ebene parallel zu $E$, die durch den Koordinatenursprung geht, ist der Kern der linearen Abbildung $\\vec{z}\\mapsto \\vec{z}\\cdot \\vec{e_n}$, die durch die Matrix $M_n=\\begin{pmatrix}e_{nx} \\\\ e_{ny} \\\\e_{nu}\\end{pmatrix}$ beschrieben wird. \n",
"Wir berechnen eine Basis $[\\vec{a_1},\\vec{a_2}]$ für diesen Kern."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"\\vec{a_1}= [ 1.00]\n",
"[0.000]\n",
"[-1.00] ,\\vec{a_2}= [0.000]\n",
"[ 1.00]\n",
"[-1.00]"
]
},
"execution_count": 6,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"M_n=matrix(RR,e_n.column())\n",
"B=M_n.kernel().basis()\n",
"a_1=B[0];a_2=B[1]\n",
"show(LatexExpr(\"\\\\vec{a_1}=\"),N3(a_1.column()),LatexExpr(\",\\\\vec{a_2}=\"),N3(a_2.column()))"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"$[\\vec{a_1},\\vec{a_2}]$ orthonormalisieren wir mit dem Gram-Schmidtschen Orthonormalisierungsverfahren zu $[\\vec{b_1},\\vec{b_2}]$."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"jupyter": {
"source_hidden": true
}
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"\\vec{b_1}= [-0.707]\n",
"[-0.000]\n",
"[ 0.707] ,\\vec{b_2}= [ 0.408]\n",
"[-0.816]\n",
"[ 0.408]"
]
},
"execution_count": 7,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"BB,CC=matrix(RDF,B).gram_schmidt(orthonormal=True)\n",
"b_1=BB[0]; b_2=BB[1]\n",
"b_1x=b_1[0];b_1y=b_1[1];b_1u=b_1[2]\n",
"b_2x=b_2[0];b_2y=b_2[1];b_2u=b_2[2]\n",
"show(LatexExpr(\"\\\\vec{b_1}=\"),N3(b_1.column()),LatexExpr(\",\\\\vec{b_2}=\"),N3(b_2.column()))"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Damit ist $[\\vec{b_1},\\vec{b_2},\\vec{e_n}]$ ein Orthonormalsystem für den 3-dimensionalen Raum, das wir mit dem Vektor $\\vec{n}$ so verschieben können, dass $\\vec{b_1}$ und $\\vec{b_2}$ in die Ebene $E$ zu liegen kommen. \n",
"Die Richtungsvektoren vom Endpunkt von $\\vec{n}$ zu $\\vec{n}+\\vec{b_1}, \\vec{n}+\\vec{b_2}$ bilden dann ein Koordinatensystem $K_n$, dessen Koordinatenachsen in der Ebene $E$ liegen."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"jupyter": {
"source_hidden": true
}
},
"outputs": [
{
"data": {
"text/html": "\n\n",
"text/plain": [
"Graphics3d Object"
]
},
"execution_count": 8,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"gE_L(x,y,u)=e_nx*x+e_ny*y+e_nu*u\n",
"av=arrow(vector([0,0,0]),vn,color=\"green\")\n",
"ab_1=arrow(vn,vn+vector(b_1),color=\"yellow\")\n",
"ab_2=arrow(vn,vn+vector(b_2),color=\"yellow\")\n",
"ab_3=arrow(vn,vn+e_n,color=\"green\")\n",
"E=implicit_plot3d(gE_L(x,y,u)==d_n,(x,xmin,xmax),(y,ymin,ymax),(u,umin,umax),opacity=0.5)\n",
"plot=av+E+ab_1+ab_2+ab_3\n",
"plot1=set_axes_labels(plot,'x','y','u', color='red')\n",
"show(plot1,viewer=\"threejs\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false,
"jupyter": {
"source_hidden": false
}
},
"source": [
"Ein Punkt $P$ in der Ebene $E$, der bezüglich $K_n$ eine Darstellung $\\begin{pmatrix}p \\\\ q\\end{pmatrix}$ hat, hat in dem Othonormalsystem für den 3-dimensionalen Raum, das aus $K_{n}$ durch Ergänzung um den Richtungsvektor vom Endpunkt von $\\vec{n}$ nach $\\vec{n}+\\vec{e_n}$ ergänzten (grünen) Vektor entsteht, die Darstellung $\\begin{pmatrix}p \\\\ q \\\\ 0\\end{pmatrix}$. Wir können die Koordinaten von $P$ im kanonischen Koordinatensystem als $\\vec{n}+\\begin{pmatrix} \\vec{b_1} & \\vec{b_2} & \\vec{e_n}\\end{pmatrix}\\cdot\\begin{pmatrix}p \\\\ q \\\\ 0\\end{pmatrix}$ berechnen, also \n",
"$$\n",
"P_x(p,q)=n_x+b_{1x}p+b_{2x}q \\\\\n",
"P_y(p,q)=n_y+b_{1y}p+b_{2y}q \\\\\n",
"P_u(p,q)=n_u+b_{1u}p+b_{2u}q\n",
"$$ \n",
"also $\\begin{pmatrix}P_x \\\\ P_y \\\\ P_z\\end{pmatrix}=\\vec{n}+\\begin{pmatrix} \\vec{b_1} & \\vec{b_2}\\end{pmatrix}\\cdot\\begin{pmatrix}p \\\\ q\\end{pmatrix}$. \n",
"Bewegt sich die Ebene $E$ in Richtung des (grünen) Normalenvektors $\\vec{n}=d_n\\vec{e_n}$ durch den Raum, so ändert sich nur der Abstand $d=d_n$ der Ebene vom Nullpunkt, unser Koordinatensystem $K_n$ verschiebt sich und unsere Koordinatentransformation nimmt - für einen variablen Abstand d vom Ursprung - die folgende Form an.\n",
"$$\n",
"P_x(d,p,q)=d\\cdot e_{nx}+b_{1x}p+b_{2x}q \\\\\n",
"P_y(d,p,q)=d\\cdot e_{ny}+b_{1y}p+b_{2y}q \\\\\n",
"P_u(d,p,q)=d\\cdot e_{nu}+b_{1u}p+b_{2u}q\n",
"$$ "
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"jupyter": {
"source_hidden": true
}
},
"outputs": [
],
"source": [
"P_x(d,p,q)=d*e_nx+b_1x*p+b_2x*q\n",
"P_y(d,p,q)=d*e_ny+b_1y*p+b_2y*q\n",
"P_u(d,p,q)=d*e_nu+b_1u*p+b_2u*q"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Ein Punkt $P$ der Ebene mit den Koordinaten $\\begin{pmatrix}p \\\\ q \\end{pmatrix}$ bezüglich des Koordinatensystems $K_n$ liegt genau dann auf der durch die Gleichung $Fl_3$ definierten Fläche, wenn $f_3(x,y,u)=0$ ist, d.h. genau dann, wenn - das selbe unter Verwendung von p und q ausgedrückt - $f(P_x(d,p,q),P_y(d,p,q),P_u(d,p,q))=0$ ist.\n",
"\n",
"Wir können nun den Durchschnitt der Fläche $Fl_3$ mit der Ebene $E$ darstellen. Sollten Sie hier nichts oder nur die Meldung \"No contour levels were found\" sehen, so schneidet die Ebene die Fläche nicht. In diesem Fall verschieben Sie die Ebene mit Hilfe des Schiebereglers."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false,
"jupyter": {
"source_hidden": true
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1a8075f503df4f1e80a7d1240c32e73d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIF8gYXQgMHg3ZmMxYzQ4Zjk0ODg+IHdpdGggMSB3aWRnZXQKICBkMTogVHJhbnNmb3JtRmxvYXRTbGlkZXIodmFsdWU9MS43MzIwNTA4MDfigKY=\n"
]
},
"execution_count": 10,
"metadata": {
},
"output_type": "execute_result"
}
],
"source": [
"@interact\n",
"def _(d1=slider(dmin,dmax,default=d_n,label=\"$d_n$\",step_size=0.1)):\n",
" global d_n\n",
" d_n=d1\n",
" Fl_L(p,q)=f(P_x(d1,p,q), P_y(d1,p,q), P_u(d1,p,q))\n",
" show(implicit_plot(Fl_L(p,q)==0,(p,pmin,pmax),(q,qmin,qmax)))"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Hier können Sie den Durchgang der Ebene $E$ durch $Fl_3$ als Animation verfolgen. Die Berechnung kann etwas dauern."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING: Some output was deleted.\n"
]
}
],
"source": [
"frames=[implicit_plot(f(P_x(d1,p,q), P_y(d1,p,q), P_u(d1,p,q))==0,(p,pmin,pmax),(q,qmin,qmax)) for d1 in sxrange(dmin,dmax,0.5)]\n",
"anim=animate(frames)\n",
"show(anim)"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"collapsed": false
},
"outputs": [
],
"source": [
]
}
],
"metadata": {
"kernelspec": {
"display_name": "SageMath 9.2",
"language": "sagemath",
"metadata": {
"cocalc": {
"description": "Open-source mathematical software system",
"priority": 1,
"url": "https://www.sagemath.org/"
}
},
"name": "sage-9.2",
"resource_dir": "/ext/jupyter/kernels/sage-9.2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.15"
}
},
"nbformat": 4,
"nbformat_minor": 4
}