{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 8. Tangent spaces\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": [ "Let $M$ be a smooth manifold and $p ∈ M$. A **tangent vector to $M$ at $p$** is\n", "a map $X_p : C^∞ (M ) → R$ such that\n", "\n", "\\begin{equation}\n", "\\begin{matrix}\n", "X_p (a f + bg) = aX_p ( f ) + bX_p (g),\\\\\n", "X_p(f g) = f (p)X_p(g) + g(p)X_p(f), \n", "\\end{matrix}\n", "\\tag{8.1}\n", "\\end{equation}\n", "\n", "for all $f, g ∈ C^\\infty (M )$ and $a,b\\in R$.

\n", "Maps $C^∞ (M ) → R$ satisfying the last relation are also said to have a **derivation property** and are called\n", "**derivations** (into $R$).

\n", "In the [previous notebook](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/07Manifold_FunPullb_Curves.ipynb) we have checked that the tangent vectors to smooth curves are derivations. Later in this notebook we will show that all tangent vectors are in fact tangent vectors to some curve.

\n", "If we define addition and multiplication by a scalar on the set of derivations at $p$ by\n", "\n", "\\begin{equation}\n", "\\begin{matrix}\n", "(X_p+Y_p)(f)=X_p(f)+Y_p(f),\\\\\n", "(\\lambda X_p)(f)=\\lambda X_p(f),\n", "\\tag{8.2}\n", "\\end{matrix}\n", "\\end{equation}\n", "\n", "for $\\ f ∈ C^\\infty (M )$ and $\\lambda\\in R$, then we obtain a vector space.\n", "\n", "**Tangent space** $T_p M$ to a smooth manifold $M$ at a point $p$ is the vector space of\n", "all tangent vectors to $M$ at $p$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Local bases for tangent spaces\n", "\n", "
\n", "\n", "Let $(U, φ)$ be a chart on $M,$ with coordinates $x^1 , . . . , x^n$ and $p ∈ U$. The tangent\n", "vectors,$ \\frac{∂}{∂ x^i}\\Big|_p$ are defined by\n", "\\begin{equation}\n", "\\frac{∂}{∂ x^i}\\Big|_p(f) = D_i ( f ◦ φ^{−1} )|_{φ( p)}.\n", "\\tag{8.3}\n", "\\end{equation}\n", "\n", "Here $f\\in C^\\infty(M)$ and $D_i$ denotes the partial derivative in $R^n$, i.e. \n", "\n", "$$\\displaystyle D_i(g)|_q=\\lim_{h\\to 0}\\frac{g(q+he_i)-g(q)}{h},\n", "\\quad \\text{for}\\ g\\in C^\\infty(M),\\ q\\in M,$$\n", "\n", "where $e_i$ is the vector in $R^n$ with $i$-th component 1 and all other 0.\n", "\n", "Using the Leibniz rule for $D_i$ one can show that $\\frac{∂}{∂ x^i}\\Big|_p$ satisfy (8.1), so they are tangent vectors to $M$ at $p\\in M$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check how the tangent vectors $\\ \\frac{∂}{∂ x^i}\\big|_p$ act on coordinate functions $x^j$. We have\n", "\n", "$$x^j\\circ\\phi^{-1}(\\phi(p)+he_i)-x^j\\circ\\phi^{-1}(\\phi(p))=\n", "\\left\\{\n", "\\begin{array}{ll}\n", "h, & \\mbox{if } i=j,\\\\\n", "0, & \\mbox{if } i\\not=j.\n", "\\end{array}\\right.$$\n", "\n", "As a consequence we obtain" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\\begin{equation}\n", "\\frac{\\partial}{\\partial x^i}\\Big|_p(x^j)=\\delta^j_i=\n", "\\Big\\{\n", "\\begin{array}{ll}\n", "1, & \\mbox{if } i=j,\\\\\n", "0, & \\mbox{if } i\\not=j.\n", "\\end{array}\n", "\\tag{8.4}\n", "\\end{equation}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**The vectors $\\ \\ \\displaystyle\\frac{\\partial}{\\partial x^i}\\Big|_p,\\ \\ $ $i=1,\\ldots,n\\ \\ $ form a basis of $T_pM$.**\n", "\n", "\n", "\n", "The linear independence follows from the fact that if\n", "$\\sum_{i=1}^n a^i\\frac{\\partial}{\\partial x^i}\\Big|_p=0\\in T_pM$, then by (8.4)\n", "$$\\sum_{i=1}^n a^i\\frac{\\partial}{\\partial x^i}\\Big|_p(x^j)=\\sum_{i=1}^n a^i\\delta^j_i=a^j=0.$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To show that $\\ \\ \\displaystyle\\frac{\\partial}{\\partial x^i}\\Big|_p,\\ \\ $ $i=1,\\ldots,n\\ \\ $ span the tangent space $\\ T_pM\\ $ we need to prove:\n", "\n", "If $\\phi=(x^1,\\ldots,x^n): U\\to R^n$ is a coordinate chart on a manifold $M$ and $X_p\\in T_pM$ is a tangent vector at $p\\in U$, then\n", "\\begin{equation}\n", " X_p=\\sum_{i=1}^n X_p(x^i)\\frac{\\partial}{\\partial x^i}\\Big|_p.\n", " \\label{}\\tag{8.5}\n", " \\end{equation}\n", "\n", "\n", "#### From now on, in all notebooks we use **Einstein summation convention**:
When an index variable appears twice in a single term and is not otherwise defined, it implies summation of that term over all the values of the index.\n", "\n", "\n", "Using this convention, the last formula can be written as\n", "\n", "$$X_p=X_p(x^i)\\frac{\\partial}{\\partial x^i}\\Big|_p.$$\n", " \n", "\n", "To check (8.5) let $f\\in C^\\infty(M)$ and let $F=f\\circ\\phi^{-1}$.\n", "If $q\\in U$, then \n", "\n", "$$f(q)=(f\\circ\\phi^{-1})(\\phi(q))=F(\\phi(q)).$$ \n", "\n", "Analogously $f ( p) = F (φ( p)).\\ \\ $ \n", "We shall use the following version of the mean value theorem.\n", "\n", "
\n", "For smooth function $F$ of $n$ real variables defined in a neighborhood of the segment joining $\\phi(p)$ and $\\phi(q)$ we have the equality
\n", "\n", "\\begin{equation}\n", "\\displaystyle\n", "F(\\phi(q))=F(\\phi(p))+(x^i(q)-x^i(p))g_i(q),\n", "\\tag{8.6}\n", "\\end{equation}
\n", "where $g_i(p)=D_iF|_{\\phi(p)}=D_i(f\\circ\\phi^{-1})|_{\\phi(p)}$.\n", "\n", "If $p$ is fixed, then (8.6) leads to\n", "\n", "$$f (q) = f ( p) + [x^i (q) − x^i ( p) ]g_i (q).$$\n", "\n", "Since $q$ is arbitrary point in a neighborhood of $p$\n", "\n", "\\begin{equation}\n", "f = f ( p) + [x^i − x^i ( p)] g_i.\n", "\\tag{8.7}\n", "\\end{equation}
\n", "Note that for a constant $c$ we have\n", "$X_p(c)=X_p(c\\cdot 1)=cX_p(1)=cX_p(1\\cdot 1)$ $\n", "=c(1\\cdot X_p(1)+1\\cdot X_p(1))=2cX_p(1)=2X_p(c),$ so $X_p(c)=0$.\n", "\n", "\n", "Using (8.1) and the fact that $f(p)$ and $x^i(p)$ are constants\n", "($p$ is fixed) we have\n", "\n", "$$X_p ( f ) = X_p ( f ( p)) + [x^i ( p) − x^i ( p)] X_p (g_i ) \n", "+ g_i ( p) X_p (x^i − x^i ( p))\n", "= g_i ( p) X_p (x^i ).\n", "$$\n", "\n", "Since $g_i(p)=D_i(f\\circ\\phi^{-1})|_{\\phi(p)}=\\frac{\\partial}{\\partial x^i}\\Big|_p(f)$, we have proved (8.5)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Tangent vectors in SageMath\n", "\n", "
\n", "\n", "In the sequel we shall use variables with upper indices in latex output" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 8.1**\n", "\n", "Now let us define our first tangent vector, using variables with **superscripts** in Latex output." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tangent vector v at Point p on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "\\(\\displaystyle v = 2 \\frac{\\partial}{\\partial {x^0} } +\\frac{\\partial}{\\partial {x^1} } + 3 \\frac{\\partial}{\\partial {x^2} }\\)" ], "text/latex": [ "$\\displaystyle v = 2 \\frac{\\partial}{\\partial {x^0} } +\\frac{\\partial}{\\partial {x^1} } + 3 \\frac{\\partial}{\\partial {x^2} }$" ], "text/plain": [ "v = 2 ∂/∂x0 + ∂/∂x1 + 3 ∂/∂x2" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(3, 'M') # Manifold M\n", "X = M.chart(r\"x0:x^0 x1:x^1 x2:x^2\") # chart (x^0,x^1,x^2)\n", "p = M.point((1,0,-2), name='p') # point in M\n", "Tp = M.tangent_space(p) # tangent space at p\n", "v = Tp((2,1,3), name='v') ; print(v) # tangent vector in Tp\n", "v.disp() # show v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we would like subscripts instead, we should write" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tangent vector v at Point p on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "\\(\\displaystyle v = 2 \\frac{\\partial}{\\partial {x_0} } +\\frac{\\partial}{\\partial {x_1} } + 3 \\frac{\\partial}{\\partial {x_2} }\\)" ], "text/latex": [ "$\\displaystyle v = 2 \\frac{\\partial}{\\partial {x_0} } +\\frac{\\partial}{\\partial {x_1} } + 3 \\frac{\\partial}{\\partial {x_2} }$" ], "text/plain": [ "v = 2 ∂/∂x0 + ∂/∂x1 + 3 ∂/∂x2" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Version with subscripts !!!\n", "M = Manifold(3, 'M') # Manifold\n", "X = M.chart(r\"x0:x_0 x1:x_1 x2:x_2\") # chart (x_0,x_1,x_2)\n", "p = M.point((1,0,-2), name='p') # point in M\n", "Tp = M.tangent_space(p) # tangent space at p\n", "v = Tp((2,1,3), name='v') ; print(v) # tangent vector in Tp\n", "v.disp() # show v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 8.2**\n", "\n", "Let us introduce a tangent vector with symbolic components, first with subscripts. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle v = v_{0} \\frac{\\partial}{\\partial {x_0} } + v_{1} \\frac{\\partial}{\\partial {x_1} }\\)" ], "text/latex": [ "$\\displaystyle v = v_{0} \\frac{\\partial}{\\partial {x_0} } + v_{1} \\frac{\\partial}{\\partial {x_1} }$" ], "text/plain": [ "v = v0 ∂/∂x0 + v1 ∂/∂x1" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# version with subscripts\n", "%display latex\n", "M = Manifold(2, 'M') # Manifold\n", "X. = M.chart() # chart (X0,X1)\n", "p = M.point((x0, x1), name='p') # generic point in M\n", "Tp = M.tangent_space(p) # tangent space at p\n", "var('v',n=2) # symbols v0,v1\n", "v = Tp((v0,v1), name='v') # tan. vector in Tp\n", "v.disp() # show v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now the version with superscripts and manifold dimension specified by `N`: " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle V = {v^0} \\frac{\\partial}{\\partial {x^{0}} } + {v^1} \\frac{\\partial}{\\partial {x^{1}} }\\)" ], "text/latex": [ "$\\displaystyle V = {v^0} \\frac{\\partial}{\\partial {x^{0}} } + {v^1} \\frac{\\partial}{\\partial {x^{1}} }$" ], "text/plain": [ "V = v0 ∂/∂x0 + v1 ∂/∂x1" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "N = 2\n", "M = Manifold(N, 'M') # manifold M\n", "X = M.chart(' '.join(['x'+str(i)+':x^{'+str(i)+'}' for i in range(N)])) # chart on M\n", "p = M.point(X[:], name='p') # generic point of M\n", "Tp = M.tangent_space(p) # tangent space at p\n", "v = [var('v'+str(i),latex_name='v'+'^'+str(i)) \n", " for i in range(N)] # variables with superscripts\n", "V = Tp(v, name='V') # tangent vector at p\n", "V.disp() # show tangent vector" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check that the tangent vector `V` maps a scalar function `f` to the real number\n", "$v^0\\left.\\frac{\\partial f}{\\partial x^0}\\right|_p+\n", "v^1\\left.\\frac{\\partial f}{\\partial x^1}\\right|_p\\quad\n", " \\big(=v^i\\left.\\frac{\\partial f}{\\partial x^i}\\right|_p\\big)$.\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle {v^0} \\frac{\\partial}{\\partial {x^{0}}}f\\left({x^{0}}, {x^{1}}\\right) + {v^1} \\frac{\\partial}{\\partial {x^{1}}}f\\left({x^{0}}, {x^{1}}\\right)\\)" ], "text/latex": [ "$\\displaystyle {v^0} \\frac{\\partial}{\\partial {x^{0}}}f\\left({x^{0}}, {x^{1}}\\right) + {v^1} \\frac{\\partial}{\\partial {x^{1}}}f\\left({x^{0}}, {x^{1}}\\right)$" ], "text/plain": [ "v0*diff(f(x0, x1), x0) + v1*diff(f(x0, x1), x1)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x0, x1 = X[:] # coordinates x^0 and x^1 of chart X as the Python variables x0 and x1\n", "f = M.scalar_field(function('f')(x0, x1), name='f') # scalar function f\n", "V(f) # value of vect. field on f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check the derivation property:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\mathrm{True}\\)" ], "text/latex": [ "$\\displaystyle \\mathrm{True}$" ], "text/plain": [ "True" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ " # scalar function g:\n", "g = M.scalar_field(function('g')(x0, x1), name='g') \n", " # V is derivation?\n", "bool(V(f*g) == V(f)*g(p) + f(p)*V(g))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Differential of a smooth map\n", "\n", "
\n", "\n", "The definition of **smooth maps** (from [notebook 1](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/01Manifold_Def.ipynb)) is equivalent to the following. Let $M$ and $N$ be two smooth manifolds with some atlases {$(U_α,φ_α )$} and\n", "{$(V_β,ψ_β)$}, respectively.
A continuous map $F : M → N$ is a **smooth ($C^\\infty$) map** if for all $α$ and $β$ with\n", "$F^{−1}(V_β)∩ U_α \\not= ∅$,\n", "the composition\n", "$ψ_β ◦ F ◦ φ^{−1}_α : φ_α(U_α ∩ F^{-1}(V_β ))→ ψ_β (V_β )$\n", "is smooth ($C^∞$ map on the open subset $φ_α(U_α ∩ F^{-1}(V_β ))$ of $R^n$). \n", "\n", "
\n", "\n", "A **diffeomorphism** of manifolds is a bijective $C^∞$ map $F : N → M$ whose inverse $F^{−1}$\n", "is also $C^∞$.\n", "\n", "If $M$ is a smooth manifold, then the coordinate maps $\\phi: U\\to \\phi(U)$ are examples of diffeomorphisms of open subsets $U$ and $\\phi(U)$.\n", "\n", "In fact, $\\phi: U\\to \\phi(U)$ is homeomorphic by definition. \n", "Take the atlas with a single chart $\\{(U,\\phi)\\}$ on $U$ and the atlas with a single chart $\\{(\\phi(U),id_{\\phi(U)})\\}$ on $\\phi(U)$.\n", "To check the smoothness of $\\phi$ and $\\phi^{-1}$ it suffices to note that $id_{\\phi(U)}\\circ \\phi \\circ \\phi^{-1}$ and $\\phi \\circ \\phi^{-1}\\circ id_{\\phi(U)}$ are identity maps $\\phi(U)\\to\\phi(U).\\ \\ $ Note, that if $V=\\phi(U)$, then $\\phi(U\\cap\\phi^{-1}(V))=\\phi(U)\\ $ and if $\\psi=id_{\\phi(U)}\\ $, then $\\psi(V)=\\phi(U)$.\n", "\n", "
\n", "\n", "Every smooth map ${\\displaystyle F :M\\to N}$ between smooth manifolds induces natural linear maps between their corresponding tangent spaces:\n", "$${\\displaystyle {d} {F }_{p}:T_{p}M\\to T_{F (p)}N,\\quad p\\in M.}$$ \n", " This map is defined by\n", "\\begin{equation}\n", "{\\displaystyle [ {d} {F }_{p}(X_p)]f\\mathrel {\\stackrel {\\text{}}{=}} X_p(f\\circ F ),} \n", "\\tag{8.8}\n", "\\end{equation}\n", "for $X_p\\in T_pM$ and $f\\in C^\\infty(M).$\n", "\n", "The linear map ${\\displaystyle {d} {F }_{p}}$ is called the **differential of $F$ at $p$**, the derivative, or pushforward of \n", "${\\displaystyle F }$ at $ {\\displaystyle p}$. It is frequently expressed using another notations, for example ${(F _{*})_{p}}$ or $T_pF$.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Chain Rule.** If $F : X → Y$ and $H : Y → Z$ are smooth maps between smooth manifolds, then\n", "$d(H ◦ F)_p = dH_{F(p)}◦dF_p$\n", "for any point $p ∈ X$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a consequence of\n", "\n", "$$ dH_{F(p)}(dF_p(X_p))f=(dF_p(X_p)(f\\circ H)=X_p(f\\circ H\\circ F)=d(H\\circ F)_pf.$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "If $F : N → M$ is a diffeomorphism of manifolds and $p ∈ N$, then\n", "$dF_p : T_p N → T_{F(p)} M$ is an isomorphism of vector spaces and $d(F^{-1})_{F(p)}=(dF_p)^{-1}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "\n", "### The value of the differential of the coordinate map on the local basis\n", "\n", "
\n", "\n", "
\n", "Let $(U,\\phi)=(U,x^1,\\ldots,x^n)$ be a coordinate chart at a point $p$ in a manifold $M$. By the definition of the differential and the tangent vector $\\frac{\\partial}{\\partial x^i}\\big|_p$
\n", "$\\displaystyle d\\phi_p\\Big(\\frac{\\partial}{\\partial x^i}\\big|_p\\Big)f=\\frac{\\partial}{\\partial x^i}\\Big|_p(f\\circ\\phi)=D_i\\big|_{\\phi(p)}(f\\circ\\phi\\circ\\phi^{-1})=D_i\\big|_{\\phi(p)}f$. We have checked that\n", "$$\\displaystyle d\\phi_p\\Big(\\frac{\\partial}{\\partial x^i}\\big|_p\\Big)\n", "=D_i\\big|_{\\phi(p)}.$$\n", "Thus the tangent vectors $\\displaystyle \\frac{\\partial}{\\partial x^i}\\big|_p\\ $, ($p\\in U$) are inverse images with respect to $d\\phi_p$ of the tangent vectors corresponding to the partial derivatives \n", "$D_i\\big|_{\\phi(p)}$ . Recall that $D_i\\big|_{\\phi(p)}$ denote the usual partial derivatives in $R^n$ (defined after (8.3))." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Matrix representation of the differential\n", "\n", "
\n", "\n", "For a smooth map $F : M → N$ of manifolds and a point $p ∈ M$,\n", "let $(U, x^1 , \\ldots , x^n )$ and $(V, y^1 , \\ldots , y^m )$ be coordinate charts about $p$ in $M$ and $F(p)$ in $N$,\n", "respectively. Relative to the bases $\\frac{ ∂ }{∂ x^j} |_p $ for $T_p M$ and $\\frac{ ∂ }{ ∂ y^i} |_{F(p)} $ for $T_{F(p)} N$,\n", "the differential $dF_p : T_p M → T_{F(p)} N$ is represented by the Jacobian matrix $$\\displaystyle \\Big[ \\frac{∂ F^i} { ∂ x^j}\\big|_p\\Big],$$\n", "\n", "where $F^i = y^i ◦ F $ is the $i$-th component of $F$ i.e.,\n", "\n", "$$dF_p\\big(\\frac{\\partial}{\\partial x_j}\\big|_p\\big)\n", "=\\frac{∂ F^i} { ∂ x^j}\\big|_p\\frac{\\partial}{\\partial y^i}\\big|_{F(p)}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To check this formula, let us note, that as a linear map, the differential $dF_p$ is is determined by\n", "the matrix $a^i_j$ such that\n", "$$dF_p\\big(\\frac{\\partial}{\\partial x^j}\\big|_p\\big)\n", "=a^k_j \\frac{\\partial}{\\partial y^k}\\big|_{F(p)},\\quad j=1,\\ldots,n.\n", "$$\n", "Applying both sides to $y^i$ we obtain\n", "\n", "$$a^i_j=a^k_j\\delta^i_k=\\Big(a^k_j\\frac{\\partial}{\\partial y^k}\\big|_{F(p)}\\Big)y^i=dF_p\\Big( \\frac{\\partial}{\\partial x^j}\\big|_p\\Big)y^i=\\frac{\\partial}{\\partial x^j}\\big|_p(y^i\\circ F)\n", "=\\frac{\\partial F^i}{\\partial x^j}\\big|_p.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 8.3**\n", "\n", "Consider the map $\\Phi:R^2\\to R^3$ defined by\n", "\n", "$$\\Phi(x,y)=(u,v,w)=(x,y,xy).$$\n", "\n", "For $p=(x,y)$ compute the values $\\ \\ d\\Phi_p(\\frac{\\partial}{\\partial x}\\big|_p\\big)\\ \\ $ and $\\ \\ d\\Phi_p(\\frac{\\partial}{\\partial y}\\big|_p\\big)$." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Generic morphism:\n", " From: Tangent space at Point p on the 2-dimensional differentiable manifold M\n", " To: Tangent space at Point Phi(p) on the 3-dimensional differentiable manifold N\n" ] } ], "source": [ "M = Manifold(2, 'M') # manifold M\n", "X. = M.chart() # coordinates on M\n", "N = Manifold(3, 'N') # manifold N\n", "Y. = N.chart() # coordinates on N\n", " # smooth map Phi: M->N:\n", "Phi=M.diff_map(N,{(X,Y):[x,y,x*y]},name='Phi',latex_name=r'\\Phi') \n", "p = M.point((x,y), name='p') # point p on M\n", "dPhip = Phi.differential(p) # differential of Phi at p\n", "print(dPhip) # print info on the differential" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left(\\frac{\\partial}{\\partial x },\\frac{\\partial}{\\partial y }\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(\\frac{\\partial}{\\partial x },\\frac{\\partial}{\\partial y }\\right)$" ], "text/plain": [ "Basis (∂/∂x,∂/∂y) on the Tangent space at Point p on the 2-dimensional differentiable manifold M" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Tp=M.tangent_space(p) # tangent space at p\n", "b=Tp.default_basis();b # basis of Tp\n", " # index p is dropped" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The values of $d\\Phi_p$ on the basis vectors:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left[{\\mathrm{d}\\Phi}_{p}\\left( \\frac{\\partial}{\\partial x } \\right) = \\frac{\\partial}{\\partial u } + y \\frac{\\partial}{\\partial w }, \\verb|_______|, {\\mathrm{d}\\Phi}_{p}\\left( \\frac{\\partial}{\\partial y } \\right) = \\frac{\\partial}{\\partial v } + x \\frac{\\partial}{\\partial w }\\right]\\)" ], "text/latex": [ "$\\displaystyle \\left[{\\mathrm{d}\\Phi}_{p}\\left( \\frac{\\partial}{\\partial x } \\right) = \\frac{\\partial}{\\partial u } + y \\frac{\\partial}{\\partial w }, \\verb|_______|, {\\mathrm{d}\\Phi}_{p}\\left( \\frac{\\partial}{\\partial y } \\right) = \\frac{\\partial}{\\partial v } + x \\frac{\\partial}{\\partial w }\\right]$" ], "text/plain": [ "[dPhi_p(∂/∂x) = ∂/∂u + y ∂/∂w, '_______', dPhi_p(∂/∂y) = ∂/∂v + x ∂/∂w]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[dPhip(b[0]).disp(),'_______',dPhip(b[1]).disp()]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The coefficients in the basis $\\ \\frac{\\partial}{\\partial u},\\ \\frac{\\partial}{\\partial v}, \\ \\frac{\\partial}{\\partial w}\\ \\ $ of the tangent vectors \n", "$\\ \\ d\\Phi_p(\\frac{\\partial}{\\partial x}\\big|_p\\big)\\ \\ $ and $\\ \\ d\\Phi_p(\\frac{\\partial}{\\partial y}\\big|_p\\big)$\n", "can be found in columns of the Jacobian:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left(\\begin{array}{rr}\n", "1 & 0 \\\\\n", "0 & 1 \\\\\n", "y & x\n", "\\end{array}\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(\\begin{array}{rr}\n", "1 & 0 \\\\\n", "0 & 1 \\\\\n", "y & x\n", "\\end{array}\\right)$" ], "text/plain": [ "[1 0]\n", "[0 1]\n", "[y x]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dPhip.matrix() # matrix of dPhi at p" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 8.4**\n", "\n", "Let us show how the tangent vectors in $R^2$ are transformed by the map $\\ \\Phi(x,y)=(x,y,1-(x^2+y^2)/4).$\n", "\n", "First we sketch a tangent vector $v$ in $R^2$:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAScAAAEkCAYAAABtzvfvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAffElEQVR4nO3df3RU1d3v8fdJwBCahF8p5TcJoiGQq5QIqNBHUR9EAWlpEbVQq4goKUEQBZWap3AJRViWKqmQKkozhcVdCC1e9YIajYiyhCC5ijhpuoxQuChRV0CgQMi+f4SZh0CCmeTMnJ3h81prr5CZk/Pdw8l8sufMnrMdYwwiIraJ8boDIiJ1UTiJiJUUTiJiJYWTiFhJ4SQiVlI4iYiVFE4iYiWFk4hYSeEkIlZSOImIlRROImIlhZOIWEnhJCJWUjiJiJUUTiJiJYWTiFiphdcdEO85jtMeeAroAFQBdxljTp11/yKgtzHm5x51US5Cjq6EKY7jLAP+JzXh9AlwmzHmlTP3OcDXwA5jzHDveikXG72su8g5jpMO/D9jzEHg2jM3f3XWJv8DaAcURrpvcnFTOMkPgYIz//4VUAZ8eNb9/3Hmq8JJIkrnnC5yxph3ARzH6QEMBeaa2q/1/wM4DBR70D25iGnkJAFjz3xdd87t/wG8a4w5HeH+yEVO4SQBA6k59+QP3OA4ThrwI/SSTjygcJKADsAX59x205mvb0e4LyIKJwnaAfRwHCcWwHGcK4D5wDdAiZcdk4uTTohLQC7QDXjNcZwy4DugJfC60WQ48YAmYUpgomUrY8zxs277KbABGG2M+d9e9U0uXgonwXGcTcA1QGdjzNEzYbUVOGyMGeFt7+RipXNOAjXv1H0IHD9zzukP1PxujPe0V3JR08hJcBznP4H/BFoDHakJqj+e/eFfkUhTOImIlfSyTkSspHASESspnETESgonEbGSwklErKRwEhErKZxExEoKJxGxksJJRKykcBIRKymcpBanRtKZKxOIeMaNi83pw3lRpLKykjZt2lBZWel1V8Q7Vvxh0sgpylRVVTF37lxSU1OJj4+nV69ezJs3j+rqaq+7JhISXaY3yixatIjly5ezatUq+vXrx44dO7jnnnto06YN06dP97p7Ig2mcIoyH3zwAWPGjGHkyJEApKSksGbNGnbs2OFxz0RC42o4VVRUsGnTJlJSUoiPj3dz13U6fvw45eXlEavnRc1Q66WmprJu3To2bNhAz549KS0t5e2332bWrFns3LnzvO1PnjzJyZMng99//fXXAGzbto3k5GT3Hkg9dAzDV+/mm2+OyDEMG2NMU1uQz+cz1JwgV1NT87j5fD7TSG7kQpObqyOnlJQUAHw+H+np6W7uuk579uxhwoQJEavnRc1Q623atImlS5fy0EMP0atXL0pLS1myZAkzZ85k9OjR521/7sippKSE7Oxs8vPzyczMdPWx1EXHMHz1As/H5srVcAoMWdPT0xkwYICbu76gSNfzomZD640ZM4Ynn3ySrKys4G2O4+Dz+cjJyWlwvbS0NCsfX3OuGel6kXqZHC6aShBljh07RkxM7cMaGxurqQTS7OjduigzevRoFixYQI8ePejXrx8fffQRTz/9NPfee6/XXRMJicIpyjz77LP89re/ZerUqXz11Vd06dKFKVOm8OSTT3rdNZGQKJyiTGJiIkuXLmXp0qVed0WkSRROAkBeXh55eXkcPXrU666IADohLmdkZWXx6aefUlBQ4HVXRACFk4hYSuEkIlZSOImIlRROImIlhZOIWElTCQTQVAKxj0ZOAmgqgdhH4SQiVlI4iYiVFE4iYiWFk4hYSeEkIlbSVAIBNJVA7KORkwCaSiD2UTiJiJUUTlFo//79TJgwgQ4dOtC6dWv69+9PcXGx190SCYnOOUWZb7/9liFDhjBs2DBef/11OnbsyD//+U/atm3rdddEQqJwijKLFi2ie/fuvPjii8HbmvviinJxcjWcjh8/DtSsOBoJgTqRqudFzVDrrV27lmuvvZabbrqJ4uJiOnbsyLhx4xg7dmyd29e14i+A3+8nISGhib3/fjqG4asXeD42Wy6saR7k8/k8Xx9eTU2tpvl8PtNIbuRCk5urI6fAy4doXYPei5qh1hs8eDDp6em89NJLwdueeuopPv3001q3BdQ1csrOziY/P5/MzEw3HsIF6RiGr15zfznvajgF1maP9jXovajZ0HpdunRh0KBBtba97rrr2LJlS0j9TUtLs/LxNeeaka4XeD42V5pKEGWGDBmC3++vdVtpaSk9e/b0qEcijaNwijIzZsxg27Zt5ObmUlZWxurVq8nPzycrK8vrromEROEUZQYOHMiGDRtYs2YNGRkZzJ8/n6VLl/LLX/7S666JhETznKLQqFGj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\n", "text/plain": [ "Graphics object consisting of 20 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Tangent vector in R^2\n", "R2 = Manifold(2,'R2') # manifold R2\n", "ch1.=R2.chart() # coordinates on R2\n", "p = R2((4,-4), name='p') # p=(4,-4) \"starting point\"\n", "Tp = R2.tangent_space(p) # tangent space at p\n", "v = Tp((4, -2), name='v') # (4,-2) -vector coordinates\n", "p1 = v.plot(fontsize=18,label='$v$', # plot vector v\n", " arrowsize=2,label_offset=0.7,color='black')\n", "p2 = ch1.plot(color='black') # plot the coordinate lines\n", "(p1 + p2).show(figsize=[3,3]) # combine plots" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To obtain more information on plotting vectors use the command `v.plot?`:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# v.plot?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To show the corresponding tangent vector to the graph of $\\Phi$ we have to define the ambient space $R^3$ which contains the graph.\n", " The corresponding tangent vector is equal to $d\\Phi_p(v)$." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Continuation, image of the previous manifold under the map\n", "# (x,y) --> (x,y,1-(x^2+y^2)/4)\n", "R3 = Manifold(3,'R3') # manifold R^3 \n", "ch2. = R3.chart() # coordinates X,Y,Z \n", "Phi = R2.diff_map(R3,{(ch1,ch2):[x,y,1-(x^2+y^2)/4]},\n", " name='Phi',latex_name=r'\\Phi') # define Phi\n", "pl=ch1.plot(chart=ch2,mapping=Phi, thickness=1,number_values=9, \n", " label_axes=False,color='black') # image of coord. lines x,y\n", "pl1=parametric_plot3d([x,y, 1-0.25*(x^2+y^2)],(x,-8,8),(y,-8,8),\n", " color='lightgrey',opacity=0.9) # plot the image of Phi\n", "vpl=v.plot(ch2,mapping=Phi,scale=1,width=6,fontsize=24, label='V',\n", " color='black',label_offset=0.8) # plot vector V\n", "(pl+pl1+vpl).rotateZ(-pi/1.7).show(frame=False,\n", " aspect_ratio=[1,1,0.3]) # combine plots\n", "# the rotation allows for better view of the vector V" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us compute the value of the differential $d\\Phi_p$ on the tangent vector $v$." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle {\\mathrm{d}\\Phi}_{p}\\left(v\\right) = 4 \\frac{\\partial}{\\partial X } -2 \\frac{\\partial}{\\partial Y } -12 \\frac{\\partial}{\\partial Z }\\)" ], "text/latex": [ "$\\displaystyle {\\mathrm{d}\\Phi}_{p}\\left(v\\right) = 4 \\frac{\\partial}{\\partial X } -2 \\frac{\\partial}{\\partial Y } -12 \\frac{\\partial}{\\partial Z }$" ], "text/plain": [ "dPhi_p(v) = 4 ∂/∂X - 2 ∂/∂Y - 12 ∂/∂Z" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dPhi = Phi.differential(p) # differential of Phi at p\n", "dPhi(v).disp() # show the differential" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The coordinates (4,-2,-12) of $d\\Phi_p(v)$ can be obtained as a result of multiplication of the Jacobian of $\\Phi$ at $p$ by the vector of components of $v$:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left(\\begin{array}{rr}\n", "1 & 0 \\\\\n", "0 & 1 \\\\\n", "-2 & 2\n", "\\end{array}\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(\\begin{array}{rr}\n", "1 & 0 \\\\\n", "0 & 1 \\\\\n", "-2 & 2\n", "\\end{array}\\right)$" ], "text/plain": [ "[ 1 0]\n", "[ 0 1]\n", "[-2 2]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ " # jacobian in an arbitrary \n", "jac=Phi.jacobian_matrix() # point (x,y) \n", " # jacobian at the point p \n", " # with coordinates (4,-4):\n", "jac0=jac.apply_map(lambda u:u.subs({x:4,y:-4}))\n", "jac0" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left(4,\\,-2,\\,-12\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(4,\\,-2,\\,-12\\right)$" ], "text/plain": [ "(4, -2, -12)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jac0*vector([4,-2]) # jacobian at p times vector([4,-2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 8.5** \n", "\n", "Let us show a tangent vector in polar coordinates.\n", "This time we define the map by\n", "$\\Phi(r,\\phi)=(r\\cos(\\phi),r\\sin(\\phi), 1-r^2/2)$.\n", "\n", "Its Jacobian is of the form jac=\n", "$\\left(\\begin{matrix}\n", "\\partial\\Phi_1/\\partial r & \\partial\\Phi_1/\\partial\\phi\\\\\n", "\\partial\\Phi_2/\\partial r & \\partial\\Phi_2/\\partial\\phi\\\\\n", "\\partial\\Phi_3/\\partial r & \\partial\\Phi_3/\\partial\\phi\n", "\\end{matrix}\n", "\\right).\n", "$" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "%display latex\n", "R2 = Manifold(2, 'R2') \n", "V = R2.open_subset('V') # disk in r,ph plane\n", "c_rph. = V.chart(r'r:(0,2) ph:(0,2*pi):\\phi') # polar coord.\n", "R3 = Manifold(3, 'R^3') # ambient space R^3\n", "c_cart. = R3.chart() # Cartesian coord. on R^3 \n", "Phi = V.diff_map(R3, # define Phi:\n", " {(c_rph,c_cart):[r*cos(ph),r*sin(ph),1-r^2/2]},\n", " name='Phi',latex_name=r'\\Phi')" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left(\\begin{array}{rr}\n", "\\cos\\left({\\phi}\\right) & -r \\sin\\left({\\phi}\\right) \\\\\n", "\\sin\\left({\\phi}\\right) & r \\cos\\left({\\phi}\\right) \\\\\n", "-r & 0\n", "\\end{array}\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(\\begin{array}{rr}\n", "\\cos\\left({\\phi}\\right) & -r \\sin\\left({\\phi}\\right) \\\\\n", "\\sin\\left({\\phi}\\right) & r \\cos\\left({\\phi}\\right) \\\\\n", "-r & 0\n", "\\end{array}\\right)$" ], "text/plain": [ "[ cos(ph) -r*sin(ph)]\n", "[ sin(ph) r*cos(ph)]\n", "[ -r 0]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jac=Phi.jacobian_matrix();jac # Jacobian of Phi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the point $p$ in the $r,\\phi$ plane with $(r,\\phi)=(1,\\pi/2)$ \n", "we define jac0 as the value of jac in $p$.
" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left(\\begin{array}{rr}\n", "0 & -1 \\\\\n", "1 & 0 \\\\\n", "-1 & 0\n", "\\end{array}\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(\\begin{array}{rr}\n", "0 & -1 \\\\\n", "1 & 0 \\\\\n", "-1 & 0\n", "\\end{array}\\right)$" ], "text/plain": [ "[ 0 -1]\n", "[ 1 0]\n", "[-1 0]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jac0=jac.apply_map(lambda x:x.subs({r:1,ph:pi/2}))\n", "jac0 # show Jacobian at p" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The image of the vector $v$ in the $r,\\phi$ plane with components $(0,1)$ i.e. $ v=0\\frac{\\partial}{\\partial r}+1\\frac{\\partial}{\\partial\\phi}$ is the vector $d\\Phi|_p(v)$:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle {\\mathrm{d}\\Phi}_{p}\\left(v\\right) = -\\frac{\\partial}{\\partial x }\\)" ], "text/latex": [ "$\\displaystyle {\\mathrm{d}\\Phi}_{p}\\left(v\\right) = -\\frac{\\partial}{\\partial x }$" ], "text/plain": [ "dPhi_p(v) = -∂/∂x" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = V((1,pi/2), name='p') # point p in V\n", "c_cart(Phi(p)) # coordinates of Phi at p\n", "dPhi=Phi.differential(p) # differential of Phi at p \n", "Tp = V.tangent_space(p) # tangent space at p\n", "v = Tp((0, 1), name='v') \n", "dPhi(v).disp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Components of this vector can be computed using the jacobian jac0." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left(-1,\\,0,\\,0\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(-1,\\,0,\\,0\\right)$" ], "text/plain": [ "(-1, 0, 0)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jac0*vector([0,1]) # multiply matrix jac0 by the vector [0,1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since the points of the the tangent plane are of the form:
\n", "vector(c_cart(Phi(p)))+jac0*vector([r,ph]),
\n", "we can add the plot of the tangent plane to the surface. " ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot the image of coordinate lines r,ph under Phi:\n", "pl=c_rph.plot(chart=c_cart,mapping=Phi, thickness=2,\n", " number_values=20,label_axes=False,color='black')\n", "\n", "# plot the image of v under Phi\n", "vpl=v.plot(chart=c_cart,mapping=Phi,scale=1.4,width=2,\n", " fontsize=24, label='V',\n", " color='black',label_offset=0.4) \n", "\n", "# plot the graph of Phi\n", "pl1=parametric_plot3d((r*cos(ph),r*sin(ph), 1-0.5*r^2),\n", " (r,0,2),(ph,0,2*pi),color='darkgrey')\n", "\n", "# plot the tangent plane at p\n", "tpl=parametric_plot3d(vector(c_cart(Phi(p)))+\n", " jac0*vector([r,ph])+jac0*vector([r,ph]),\n", " (r,-0.5,0.5),(ph,-pi/4,pi/4),opacity=0.7,color='lightgrey')\n", "\n", "# combine plots\n", "(pl+vpl+pl1+tpl).rotateZ(pi/8).show(aspect_ratio=[1,1,0.9],\n", " frame=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "\n", "### Tangent vectors to curves\n", "\n", "
\n", "\n", "For a **smooth curve** on a Manifold i.e., a smooth map $\\gamma: I\\to M$ we defined (cf. (7.6), [notebook 7](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/07Manifold_FunPullb_Curves.ipynb)) the \n", "**tangent vector** to $\\gamma$ at $t_0\\in I$ to be\n", "\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}.\n", "\\tag{8.9}\n", "\\end{equation}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Tangent vectors to curves in local coordinates\n", "\n", "
\n", "\n", "Let $\\gamma: I\\to M$ be a smooth curve and $(U,x^1,\\ldots,x^n)$ be a coordinate chart about $\\gamma(t_0)$. Define $\\gamma^i=x^i\\circ\\gamma:I\\to R$. Then the tangent vector at $t_0$ to the curve $\\gamma$ is given by\n", "\n", "\\begin{equation}\n", "\\gamma'_{t_0}=\\frac{d(x^i\\circ \\gamma)}{dt}\\Big|_{t_0}\\frac{\\partial}{\\partial x^i}\\Big|_{\\gamma(t_0)}=\\frac{d\\gamma^i}{dt}\\Big|_{t_0}\\frac{\\partial}{\\partial x^i}\\Big|_{\\gamma(t_0)}.\n", "\\tag{8.10}\n", "\\end{equation}\n", "\n", "To check this relation it suffices to recall, that by (8.5)\n", "$\\ \\ \\gamma'_{t_0}=\\gamma'_{t_0}(x^i)\\frac{\\partial}{\\partial x^i}\\Big|_{\\gamma(t_0)}$\n", "and by (8.9) $\\ \\ \\gamma'_{t_0}(x^i) = \n", "\\frac{d(x^i ◦\\gamma)}{dt}\\Big|_{t_0} .$\n", "\n", "
\n", "\n", "### All tangent vectors are tangent to some curve\n", "\n", "
\n", "\n", "Let $M$ be a smooth manifold, $p\\in M$. For any tangent vector $X_p\\in T_pM$, there is a curve $\\gamma: I\\to M$ ( $I$ an open interval containing $t_0$) with $\\gamma_{t_0}=p $ and $\\gamma'_{t_0}=X_p.$\n", "\n", "In fact if $X_p=a^i\\frac{\\partial}{\\partial x^i}\\Big|_p$, define \n", "\n", "$$\\gamma(t)=\\phi^{-1}(\\phi(p)+(t-t_0)a),$$\n", "\n", "where $a=(a^1,\\ldots,a^n)$.\n", "From this definition and the relation $\\gamma(t_0)=p$ it follows\n", "\n", "$$\\phi(\\gamma(t))=\\phi(p)+(t-t_0)a, $$ \n", "\n", "or equivalently\n", "\n", "$$\\phi(\\gamma(t))-\\phi(p)=(t-t_0)a.$$ \n", "\n", "Equating $i$-th components we obtain \n", "$$x^i(\\gamma(t))-x^i(\\gamma(t_0))=a^i(t-t_0),$$\n", "so\n", "$$\\gamma'_{t_0}(x^i)=\\lim_{t\\to t_0}\\frac{x^i(\\gamma(t))-x^i(\\gamma(t_0))}{t-t_0}=a^i.$$\n", "\n", "Thus the tangent vectors $\\gamma'_{t_0}$ and $X_p$ have the same components." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Computing differentials using curves\n", "\n", "
\n", "\n", "Observe that if in the definition of differential: $\\ \\ dF_p(X_p)f=X_p(f\\circ F)\\ \\ $ we replace $dF_p$ by $d\\gamma_0\\ $ and $\\ X_p\\ $ by $\\ \\frac{d}{dt}\\big|_0,\\ $ then we obtain \n", "$\\ \\ d\\gamma_0\\big(\\frac{d}{dt}\\big|_0\\big)f=\\frac{d}{dt}\\big|_0(f\\circ\\gamma)=\\gamma'_0(f),$\n", "so $$d\\gamma_0(\\frac{d}{dt}\\big|_0)=\\gamma'_0.$$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The last two observations give us a useful way of computing differentials $dF_p : T_pM →T_{F(p)}N $. By the first of them, for any $v ∈ T_pM$ we can find a curve $γ : I → M$ with $γ_0 = p$ and $γ'_0 = v$.\n", "Then, by the chain rule,\n", "$$dF_p(v) = dF_p(γ'_0) = dF_p (dγ_0(\\frac{d}{dt}\\big|_0)) = \n", "d(F◦γ)_0 (\\frac{d}{dt}\\big|_0 ) = (F◦γ)'_0.$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thus\n", "the tangent vector to the image of the curve $\\gamma$ under the map $F$ is\n", "the image of the tangent vector to $\\gamma$ under $dF$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 8.6**\n", "\n", "Consider the map $\\Phi(x,y)=(x,y,1-(x^2+y^2)/4)$ and two Cartesian coordinate lines, intersecting in a point $p$ with Cartesian coordinates (1,-1). Let $v_x$ and $v_y$ be the tangent vectors to the coordinate lines at $p$." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAScAAAEdCAYAAABOu6GKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAo6ElEQVR4nO3de1iVZbr48e+rKYIpSoigaWI7PE8hB6MRRScZkW06Nm273GP6m+zSHWZuhp9llKKOx9yO261lNaEm+pvagc6Ujsk4gYcgJVHJgKRExAMeYlAoBOX5/YFrDYvFYS1ch3fB/bkuLlzvet51Pw8Lbp/1vIdbU0ohhBB6087ZHRBCiIZIchJC6JIkJyGELklyEkLokiQnIYQuSXISQuiSJCchhC5JchJC6JIkJyGELklyEkLokiQnIYQuSXISQuiSJCchhC5JchJC6JIkJyGELklyEkLo0n3O7oDQF03TvIA1wAPAbWCaUqq6zvOrgX9RSj3tpC6KNkKTO2GKujRN2wj8ntrk9DXwlFLqk7vPacB1IEspFem8Xoq2QD7WCSNN0wYBl5RSl4En7m6+UqfJMKA78HdH9020PZKcRF09gO13//0cUAAcrfP8qLvfJTkJu5M1J2GklDoIoGlaX2Ak8Loy/dw/CrgBfOWE7ok2RmZOoiFT7n7/uN72UcBBpdQdB/dHtEGSnERDQqhde8o3bNA0bQDQE/lIJxxEkpNoyAPAuXrbnrz7/XMH90W0UZKcREOygL6aprUH0DTtZ8Ay4AfgpDM7JtoOWRAXDVkBPAjs1TStACgHOgB/VXJinHAQOQlTmLh7omUnpdRPdbZNBnYBE5VSnzqrb6JtkeQkTGia9hkQBvgppSruJqsjwA2l1Hjn9k60JbLmJOoLofbEy5/urjn9gdrfk6lO7ZVoc2TmJExomjYOGAd4AD7UJqr/rnvxrxCOIMlJCKFL8rFOCKFLkpyEELokyUkIoUuSnIQQuiTJSQihS5KchBC6JMlJCKFLkpyEELokyUkIoUuSnIQQuiTJSQihS5KcRKO0Wl3v3jZFCIeyZ3JS8mWbr5UrV6qQkBDVpUsX5ePjoyZPnqzy8/Ob3S89PV0FBQWpTp06qf79+6vNmzdbFbesrKwGKLv73ek/B/ly2JcuyMzJBaSnpxMTE0NmZiapqancvn2byMhIKioqGt3n7NmzTJgwgfDwcLKzs3nttdeYN28eycnJDuy5EC1nz1um6CYDtzZXr17Fx8eH9PR0Ro0a1WCbV155hb/85S/k5uYat82ZM4eTJ0+SkZFhUZwbN27g6elJWVkZXbt2tUnfhUvQxcd4hxU4uHbtGl9++SU+Pj506tTJrrEqKyu5cuWKQ2I5Ol5lZSXffvstQUFBlJeXk5OT02C777//nujoaJPnQ0JCyMzMJDs7m/vuM3/rq6urqa7+5z3lSktLAfjqq6/w9va28UhMtfb3zNGxRowYYff3zN4cNnPas2cPWVlZ9ool7KCyspJVq1bx6quvOiRhCNsJDg4mOjq6pbu3rZlTz549gdofWt++fe0aq6ioiKysLIfEcnS87du307lzZwYOHMjgwYMbbRcbG8vo0aOZNGmScVt+fj5Lly5l48aNdO/e3Wyf+jOnM2fOADB8+HAGDhxow1GYa83vmTNiGf7eXJnDkpObmxsAffv2ZdiwYXaPl5WV5bBYjor30ksvcerUKcaOHcvgwYObjHXr1i2uXr1q0qagoIDc3FzCwsLo0KFDs/FqamoAePDBB+U9c7FYhr83VyZH61yAUoq5c+eSkpJCfHy8RfuEhYWRmppqsm3//v0EBwdblJiEcDZJTi4gJiaGpKQkdu7caVz7KS0t5aefjHUvWbhwIc8995zx8Zw5czh37hyxsbHk5uaSmJjI+++/T1xcnMP7L0RLSHJyAW+//TZlZWVEREQwd+5cAObOncuHH35obHPp0iWKioqMj/39/dm7dy9paWk89thjLFu2jA0bNvD00087vP9CtITD1pxEy9U9opqTk0NKSgo7duwwWb/YunWr2X6jR4/m+PHjVsfbtGkTmzZtolevXi3qrxC2IDMnYSYmJoZvvvmGZcuWObsrog2T5CSE0CVJTkIIXZLkJITQJVkQF2ZkQVzogcychBlZEBd6IMlJCKFLkpyEELokyUkIoUuyIC7MyIK40AOZOQkzsiAu9ECSkxBClyQ5CSF0SZKTEEKXJDkJIXRJjtYJM3K0TuiBzJxcxMGDB5k4cSIxMTEAHDt2rMn2aWlpaJpm9pWXl9dsLDlaJ/RAZk4uoqKigkcffRR/f3+Ki4st3i8/P9+kWm+PHj3s0T0hbE6Sk4uIiooiKiqKnJwcq5KTj48P3bp1s1/HhLAThyWnW7duAZjchN9eDDEcEcvR8QwxKioqGi1FDlBSUsKwYcOYMmUK1dXV9O7dm8mTJzNkyJBG96lfVPO7774DoLi4uMlYttAW3jNHxjL8vbkyKUcuGiXlyF2XlCO3gpQjt20sLy8vIiIirNp37dq1AI3WrpNy5K0nlpQjt4KUI7dtrM6dO1sdKyAggKSkJIv3k3LkrhtLypELl5KdnY2fn5+zuyGEReRonYsoLy+noKCA8+fPA3D16lVOnDiBl5cXffv2ZeHChVy4cIEPPvgAgPXr19OvXz+GDBlCVVUVSUlJJCcnk5yc7MxhCGExmTm5iKysLAIDA4mPjwdgx44dBAYGsmjRIsC8HHlVVRVxcXH87Gc/Izw8nMOHD7Nnzx6mTJnilP4LYS2ZObmIiIgIlFIWlyNfsGABCxYsaFEsuXxF6IHMnIQZuXxF6IEkJyGELklyEkLokiQnIYQuyYK4MCML4kIPZOYkzMiCuNADSU5CCF2S5CSE0CVJTkIIXZLkJITQJTlaJ8zI0TqhBzJzEmbkaJ3QA0lOQghdkuQkhNAlSU5CCF2SBXFhRhbEhR7IzEmYkQVxoQeSnFzEwYMHmThxIjExMQAcO3as2X3S09MJCgqiU6dO9O/fn82bN9u7m0LYjCQnF1FRUcGjjz7KjBkzLGp/9uxZJkyYQHh4ONnZ2bz22mvMmzdPChwIlyFrTi4iKiqKqKgocnJyKC4ubrb95s2b6du3L+vXrwdg0KBBZGVlsXbtWp5++mk791aIe+ew5GSo3d7aatM7Op4hRkVFBTk5OY22+/7774mOjjZpExISQmZmJtnZ2dx3n/lbX7/i73fffQdAcXFxk7FsoS28Z46MZfh7c2WaUsper23ywnv27CErK8tesYQdVFZWsmrVKl599VU6derk7O4IKwQHBxMdHd3S3TVb9qWlHDZzMtRub2216R0dzxDLy8uLiIiIRtvFxsYyevRoJk2aZNyWn5/P0qVL2bhxI927dzfbp/7M6cyZMwAMHz6cgQMH2m4QDWgL75kjYxn+3lyZw5KToXZ7a6xN7+h4WVlZdO7cuclYt27d4urVqyZtCgoKyM3NJSwsjA4dOjQbp6amBoAHH3xQ3jMXi2X4e3NlcrSulQoLCyM1NdVk2/79+wkODrYoMQnhbJKcXER5eTknTpygsLAQgKtXr3LixAnjAujChQt57rnnjO3nzJnDuXPniI2NJTc3l8TERN5//33i4uKc0X0hrCbJyUVkZWURGBhIfHw8ADt27CAwMJBFixYBcOnSJZOjQf7+/uzdu5e0tDQee+wxli1bxoYNGyw6jWDTpk0MHjyYN954wz6DEcICcp6Ti4iIiEApRU5ODikpKezYscNk/WLr1q1m+4wePZrjx49bHSsmJoaYmBgyMjI4cODAvXRbiBaTmZMQQpckOQkhdEmSkxBClyQ5CSF0SRbEhRm52ZzQA5k5CTNyszmhB5KchBC6JMlJCKFLkpyEELokC+LCjCyICz2QmZMwIwviQg8kOQkhdEmSkxBClyQ5CSF0SZKTEEKX5GidMCNH64QeyMzJhbz11lu8/PLLAMTHx3Po0KFG26alpaFpmtlXXl5es3HkaJ3QA0lOLuLDDz9k/vz5xlJPAwYMICoqqtlCjfn5+Vy6dMn49cgjjziiu0LcM0lOLmLdunU8//zzjB07FoDnnnuOPn368Pbbbze5n4+PD76+vsav9u3bO6K7QtwzKUfuAvGqq6uprKwkODjYJFZ0dDQFBQUNlgovKSlh2LBhTJkyherqanr37s3kyZMZMmRIk3GkHHnriCXlyJsm5chdnJQjd11SjtwKUo685UpLS5k7dy4JCQm4ubkZYx0/fpzDhw+zdu1ai17H0K6x2nVSjrz1xJJy5FaQcuQtV1VVxTfffIOmafTt29cYa//+/VRWVlocMyAggKSkJIvbSzly140l5ciFQ3Ts2JGgoCCz8uKpqak88cQTFr9OdnY2fn5+tu6eEHYhJ2G6iNjYWKZPn86gQYMA2L59O0VFRcyZMweoLUd+4cIFPvjgAwDWr19Pv379GDJkCFVVVSQlJZGcnExycrLTxiCENSQ5uYipU6dy/fp1Pv74Y0aPHk1eXh579+7loYceAszLkVdVVREXF8eFCxdwd3dnyJAh7NmzhwkTJjQbS84QF3ogycmFvPjii4SHh5OSksLy5cubLEe+YMECFixY0KI4Uo5c6IGsOYk2b/Xq1YSGhjJgwAC2b99u8lxiYiLdunVj3759Tupd2yXJSbRpe/bs4caNGxw9epSJEycya9YsfvzxR+PzR44coaysjD//+c9O7GXbJB/rRJtVU1PD7t27OXLkCAB5eXkopWjX7p//Z7/55pt89tlnreLQvKuR5CTarMLCQkaOHEn79u0pKSlh//79REdHm5wN7+XlxdSpU+WCaSeQ5CTMtJWjdf3792fKlClA7dpSdXU1L7zwglm7W7duGS+4Fo4ja07CTFu8n1NiYiJeXl5ERkaaPXf+/HkCAgKc0Ku2TZKTaPPOnDlDQUEBEyZM4L77TD9MnDx5ksGDBzupZ22bJCfR5p0+fRqgwSS0fv16Zs+ebXz817/+lcWLFzNu3DiuXbtm3L5u3Tpeeukl+3e2DZHkJNo8w5E4T09Pk+3p6en4+PjQr18/oPbuEFlZWSxZsoSCggLS09ONbT/66CM6d+7ssD63BZKchJlNmzYxePBg3njjDWd3xSHCwsLw9fUlOTmZ27dvA5CRkcGbb77J4sWLje3+9re/8Zvf/IbTp09TVFTEiBEjAPjxxx85fvw44eHhTul/ayXJSZhpawvi3bp1IzU1FQ8PD0JCQhg7dizbtm0jKSkJDw8PY7tnnnkGf39/tmzZwtixY3nwwQcByMzM5Pbt21bdIUI0T04lEAIYOnQon3zyiUVtP/zwQ15//XXj40OHDjF06FC6d+9ur+65BE3TugOLqc0r/wJ8BOwE3qT27prdgeVKqW8seT1JTkJY4YcffqC4uJjQ0FDjtkOHDrX5j3SapnUE3gJ+p5S6qGnaQ8BZYBIwH3gE2AOUAnMteU35WCeEFTp27EiHDh2MBQSys7M5fPhwm09OwBxgi1Lq4t3HldTOlgqVUmeB9sAZ4P9Z+oIycxLCCvfffz+bN2/mD3/4A4899hh5eXncunWLkSNHOrtrzlaqlNpf53Hw3e/7AJRSfwX+as0LSnISZtrK5Sst9dvf/pbf/va3APzud79j4MCBxsXxtkoptb3epjHAHeBwS19TPtYJM23taJ01Xn/9dT799FOgtlrN//7v/zJv3jwn90qXxgJfKaVutvQFJDkJYaGrV6+yZs0a45nhK1eu5LHHHjM5g1wYj9o9CqTV2z7LmteR5CSEhXr06MHy5cspKSkhLi6Odu3akZKSYnL/p7ZI07QemqYd1TTNcMbqeGpzy9G6bQCrTgSzy5qTpmlaWVmZybbr169TWVlJXl4e5eXl9ghrVFxc7LBYjo5nz1jV1dXGM6Thn+XIv/32W5vGaYirvGf1F76PHTtmt1gtYYh1/fp1bty40aLX8PT07ArcVJaXAx8NhAB7NU1zB6YCF4H7ATRN6wxsAF6xph92KUeuaVpXoKzZhkIIvfJUSlmU3TRN6wL8AaiiNiGtBLoCK4BzQEdgjVLqlDUdsFdy0srKymrqbjty5AgHDx5kyJAhPPzww8btb7zxRoMLrw1tt7Ttd999x+nTp81i3evrNrTtp59+YtWqVQQFBTF8+HCToza2jtXU2Gzxc3z99deJj483Ps7LyyMmJoZ3332XoUOHtuh19fieNRXPkb+P9ow1atQofv7zn5u0DQkJMZvpNbTNs/YKaGtmTvahlLLXl4nMzEyVkJCgMjMzTbYPGjSoftNGt1vatrFY9/q6DW0rKytTw4YNUwkJCerUqVN2jaWUY3+OBw4cUIA6cOBAi19Xj+/Z8uXLVe/evVVCQoLKyMiw2es2tt0Ff/ftmRcs/nL6Sl5MTIzF261pa008W/RBj7Fs0Qdr4jk7liVtKysrWbZsGTU1tRP7o0ePNtrWln2wpp0efo66YMfMZ3FGtzVHxmpq5mQPjhxbUzMnW3PUuDZs2KAA5efnpxISElR4eLiqqamxa0wX/N13+qxJOXLm1KFDB5PvrSWWm5ub8Sb5juDIsRluWVv/1rX24IhxVVZWsnLlSpNtBQUFpKam2i0mtN7ffXuT5HSP3NzcePrpp+0ex8ARYzPcbG7p0qV2j2XgiHG99957XLp0yWx7QkICyo5rv631d9/enL7mJPSnNV6+0tCsySAjI8PusydhPUlOok3YvXt3g7Mmg40bNzqwN8ISkpxEm9C1a9cmn69f3EA4n9wyRbQJEyZM4Msvv6SgoIDVq1dz9epVAF5++WUGDx7Mk08+6eQeivrsNnMqLCzk+eefx9/fH3d3d+bPnw/UXr/VFKUUCQkJ9OrVC3d3dyIiIox1xZqyfPlynnjiCTw8PJg1y7KLn2fOnImmaSZfjz/+uFWxunXrZlGslo6rtLSU6dOn4+npiaenJ2+99Vaz+7R0XAb2qr7y1ltv4e/vT6dOnQgKCuLQoUONtk1LSzMbg6Zp5OXlNRvn4MGDTJw4kV69eqFpGrt37wYgNDSUadOmmdynKjw8nIkTJ3L06FGCgoLo1KkT/fv3Z/PmzRaNqbFY9hjXypUrCQkJoUuXLvj4+DB58mTy8/Ob3S89Pb1FY3M2uyWnvLw8ampqeOeddzh9+jTTp08Haut7NWXNmjWsW7eOjRs3cuzYMXx9fRk3bhw3bzZ9W5iqqiqeeeYZ/uM//sOqfo4fP55Lly4Zv/bu3dvsPi2J1dJxTZs2jRMnTrBv3z727dvHuXPnLIrXknEZ2GNB/MMPP2T+/PnEx8eTnZ1NeHg4UVFRFBUVNblffn6+yTgeeeSRZmNVVFTw6KOPWryOdPbsWSZMmEB4eDjZ2dm89tprzJs3j+TkZJvHMmjJuNLT04mJiSEzM5PU1FRu375NZGQkFRUVdhmb09nxJCoTp06dUgkJCWrs2LGNnvlVU1OjfH191apVq4zbKisrlaenp9q8eXNTJ40ZbdmyRYWGhlp0UuSMGTPUpEmTLHrdxmJ5enoax9ZYvJaO65tvvlGAyQl1ycnJKiEhQe3bt6/R/e51XAZffPGFAtQXX3xxz68VGhqq5syZY7Jt4MCB6tVXX1VKKbOf4eeff64AVVpaek9xAbVr1y6TbePHjzeehHnkyBG1YMECNXDgQJM2s2fPVo8//vg9x1LKdGy2GpdSSl25ckUBKj09vcFYSqmWjs3pJ2AqZ1y+cv/99zf63NmzZ7l8+TKRkZHGbW5ubowePZovvvjCLv1JS0vDx8eHgIAAXnjhBa5cuWLzGC0dV0ZGBp6ensbijYDxf9gzZ840GdMR47JUVVUVX331lcn4ASIjI5t9XwMDA/Hz8+MXv/gFn3/+uV36l5GRYda3X/7yl2RlZTW7DNFSthiX4bZEXl5ejbZxxthsxWHJ6fLlywCMHTu22TY9e/Y02d6zZ0/jc7YUFRXFjh07+Pvf/85//dd/cezYMcaOHWusrGErLR3X5cuX8fHxafC5f/zjH43u56hxWeratWvcuXPHqvH7+fnx7rvvkpycTEpKCgMGDOAXv/gFBw8etHn/Ll++3GDfbt++bbzrpa3YalxKKWJjYxk5cqTZHSPqcuTYbM3qo3WapiVQWzivKSGqzhm3Fy9eZM2aNYwcObLJ5FQnBlB75u6SJUvMttd17NgxgoODzbZbYurUqcZ/f/zxx5w8eRKATp06Ndj+XmKB9eNq7LmmtoPpuIYOHUpwcDAPPfQQe/bsceilNvXV77NSqtFxDBgwgAEDBhgfh4WFcf78edauXcuoUaMc0reGtt8rW41r7ty5nDp1isOHm68f4Kix2VpLTiXYCPypmTaFhn9cvHiRMWPGWJSUfH19gdps7+fnx9y5c3n22Wd58cUX6dq1K6tWrTLbp1+/flZ0vXGGWL/85S/59a9/zQsvvGCzWC0d16lTpygpKWnwNa05L8fPz4+HHnqo2Y+CBrauvuLt7U379u3NZklXrlwx+1+9KY8//jhJSUk26VNdvr6+Dfbtvvvu44EHHrB5vPqsHddLL73EX/7yFw4ePNhs1Rdnj+1eWJ2clFLXAIvmgxcuXGDMmDEEBQUxe/Zs/vznPzfZ3t/fH19fX1JTUwkMDMTb25uuXbty/PhxVq9ezcCBA63trsW8vb3RNI2SkhIeffRRm8Zq6bjCwsIoKyvj6NGjxgqzhgRjydEdg+vXr3P+/Hn8/Pwsah8TE0NMTAwZGRkcOHDA4jiN6dixI0FBQaSmpvKrX/3KuD01NZVJkyZZ/DrZ2dkWj8EaYWFhZqXI9+/fT3BwsEOuUbN0XEopXnrpJXbt2kVaWhr+/v7N7uPssd0Lu605Xbx4kYiICPr06cPatWuN9zMuLS01aTdw4EB27doF1E4z58+fz4oVK9i1axdff/01M2fOxMPDg2nTpjUZr6ioiBMnTlBUVGS8V09hYaHJPZvrxiovLycuLo6MjAwKCwtJS0tj4sSJeHt7m/wBNRfrzp07FBYWArV3xbTluAYNGsT48eN54YUXyMzMJDMzk/fffx/AZFZjq3HZU2xsLH/84x9JTEwkNzeX//zP/6SoqIg5c+YA8Kc/mU7G169fz+7duzlz5gynT59m4cKFJCcnM3du85Wsy8vLOXHiBCdOnABqD0gY3i8wvyf6nDlzOHfuHLGxseTm5pKYmMj7779PXFzcPcdauHChyblp9zKumJgYkpKS2LlzJ126dOHy5ctcvnzZ5Peu/s/xXsbmdPY6DLhlyxYFGL8M9zwaNmyY6TFLUFu2bDE+rqmpUYsXL1a+vr7Kzc1NjRo1SuXk5DR12FMpVXv4vKFYn3/+eYOxfvzxRxUZGal69OihOnTooPr27atmzJihioqKrIpVN96f/vQnm4/r+vXr6t///d9Vly5dVJcuXdTs2bPNTluw1bjqs+WpBEoptWnTJvXQQw+pjh07quHDh5scAn/xxRdNxrV69Wr18MMPq06dOqnu3burkSNHqj179lgUx3C4vv7XjBkzlFJK9e7d2+RUAqWUSktLU4GBgapjx46qX79+6u2337ZJrBkzZqhnnnnGOLZ7GVdDcer/ntX/ObZwbE4/jUAp5fjznBxxQzZHxnJ0PEfGsnVyaoojx1X/PCd7c8HfD6cnJqWUXFsnzEk5cqEHclcCF1D3+jrDdYNNXbIA93Z9XWu8n5NwPTJzcgHTpk2juLiYffv2cenSJXJycnj77bebTTbjx49ny5YtxscdO3a0d1eFsBlJTjqXm5vLvn37yMzMZMSIEeTk5JCTk0N2djb5+fkmJ/TV5+bmZjzHSghXIx/rdK6h6+sA3N3dm70uTU/X1wlhLYfNnAzXdTV3iwxbMMRwRCx7x7t48SIhISHk5OSYxOjfvz8XLlwwbq/viSeeYMyYMfTo0YOrV6/y0UcfMWPGDJYvX97oyXfV1dUmF4N+9913ABQXFzcax1Yc+Z516NABb29voPbn25rGZojhrOsobcku5cjvMnnhPXv2kJWVZa9Ywg4qKytZtWoVr776aqPXGwp9Cg4OJjo6uqW76+KiO4fNnAzXUAUHB9O3b1+7xioqKiIrK8shsVoa7+bNm8az5hvTo0cPvvjiC5KSkvjjH/9oEis7O5snn3yS0aNHW9zP2NhYIiIieOqppxp8vv7MyXCpzPDhw+166RA49j2Lj4+nsLCQp59+miFDhjS5bmcLjhybIZY11yzqlcOSk5ubGwB9+/Zl2LBhdo+XlZXlsFj2jOfh4cG8efP46aefjNfXZWVl8f333zNu3DiL/7CuX7/OoUOHmD59usV9NFwG9OCDD7aq96y6utp4u5BevXq1qrEZYhn+3lyZLIjrXP3r6wyzmcDAQJPE5ArX1wlhDUlOLmDHjh0MGzaMyMhI4+1V6t+/PD8/33hnxPbt25OTk8OkSZMICAhgxowZBAQEkJGRQZcuXRzefyFaQs5zcgFeXl7G+/3k5OSQkpJC586dTdrUPbDh7u7OZ5991uJ4cvmK0AOZOQkzcvmK0ANJTkIIXZLkJITQJUlOQghdkuQkRCu2evVqQkNDGTBgANu3bzd5LjExkW7durFv3z4n9a5pkpyEmU2bNjF48GDeeOMNZ3dF3IOdO3dy48YNjh49ysSJE5k1axY//vij8fkjR45QVlbWbOERZ5HkJMzI0TrXd+fOHRITE1m6dCkAeXl5tSW+2/3zT/7NN9+kd+/euj2bXM5zEqIVysrKIioqivbt21NSUsL+/fuJjo42uYDby8uLqVOnWlVmzJEkOQnRCo0YMcJ4HV9iYiLV1dUNFoq9deuWRQVvnUE+1gnRyiUmJuLl5UVkZKTZc+fPnycgIMAJvWqezJyEGbl8pfU4c+YMBQUF/OY3v+G++0z/3E+ePMngwYOd1LPmycxJmJEF8dbj9OnTAA0mofXr1zN79myTbf/zP/+DpmlvaJr2saZpgZqm/V9N05Zpmva+QzpchyQnIVoxw5E4T09Pk+3p6en4+PjQr18/47a33nqLMWPGoJRaBuwGPgeOAOeA5zRNM30RO5PkJEQrFhYWhq+vL8nJydy+fRuoLZrx5ptvsnjxYmM7pRTV1dUMHTrUsKkncFYp9QWwCxihlCpzZN9lzUmIVqxbt26kpqaycOFCQkJC6N69OwEBASQlJeHh4WFsp2kaL7/8ct1dI4A0AKXUdeC6A7sNSHISDZAFcf0oKytj9erVPPDAA8yaNcvs45klhg4dyieffGJxe03T2gOjAIevM9UlH+uEGVkQ14933nmHlStXEhcXR79+/Vi2bJnxjqe2dPv2bQ4ePGh4GAx0BQ4BaJrWQdO0uTYP2gxJTi5g+fLlPPHEE3h4eDBr1iyL9lFKkZCQQK9evXB3dyciIsJ45Ea4jpKSEuO///GPf7Bo0SK7JKl3332XyMhIw7V3k4FbgKE80Fxgv82CWUiSkwuoqqrimWeeMbtveFPWrFnDunXr2LhxI8eOHcPX15dx48Zx8+ZNO/ZUOII9klR4eDi//vWvWbFiBcBnwFJgg6ZpS4GTSqlv7zmIlWTNyQUsWbIEgK1bt3L48OFm2yulWL9+PfHx8UyZMgWAbdu20bNnT3bu3Gl2bktbc+fOHeO/P/30Uw4cOGDXeIYSWykpKezevduqfTMzMxt9zpCkVqxYwVNPPcUHH3zQ4j4OGzbMeJ/63//+92ncXQx3JilH7kLxysvL8fPzazZWSUkJPXr0YNCgQSaltidPnszJkycbLb/dVsqR//DDD8Zy5MePH+fixYt2jdenTx9CQ0M5evQo58+ft3p/S2rd5ebmMn/+fP71X/8VkHLkzZFy5C5OypG7LilHbgUpR24qOTmZlJSUJtssW7aM/v37Gx+np6fzt7/9jcDAwCZjffvttyxZsoSNGzfSvXt34/b33nuPH374gVdeeaXB/dpKOfKamhpSU1OpqKjA29vb7rX8bt68ybVr11oUKy0trdn/1H19fYmOjmbs2LFSjrwlpBy5KT8/P5599tkm2/Tr189kxvLVV19x6dIlAgMDm4zVuXNncnJy6NKli0mbc+fO0a1btzZfjhygXbt2pKSkMGrUKLvHM9QabEmspj6Gh4aGkpCQwPjx49G0f052Wks5clkQdxJvb2/juoet+fv74+vrS2pqKoGBgUDtEb/09HRWr15tl5jCcRpLSq2NnErgAoqKijhx4gRFRUXG2UxhYSHl5eXGNgMHDmTXrl1A7aUI8+fPZ8WKFezatYuvv/6amTNn4uHhwbRp05wyBtEyAwYMMP47NDSUvXv3kpmZSVRUVKtOTCAzJ5ewaNEitm3bBvzzyE18fDwbNmwgIiICgPz8fJPzXRYsWMBPP/3Eiy++SGlpKSNGjGD//v0WrXnI5Sv6MWvWLLy9vfHy8mL06NGtPiHVJTMnF7B161aUUiil2LFjBwA7duwwJiaoPbdp5syZxseappGQkMClS5eorKwkPT297hXnTZLLV/SjXbt2TJkyhYiIiDaVmECSkxBCpyQ5CSF0SZKTEEKXJDkJIXRJjtYJM3K0TuiBzJyEGTlaJ/RAkpMQQpckOQkhdEmSkxBCl2RBXJiRBXGhBzJzEmZkQVzogSQnIYQuSXISQuiSJCchhC5JchJC6JIcrRNm5Gid0AOZObmAlpQjnzlzJpqmmXw9/vjjFu0rR+uEHsjMyQUYypGHhYVZVPHXYPz48WzZssX4uGPHjvbonhB2IcnJBVhbjtzAzc0NX19fe3VLCLuScuQuFM/ScuRQW7suNzeXn//853h4eDBo0CD+7d/+DU9Pz0b3aSvlyB0dzxmxpBx506QcuYuTcuSuS8qRW0HKkZuyZznyhpSWlvLyyy8zd+5cQkNDG2zTVsqROzqeM2JJOXIrSDlyU/YsR96Y8vJyrl27JuXInRDP0bGkHLloMXuWI2/I9evXOX/+vHHNSgi9k/OcXIC15cjLy8uJi4sjIyODwsJC0tLSmDhxIt7e3vzqV79yyhiEsJYkJxewaNEiAgMDWbx4sfEoTHx8vMkBhrrlyNu3b09OTg6TJk0iICCAGTNmEBAQQEZGhkXlyIXQA/lY5wK2bt3K1q1bAcjJySElJYUdO3aYrF/UPerq7u7OZ5991uJ4cvmK0AOZOQkzcvmK0ANJTkIIXZLkJITQJUlOQghdkgVxYUYWxIUeyMxJmJEFcaEHkpyEELokyUkIoUuSnIQQuiTJSQihS3K0TpiRo3VCD2TmJMzI0TqhB5KchBC6JMlJCKFLkpyEELokC+LCjCyICz2QmZPOFRYW8vzzz+Pv74+7uzvz588HMKmS0hClFAkJCfTq1Qt3d3ciIiI4ffq0RTFlQVzogSQnncvLy6OmpoZ33nmH06dPM336dAA++uijJvdbs2YN69atY+PGjRw7dgxfX1/GjRvHzZs3HdFtIe6ZfKzTufHjxzN+/Hjj44qKCs6dO8exY8ca3Ucpxfr164mPj2fKlCkAbNu2jZ49e7Jz505mz55t934Lca+kHLmLxTPE6NOnT6MlwktKSujRoweDBg0yaTN58mROnjxpcWnx4uJi43cpR+5asaQcedOkHLmLk3LkrkvKkVthxIgRAPj4+Nj9F72yspIrV644JFZL47WkHHlpaSkrV65k8ODBPPvss43G+vbbb1myZAkbN26ke/fuxu3vvfceP/zwA6+88opFfWrfvj0AkZGRdi8A6grvmSvFMvy9uTKHzZyEqWvXrnHt2rUm29QtR37x4kXGjBnDiBEj2Lp1K+3aNX4s4/vvv+fhhx/m+PHjBAYGGrdPmjSJbt26sW3btgb3u3XrlsnHgRs3btCnTx/Kysro2rWrNcMTrq1tzZyEKWvKkV+4cIExY8YQFBTEli1bmkxMAP7+/vj6+pKammpMTlVVVaSnp7N69epG93Nzc8PNzc3yQQhhR3Iqgc5dvHiRiIgI+vTpw9q1a7l69SqXL1/m8uXLJu3qliPXNI358+ezYsUKdu3axddff83MmTPx8PBg2rRpzhiGEFaz58c6YQOaps0EtjT0nFJKq9NOAf9HKbX17mMNWAzMBroDXwIxSqmvrYjdFSgDPJVSN1o4BCFaRJKTaNTdBNcFuKnkF0U4mCQnIYQuyZqTEEKXJDkJIXRJkpMQQpckOQkhdEmSkxBClyQ5CSF0SZKTEEKXJDkJIXRJkpMQQpckOQkhdEmSkxBCl/4/SgwT/BJAA8YAAAAASUVORK5CYII=\n", "text/plain": [ "Graphics object consisting of 40 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# unit vectors in R^2 tangent to coordinates lines\n", "R2=Manifold(2,'R2') # manifold R2\n", "ch1.=R2.chart(r'x:(-2,2) y:(-2,2)') # coordinates on R2\n", "p = R2((1,-1), name='p') # p=(1,-1) \"starting point\"\n", "Tp = R2.tangent_space(p) # tangent space at p\n", "vx = Tp((1, 0), name='v_x') ; # tangent vector vx at p\n", "vy = Tp((0, 1), name='v_y') ; # tangent vector vy at p\n", "px=vx.plot(fontsize=18,label_offset=0.2, # plot vx\n", " arrowsize=3,color='black')+ch1.plot(color='grey')\n", "py=vy.plot(fontsize=18,label_offset=0.2, # plot vy\n", " arrowsize=2,color='black')+ch1.plot(color='grey')\n", "(px+py).show(figsize=[3,3]) # combine plots" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let us show how the tangent vectors are transformed by $d\\Phi_p$.\n", "\n", "**Remark.** In 3-d plots in SageMath one can use unicode characters (we were not able to obtain latex symbols in 3-d plots)." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "∂\n" ] } ], "source": [ "# example how to obtain \"\\partial\" symbol\n", "from sage.typeset.unicode_characters import *\n", "print(unicode_partial)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# continuation, image of the previous manifold under the map \n", "# (x,y) --> (x,y,1-(x^2+y^2)/4)\n", "R3=Manifold(3,'R3') # manifold R3\n", "ch2.=R3.chart() # coordinates in R3\n", "\n", "Phi = R2.diff_map(R3,{(ch1,ch2):[x,y, 1 - (x^2+y^2)/4]},\n", " name='Phi',latex_name=r'\\Phi') # define Phi\n", "\n", "pl=ch1.plot(chart=ch2,mapping=Phi, thickness=1,number_values=9,\n", " label_axes=False,color='black') # plot image of coord. lines x,y\n", "\n", "pl1=parametric_plot3d([x,y, 1-0.25*(x^2+y^2)],(x,-2,2),(y,-2,2),\n", " color='lightgrey',opacity=0.9) # plot graph of Phi\n", "\n", "vplx=vx.plot(ch2,mapping=Phi,scale=1,width=1,fontsize=20, \n", " label=r'∂/∂X - 1/2 ∂/∂Z',color='black',label_offset=-0.3) \n", " # plot image of vx\n", "\n", "vply=vy.plot(ch2,mapping=Phi,scale=1,width=1,fontsize=20, \n", " label=r'∂/∂Y + 1/2 ∂/∂Z',color='black',label_offset=0.3) \n", " # plot image of vy\n", "\n", "(pl+pl1+vplx+vply).rotateZ(-pi/3).show(frame=False,\n", " aspect_ratio=[1,1,1]) # combine plots\n", "\n", "# images of tangent vectors are tangent \n", "# to transformed coordinate lines" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let us do the corresponding calculations.\n", "\n", "First recall all needed numbers." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, -1) [1, 0] [0, 1]\n" ] } ], "source": [ "# Coordinates in R^2 of p and components of vx, vy\n", "print(p.coord(),\" \",vx.comp()[:],\" \",vy.comp()[:])" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left(1, -1, \\frac{1}{2}\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(1, -1, \\frac{1}{2}\\right)$" ], "text/plain": [ "(1, -1, 1/2)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phi(p).coord() # coordinates of Phi(p)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left(\\begin{array}{rr}\n", "1 & 0 \\\\\n", "0 & 1 \\\\\n", "-\\frac{1}{2} \\, x & -\\frac{1}{2} \\, y\n", "\\end{array}\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(\\begin{array}{rr}\n", "1 & 0 \\\\\n", "0 & 1 \\\\\n", "-\\frac{1}{2} \\, x & -\\frac{1}{2} \\, y\n", "\\end{array}\\right)$" ], "text/plain": [ "[ 1 0]\n", "[ 0 1]\n", "[-1/2*x -1/2*y]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jac=Phi.jacobian_matrix(); jac # Jacobian of dPhi" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left(\\begin{array}{rr}\n", "1 & 0 \\\\\n", "0 & 1 \\\\\n", "-\\frac{1}{2} & \\frac{1}{2}\n", "\\end{array}\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(\\begin{array}{rr}\n", "1 & 0 \\\\\n", "0 & 1 \\\\\n", "-\\frac{1}{2} & \\frac{1}{2}\n", "\\end{array}\\right)$" ], "text/plain": [ "[ 1 0]\n", "[ 0 1]\n", "[-1/2 1/2]" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jac0=jac.apply_map(lambda u:u.subs({x:1,y:-1}))\n", "jac0 # Jacobian at p" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle {\\mathrm{d}\\Phi}_{p}\\left(v_x\\right) = \\frac{\\partial}{\\partial X } -\\frac{1}{2} \\frac{\\partial}{\\partial Z }\\)" ], "text/latex": [ "$\\displaystyle {\\mathrm{d}\\Phi}_{p}\\left(v_x\\right) = \\frac{\\partial}{\\partial X } -\\frac{1}{2} \\frac{\\partial}{\\partial Z }$" ], "text/plain": [ "dPhi_p(v_x) = ∂/∂X - 1/2 ∂/∂Z" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dPhi=Phi.differential(p) # differential of Phi at p\n", "dPhi(vx).disp() # value of dPhi(vx)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle {\\mathrm{d}\\Phi}_{p}\\left(v_y\\right) = \\frac{\\partial}{\\partial Y } + \\frac{1}{2} \\frac{\\partial}{\\partial Z }\\)" ], "text/latex": [ "$\\displaystyle {\\mathrm{d}\\Phi}_{p}\\left(v_y\\right) = \\frac{\\partial}{\\partial Y } + \\frac{1}{2} \\frac{\\partial}{\\partial Z }$" ], "text/plain": [ "dPhi_p(v_y) = ∂/∂Y + 1/2 ∂/∂Z" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dPhi(vy).disp() # value of dPhi(vy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, the components in the basis $\\ \\frac{\\partial}{\\partial X},\\ \\frac{\\partial}{\\partial Y}, \\ \\frac{\\partial}{\\partial Z}\\ \\ $ of the tangent vectors \n", "$\\ \\ d\\Phi_p(\\frac{\\partial}{\\partial x}\\big|_p\\big)\\ \\ $ and $\\ \\ d\\Phi_p(\\frac{\\partial}{\\partial y}\\big|_p\\big)$\n", "can be found in columns of the Jacobian at $p$.\n", "\n", "They can be computed by multiplying the Jacobian at $p$ by the vectors of components of $v_x$ and $v_y$." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left(1,\\,0,\\,-\\frac{1}{2}\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(1,\\,0,\\,-\\frac{1}{2}\\right)$" ], "text/plain": [ "(1, 0, -1/2)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jac0*vector([1,0])" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left(0,\\,1,\\,\\frac{1}{2}\\right)\\)" ], "text/latex": [ "$\\displaystyle \\left(0,\\,1,\\,\\frac{1}{2}\\right)$" ], "text/plain": [ "(0, 1, 1/2)" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jac0*vector([0,1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Family of tangents to a curve\n", "\n", "
\n", "\n", "If we are interested in tangents to a curve, an easy way to define them is to use the notion of the\n", "vector field along the curve (i.e. the map $t\\to \\gamma'(t)$, $t\\in I$). The more general notion of a vector field will be defined in later notebooks. In the figure below, we use the function `tangent_vector_field` which allows for defining tangent vectors in all points of curves. Here we restricted ourselves to a selected point of intersection of two curves $c_1, c_2$ and tangent vectors to these curves at that point.\n", "\n", "
\n", "\n", "**Example 8.7**\n", "\n", "Let us show how `tangent_vector_field` method can be used to plot\n", " tangent vectors to two curves at intersection point." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "R2 = Manifold(2, 'R^2') # R^2\n", "U = R2.open_subset('U') # unit disk in R^2\n", "c_rph. = U.chart(r'r:(0,1) ph:(0,2*pi):\\phi') # polar coordinates on U\n", "R3 = Manifold(3, 'R^3') # R^3\n", "c_cart. = R3.chart() # Cartesian coord. on R^3\n", "Phi = U.diff_map(R3,{(c_rph,c_cart):[r*cos(ph),r*sin(ph), 1-r^2]}, # define Phi\n", "name='Phi', latex_name=r'\\Phi')\n", "R. = manifolds.RealLine() # real line\n", "c1 = U.curve([t+sqrt(2)/4,pi/4], (t, -oo, +oo), name=\"\") # user defined curve #1\n", "c2 = U.curve([sqrt(2)/4,t+pi/4], (t, -oo, +oo), name=\"\") # user defined curve #2\n", "pl=c_rph.plot(chart=c_cart,mapping=Phi, number_values={r:4,ph:2}, \n", " thickness=2,label_axes=False,color='darkgrey') # coordinate lines\n", "pl1=parametric_plot3d([r*cos(ph),r*sin(ph), 1-r^2],(r,0,1),(ph,0,2*pi),\n", " color='lightgrey',opacity=0.9) # surface plot\n", "cpl1=c1.plot(mapping=Phi, max_range=0.4,color='black', # plot curve #1\n", " plot_points=200, thickness=3, label_axes=False)\n", "cpl2=c2.plot(mapping=Phi, max_range=0.6,color='black', # plot curve #2\n", " plot_points=200, thickness=3, label_axes=False) \n", "v1 = c1.tangent_vector_field() # tangents to curve #1\n", "v2 = c2.tangent_vector_field() # tangents to curve #2\n", "vp1=v1.at(R(0)) # tangent to curve #1 at t=0\n", "vp2=v2.at(R(0)) # tangent to curve #2 at t=0 \n", "pv1=vp1.plot(mapping=Phi,scale=0.5,color='black',arrowsize=1) # plot tang.vector #1\n", "pv2=vp2.plot(mapping=Phi,scale=1.5,label_axes=False,\n", " color='black',arrowsize=1) # plot tangent vector #2\n", "(pl+pl1+pv1+pv2+cpl1+cpl2).rotateZ(-pi/7).show(frame=False) # combine plots" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What's next?\n", "\n", "Take a look at the notebook [Tensors on modules](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/09aManifold_Tensors_onModules.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 }