{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 7. Smooth functions and pullbacks\n", "\n", "This notebook is part of the [Introduction to manifolds in SageMath](https://sagemanifolds.obspm.fr/intro_to_manifolds.html) by Andrzej Chrzeszczyk (Jan Kochanowski University of Kielce, Poland)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'SageMath version 9.6, Release Date: 2022-05-15'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "version()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Recall that if $M$ is a smooth manifold, the set of all smooth functions from $M$ to $R$ is denoted by $C^∞(M)$.\n", "This set is a **ring** with the operations given by
\n", "\\begin{equation}\n", "\\begin{matrix}\n", "( f + g)( p) = f ( p) + g( p),\\\\\n", "( f g)( p) = f ( p)g( p),\n", "\\end{matrix}\n", "\\label{}\\tag{7.1}\n", "\\end{equation}
\n", "for $f, g ∈ C^\\infty(M),\\ \\ a ∈ R$ and $p ∈ M.$\n", "\n", "One can also define an additional operation\n", "$$(a f )( p) = a f ( p),$$\n", "\n", "for $f∈ C^\\infty(M),\\ \\ a ∈ R$ and $p ∈ M.$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If $ψ$ is a smooth map from $M$ to a smooth manifold $N$ and $f ∈\n", "C^∞ (N )$, the **pullback $ \\ \\ ψ ^* f\\ \\ $ of $f$ under** $\\ \\ ψ\\ \\ $ is defined by\n", "\n", "\\begin{equation}\n", "ψ^∗ f = f ◦ ψ.\n", "\\label{}\\tag{7.2}\n", "\\end{equation}\n", "\n", "If $\\phi\\ $ and $\\ \\chi\\ $ are charts on $M$ and $N$, respectively, then\n", "from $\\ \\ (ψ^∗ f ) ◦ φ^{−1} = ( f ◦ χ^{−1} ) ◦ (χ ◦ ψ ◦ φ^{−1} )\\ \\ $ it follows that $ψ^∗ f ∈\n", "C^∞ (M).$ \n", "\n", "The operation $ψ^∗$ is applied to functions defined on $N$\n", "to produce functions defined on $M$, hence the name pullback for $ψ^∗$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 7.1**\n", "\n", "If we denote by $\\psi$ the coordinate change defined by\n", "$x=r\\cos(\\phi),\\; y=r\\sin(\\phi)$ on the open set $U=\\{(r,\\phi): r>0, 0<\\phi <2\\pi \\},$ then for a scalar function $f$ of variables $x,y,$ the pullback\n", "$\\psi^*f$ is the function $(r,\\phi)\\to f(r\\cos(\\phi),r\\sin(\\phi))$, defined on $U$.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\begin{array}{llcl} {\\psi}^*f:& U & \\longrightarrow & \\mathbb{R} \\\\ & \\left(r, {\\phi}\\right) & \\longmapsto & f\\left(r \\cos\\left({\\phi}\\right), r \\sin\\left({\\phi}\\right)\\right) \\end{array}\\)" ], "text/latex": [ "$\\displaystyle \\begin{array}{llcl} {\\psi}^*f:& U & \\longrightarrow & \\mathbb{R} \\\\ & \\left(r, {\\phi}\\right) & \\longmapsto & f\\left(r \\cos\\left({\\phi}\\right), r \\sin\\left({\\phi}\\right)\\right) \\end{array}$" ], "text/plain": [ "\\psi^*(f): U → ℝ\n", " (r, phi) ↦ f(r*cos(phi), r*sin(phi))" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(2, 'R^2p') # manifold R^2\n", "U = M.open_subset('U') # open subset of R2, \n", " # polar coord. on U: \n", "c_rphi.=U.chart(r'r:(0,oo) phi:(0,2*pi):\\phi')\n", "N = Manifold(2, 'R^2c') # second copy of R^2 \n", "c_xy. = N.chart() # Cartesian coordinates:\n", " # psi: M --> N : polar to Cart.:\n", "psi = U.diff_map(N, (r*cos(phi), r*sin(phi)),name=r'\\psi')\n", " # f -scalar function on N \n", "f = N.scalar_field(function('f')(x,y), name='f') \n", "\n", "fplb=psi.pullback(f) # psi^*f -scalar func. on M\n", "fplb.disp() # show pullback" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "If $ψ$ is a smooth map $M\\to N$ then\n", "\\begin{equation}\n", "ψ^∗ (a f + bg) = aψ^∗ f + bψ^∗ g,\n", "\\tag{7.3}\n", "\\end{equation}
\n", "for $f, g ∈ C^∞ (N )$ and $a, b ∈ R.$\n", "\n", "In fact\n", "$$ψ^∗ (a f + bg) ( p) = (a f + bg)(ψ( p)) = a f (ψ( p)) + bg(ψ( p))\\\\\n", "= a(ψ^∗ f )( p) + b(ψ^∗ g)( p) = (aψ^∗ f + bψ^∗ g)( p).\n", "$$\n", "\n", "If $ψ$ is a smooth map $M\\to N$ then\n", "\\begin{equation}\n", "ψ^∗ ( f g) = (ψ^∗ f )(ψ^∗ g),\n", "\\tag{7.4}\n", "\\end{equation}
\n", "for $f, g ∈ C^∞ (N )$.\n", "\n", "\n", "The last relation follows from\n", "\n", "$$ψ^∗ ( f g) ( p) = ( f g)(ψ( p)) = f (ψ( p))g(ψ( p)) = (ψ^∗ f )( p)(ψ^∗ g)( p)\n", "= (ψ^∗ f )(ψ^∗ g) ( p).\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If $M_1,M_2,M_3$ are smooth manifolds and $ψ_1 : M_1 → M_2$ and $ψ_2 : M_2 → M_3$ are smooth\n", "maps, then \n", "\n", "\\begin{equation}\n", "(ψ_2 ◦ ψ_1 )^∗ = ψ_1^∗ ◦ ψ_2^∗ .\n", "\\tag{7.5}\n", "\\end{equation}\n", "\n", "This is consequence of" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$(ψ_2 ◦ ψ_1 )^∗ f = f ◦ (ψ_2 ◦ ψ_1 ) = ( f ◦ ψ_2 ) ◦ ψ_1 = (ψ_2^∗ f ) ◦ ψ_1 = ψ_1^∗ (ψ_2^∗ f )= (ψ_1^∗ ◦ ψ_2^∗ ) f.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "## Curves in a manifold\n", "\n", "
\n", "\n", "\n", "Let $M$ be a smooth manifold. A **smooth curve** $\\gamma$ in\n", "$M$, is a smooth mapping $\\gamma : I → M$ where $I\\subset R$ is an open interval.
\n", "Equivalently:\n", "$\\gamma : I → M$ is a smooth curve in $M$ if $I$ is an open interval of $R$ and\n", "$φ ◦ \\gamma: I\\to R^n$ is a smooth map for every chart $(U, φ)$ of the atlas of $M$.\n", "\n", "In local coordinates $\\ \\ (x^1,\\ldots,x^n)\\ $ the curve is defined if we define $\\ n\\ $ real functions \n", "\n", "$$\\gamma^1(t)=x^1(\\gamma(t)),\\ldots, \\gamma^n(t)=x^n(\\gamma(t)),\\quad t\\in I. $$\n", "\n", "
\n", "\n", "**Example 7.2**\n", "\n", "Assume, that in an open subset $U\\subset R^2$ we have a curve defined in polar coordinates: $\\ r=1,\\phi=t, \\ t\\in(0,2\\pi)$.
Since in this example the transition maps are defined, the representation of the curve in Cartesian coordinates is determined by the system." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Check of the inverse coordinate transformation:\n", " x == x *passed*\n", " y == y *passed*\n", " r == r *passed*\n", " ph == arctan2(r*sin(ph), r*cos(ph)) **failed**\n", "NB: a failed report can reflect a mere lack of simplification.\n", "\n", "Representations in polar and Cartesian coordinates:\n" ] }, { "data": { "text/html": [ "\\(\\displaystyle \\left(1, t\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(1, t\\right)$" ], "text/plain": [ "(1, t)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\\(\\displaystyle \\left(\\cos\\left(t\\right), \\sin\\left(t\\right)\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(\\cos\\left(t\\right), \\sin\\left(t\\right)\\right)$" ], "text/plain": [ "(cos(t), sin(t))" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "Graphics object consisting of 1 graphics primitive" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "M = Manifold(2, 'R^2', r'\\RR^2') # the Euclidean plane R^2\n", "c_xy. = M.chart() # Cartesian coordinates on R^2\n", "U = M.open_subset('U', coord_def={c_xy: (y!=0, x<0)}) \n", " # the complement of the segment y=0 and x>0\n", "c_cart = c_xy.restrict(U) # Cartesian coordinates on U\n", " # spherical coordinates on U:\n", "c_spher. = U.chart(r'r:(0,+oo) ph:(0,2*pi):\\phi') \n", " # transition spher. to Cartesian\n", "ch_cart_spher=c_cart.transition_map(c_spher, [sqrt(x*x+y*y),\n", " atan2(y,x)])\n", " # transition Cartesian to spher.\n", "ch_cart_spher.set_inverse(r*cos(ph), r*sin(ph))\n", "R. = manifolds.RealLine() # manifold R\n", "c = U.curve({c_spher: (1,t)}, (t, 0, 2*pi), name='c') # curve c\n", "print()\n", "print(\"Representations in polar and Cartesian coordinates:\")\n", "show(c.coord_expr(c_spher)) # curve c in spherical coord.\n", "show(c.coord_expr(c_cart)) # curve c in Cartesian coord.\n", "cp=c.plot(color='black',aspect_ratio=1) # curve plot\n", "cp.show(figsize=[3,3]) # show plot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 7.3**\n", "\n", "Consider the curve in $R^3$ defined in Cartesian coordinates by \n", "$\\ x=\\cos 3t,\\ y=\\sin 3t,\\ z=2t$:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "J = manifolds.OpenInterval(0, 2*pi) # open interval\n", "c.=J.chart() # coordinate t on c\n", "R3 = Manifold(3, 'R^3') # manifold R^3\n", "X. = R3.chart() # Cartesian coord. on R^3\n", " # curve c in R^3:\n", "c = R3.curve({X:[cos(3*t),sin(3*t),2*t]},(t,-pi/2,+pi/2),name='c')\n", " # plot c:\n", "p = c.plot(X,color='grey',thickness=4,plot_points=200,label_axes=False)\n", "p.show(aspect_ratio=[1,1,0.3]) # show plot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 7.4**\n", "\n", "Define a curve on the sphere $S^2$, using spherical coordinates $\\ \\theta=t,\\ \\phi=\\cos 2t$:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%display latex\n", "S2=manifolds.Sphere(2) # sphere S^2\n", "Phi=S2.embedding() # embedding S^2-> E^3\n", "sph.=S2.spherical_coordinates() # spherical coord. on S^2\n", "E=S2.ambient() # Euclidean space E^3\n", "cart. = E.cartesian_coordinates() # Cartesian coord. on E^3\n", "fun=Phi.expr() # functions defining Phi\n", "R. = manifolds.RealLine() # Real line as manifold\n", "c = S2.curve({sph: [t, cos(2*t)]}, (t, -oo, +oo),\n", " name='c') # curve c\n", " # plot c:\n", "p1=c.plot(chart=cart,mapping=Phi,thickness=3,color='black',\n", " plot_points=200, aspect_ratio=1,label_axes=False)\n", "p2=parametric_plot3d(fun,(th,0,pi),(ph,0,2*pi),\n", " color='lightgrey',opacity=0.7) # plot sphere\n", "(p1+p2).rotateZ(pi/2).show(frame=False,label_axes=False) # show plot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Tangent vector to a smooth curve\n", "\n", "
\n", "\n", "If $\\gamma$ is a smooth curve in $M$ and $f ∈ C^∞ (M),$ then $\\gamma^∗ f = f ◦ \\gamma$ is a smooth function from an open interval $I ⊂ R$ into $R$. If $t_0 ∈ I$ , the\n", "**tangent vector to $\\gamma$ at the point $\\gamma(t_0 )$**, denoted by $\\gamma'_{t_0}$ , is the map $C^\\infty(M)\\to R$ defined by\n", "\\begin{equation}\n", "\\gamma'_{t_0}(f) =\\frac{d}{dt}(\\gamma^*f)\\Big|_{t_0}=\n", "\\frac{d}{dt}(f\\circ\\gamma)\\Big|_{t_0},\\quad f\\in C^\\infty(M).\n", "\\label{}\\tag{7.6}\n", "\\end{equation}\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using (7.3), (7.4) we can check that $\\gamma'_{t_0}:C^∞ (M)\\to R$ has the properties\n", "$$\\gamma'_{t_0}(af+bg)=\\frac{d}{dt}(\\gamma^*(af+bg))\\Big|_{t_0}=\\frac{d}{dt}(a\\gamma^*(f)+b\\gamma^*(g))\\Big|_{t_0}\\\\\n", "=a\\frac{d}{dt}(\\gamma^*f)\\Big|_{t_0}+\n", "b\\frac{d}{dt}(\\gamma^*g)\\Big|_{t_0}=\n", "a\\gamma'_{t_0}(f)+b\\gamma'_{t_0}(f),\n", "$$\n", "and\n", "$$\\gamma'_{t_0}(fg)=\\frac{d}{dt}(\\gamma^*(fg))\\Big|_{t_0}=\\frac{d}{dt}(\\gamma^*(f)\\gamma^*(g))\\Big|_{t_0}\\\\\n", "=f (\\gamma(t_0 ))\\frac{d}{dt}(\\gamma^*(g))\\Big|_{t_0}\n", "+g (\\gamma(t_0 ))\\frac{d}{dt}(\\gamma^*(f))\\Big|_{t_0}\\\\\n", "=f (\\gamma(t_0 ))\\gamma'_{t_0}(g)+\n", " g (\\gamma(t_0 ))\\gamma'_{t_0}(f),\n", "$$
\n", "for $f, g ∈ C^∞ (M)$ and $a,b\\in R$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What's next?\n", "\n", "Take a look at the notebook [Tangent spaces](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/08Manifold_Tangent_Vect.ipynb)." ] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.6", "language": "sage", "name": "sagemath" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 4 }