Tangent Spaces - Manifolds

Skip to content
Back to top
View this page
Edit this page

# Tangent Spaces

The class `TangentSpace` implements tangent vector spaces to a differentiable manifold.

AUTHORS:

- Eric Gourgoulhon, Michal Bejger (2014-2015): initial version

- Travis Scrimshaw (2016): review tweaks

REFERENCES:

- Chap. 3 of [Lee2013]

class sage.manifolds.differentiable.tangent_space.TangentSpace(point: ManifoldPoint, base_ring=None)

  Bases: `FiniteRankFreeModule`

  Tangent space to a differentiable manifold at a given point.

  Let \(M\) be a differentiable manifold of dimension \(n\) over a topological field \(K\) and \(p \in M\). The tangent space \(T_p M\) is an \(n\)-dimensional vector space over \(K\) (without a distinguished basis).

  INPUT:

  - `point` – `ManifoldPoint`; point \(p\) at which the tangent space is defined

  EXAMPLES:

  Tangent space on a 2-dimensional manifold:

  Sage

      sage: M = Manifold(2, 'M')
      sage: c_xy.<x,y> = M.chart()
      sage: p = M.point((-1,2), name='p')
      sage: Tp = M.tangent_space(p) ; Tp
      Tangent space at Point p on the 2-dimensional differentiable manifold M

  Python

      >>> from sage.all import *
      >>> M = Manifold(Integer(2), 'M')
      >>> c_xy = M.chart(names=('x', 'y',)); (x, y,) = c_xy._first_ngens(2)
      >>> p = M.point((-Integer(1),Integer(2)), name='p')
      >>> Tp = M.tangent_space(p) ; Tp
      Tangent space at Point p on the 2-dimensional differentiable manifold M

  Tangent spaces are free modules of finite rank over `SymbolicRing` (actually vector spaces of finite dimension over the manifold base field \(K\), with \(K=\RR\) here):

  Sage

      sage: Tp.base_ring()
      Symbolic Ring
      sage: Tp.category()
      Category of finite dimensional vector spaces over Symbolic Ring
      sage: Tp.rank()
      2
      sage: dim(Tp)
      2

  [Python]

      >>> from sage.all import *
      >>> Tp.base_ring()
      Symbolic Ring
      >>> Tp.category()
      Category of finite dimensional vector spaces over Symbolic Ring
      >>> Tp.rank()
      2
      >>> dim(Tp)
      2

  The tangent space is automatically endowed with bases deduced from the vector frames around the point:

  Sage

      sage: Tp.bases()
      [Basis (∂/∂x,∂/∂y) on the Tangent space at Point p on the 2-dimensional
       differentiable manifold M]
      sage: M.frames()
      [Coordinate frame (M, (∂/∂x,∂/∂y))]

  Python

      >>> from sage.all import *
      >>> Tp.bases()
      [Basis (∂/∂x,∂/∂y) on the Tangent space at Point p on the 2-dimensional
       differentiable manifold M]
      >>> M.frames()
      [Coordinate frame (M, (∂/∂x,∂/∂y))]

  At this stage, only one basis has been defined in the tangent space, but new bases can be added from vector frames on the manifold by means of the method `at()`, for instance, from the frame associated with some new coordinates:

  Sage

      sage: c_uv.<u,v> = M.chart()
      sage: c_uv.frame().at(p)
      Basis (∂/∂u,∂/∂v) on the Tangent space at Point p on the 2-dimensional
       differentiable manifold M
      sage: Tp.bases()
      [Basis (∂/∂x,∂/∂y) on the Tangent space at Point p on the 2-dimensional
       differentiable manifold M,
       Basis (∂/∂u,∂/∂v) on the Tangent space at Point p on the 2-dimensional
       differentiable manifold M]

  [Python]

      >>> from sage.all import *
      >>> c_uv = M.chart(names=('u', 'v',)); (u, v,) = c_uv._first_ngens(2)
      >>> c_uv.frame().at(p)
      Basis (∂/∂u,∂/∂v) on the Tangent space at Point p on the 2-dimensional
       differentiable manifold M
      >>> Tp.bases()
      [Basis (∂/∂x,∂/∂y) on the Tangent space at Point p on the 2-dimensional
       differentiable manifold M,
       Basis (∂/∂u,∂/∂v) on the Tangent space at Point p on the 2-dimensional
       differentiable manifold M]

  All the bases defined on `Tp` are on the same footing. Accordingly the tangent space is not in the category of modules with a distinguished basis:

  Sage

      sage: Tp in ModulesWithBasis(SR)
      False

  Python

      >>> from sage.all import *
      >>> Tp in ModulesWithBasis(SR)
      False

  It is simply in the category of modules:

  Sage

      sage: Tp in Modules(SR)
      True

  [Python]

      >>> from sage.all import *
      >>> Tp in Modules(SR)
      True

  Since the base ring is a field, it is actually in the category of vector spaces:

  Sage

      sage: Tp in VectorSpaces(SR)
      True

  Python

      >>> from sage.all import *
      >>> Tp in VectorSpaces(SR)
      True

  A typical element:

  Sage

      sage: v = Tp.an_element() ; v
      Tangent vector at Point p on the
       2-dimensional differentiable manifold M
      sage: v.display()
      ∂/∂x + 2 ∂/∂y
      sage: v.parent()
      Tangent space at Point p on the
       2-dimensional differentiable manifold M

  [Python]

      >>> from sage.all import *
      >>> v = Tp.an_element() ; v
      Tangent vector at Point p on the
       2-dimensional differentiable manifold M
      >>> v.display()
      ∂/∂x + 2 ∂/∂y
      >>> v.parent()
      Tangent space at Point p on the
       2-dimensional differentiable manifold M

  The zero vector:

  Sage

      sage: Tp.zero()
      Tangent vector zero at Point p on the
       2-dimensional differentiable manifold M
      sage: Tp.zero().display()
      zero = 0
      sage: Tp.zero().parent()
      Tangent space at Point p on the
       2-dimensional differentiable manifold M

  Python

      >>> from sage.all import *
      >>> Tp.zero()
      Tangent vector zero at Point p on the
       2-dimensional differentiable manifold M
      >>> Tp.zero().display()
      zero = 0
      >>> Tp.zero().parent()
      Tangent space at Point p on the
       2-dimensional differentiable manifold M

  Tangent spaces are unique:

  Sage

      sage: M.tangent_space(p) is Tp
      True
      sage: p1 = M.point((-1,2))
      sage: M.tangent_space(p1) is Tp
      True

  [Python]

      >>> from sage.all import *
      >>> M.tangent_space(p) is Tp
      True
      >>> p1 = M.point((-Integer(1),Integer(2)))
      >>> M.tangent_space(p1) is Tp
      True

  even if points are not:

  Sage

      sage: p1 is p
      False

  Python

      >>> from sage.all import *
      >>> p1 is p
      False

  Actually `p1` and `p` share the same tangent space because they compare equal:

  Sage

      sage: p1 == p
      True

  [Python]

      >>> from sage.all import *
      >>> p1 == p
      True

  The tangent-space uniqueness holds even if the points are created in different coordinate systems:

  Sage

      sage: xy_to_uv = c_xy.transition_map(c_uv, (x+y, x-y))
      sage: uv_to_xv = xy_to_uv.inverse()
      sage: p2 = M.point((1, -3), chart=c_uv, name='p_2')
      sage: p2 is p
      False
      sage: M.tangent_space(p2) is Tp
      True
      sage: p2 == p
      True

  Python

      >>> from sage.all import *
      >>> xy_to_uv = c_xy.transition_map(c_uv, (x+y, x-y))
      >>> uv_to_xv = xy_to_uv.inverse()
      >>> p2 = M.point((Integer(1), -Integer(3)), chart=c_uv, name='p_2')
      >>> p2 is p
      False
      >>> M.tangent_space(p2) is Tp
      True
      >>> p2 == p
      True

  An isomorphism of the tangent space with an inner product space with distinguished basis:

  Sage

      sage: g = M.metric('g')
      sage: g[:] = ((1, 0), (0, 1))
      sage: Q_Tp_xy = g[c_xy.frame(),:](*p.coordinates(c_xy)); Q_Tp_xy
      [1 0]
      [0 1]
      sage: W_Tp_xy = VectorSpace(SR, 2, inner_product_matrix=Q_Tp_xy)
      sage: Tp.bases()[0]
      Basis (∂/∂x,∂/∂y) on the Tangent space at Point p on the
       2-dimensional differentiable manifold M
      sage: phi_Tp_xy = Tp.isomorphism_with_fixed_basis(Tp.bases()[0], codomain=W_Tp_xy)
      sage: phi_Tp_xy
      Generic morphism:
       From: Tangent space at Point p on the 2-dimensional differentiable manifold M
       To:   Ambient quadratic space of dimension 2 over Symbolic Ring
             Inner product matrix:
             [1 0]
             [0 1]

      sage: Q_Tp_uv = g[c_uv.frame(),:](*p.coordinates(c_uv)); Q_Tp_uv
      [1/2   0]
      [  0 1/2]
      sage: W_Tp_uv = VectorSpace(SR, 2, inner_product_matrix=Q_Tp_uv)
      sage: Tp.bases()[1]
      Basis (∂/∂u,∂/∂v) on the Tangent space at Point p on the
       2-dimensional differentiable manifold M
      sage: phi_Tp_uv = Tp.isomorphism_with_fixed_basis(Tp.bases()[1], codomain=W_Tp_uv)
      sage: phi_Tp_uv
      Generic morphism:
       From: Tangent space at Point p on the 2-dimensional differentiable manifold M
       To:   Ambient quadratic space of dimension 2 over Symbolic Ring
             Inner product matrix:
             [1/2   0]
             [  0 1/2]

      sage: t1, t2 = Tp.tensor((1,0)), Tp.tensor((1,0))
      sage: t1[:] = (8, 15)
      sage: t2[:] = (47, 11)
      sage: t1[Tp.bases()[0],:]
      [8, 15]
      sage: phi_Tp_xy(t1), phi_Tp_xy(t2)
      ((8, 15), (47, 11))
      sage: phi_Tp_xy(t1).inner_product(phi_Tp_xy(t2))
      541

      sage: Tp_xy_to_uv = M.change_of_frame(c_xy.frame(), c_uv.frame()).at(p); Tp_xy_to_uv
      Automorphism of the Tangent space at Point p on the
       2-dimensional differentiable manifold M
      sage: Tp.set_change_of_basis(Tp.bases()[0], Tp.bases()[1], Tp_xy_to_uv)
      sage: t1[Tp.bases()[1],:]
      [23, -7]
      sage: phi_Tp_uv(t1), phi_Tp_uv(t2)
      ((23, -7), (58, 36))
      sage: phi_Tp_uv(t1).inner_product(phi_Tp_uv(t2))
      541

  [Python]

      >>> from sage.all import *
      >>> g = M.metric('g')
      >>> g[:] = ((Integer(1), Integer(0)), (Integer(0), Integer(1)))
      >>> Q_Tp_xy = g[c_xy.frame(),:](*p.coordinates(c_xy)); Q_Tp_xy
      [1 0]
      [0 1]
      >>> W_Tp_xy = VectorSpace(SR, Integer(2), inner_product_matrix=Q_Tp_xy)
      >>> Tp.bases()[Integer(0)]
      Basis (∂/∂x,∂/∂y) on the Tangent space at Point p on the
       2-dimensional differentiable manifold M
      >>> phi_Tp_xy = Tp.isomorphism_with_fixed_basis(Tp.bases()[Integer(0)], codomain=W_Tp_xy)
      >>> phi_Tp_xy
      Generic morphism:
       From: Tangent space at Point p on the 2-dimensional differentiable manifold M
       To:   Ambient quadratic space of dimension 2 over Symbolic Ring
             Inner product matrix:
             [1 0]
             [0 1]

      >>> Q_Tp_uv = g[c_uv.frame(),:](*p.coordinates(c_uv)); Q_Tp_uv
      [1/2   0]
      [  0 1/2]
      >>> W_Tp_uv = VectorSpace(SR, Integer(2), inner_product_matrix=Q_Tp_uv)
      >>> Tp.bases()[Integer(1)]
      Basis (∂/∂u,∂/∂v) on the Tangent space at Point p on the
       2-dimensional differentiable manifold M
      >>> phi_Tp_uv = Tp.isomorphism_with_fixed_basis(Tp.bases()[Integer(1)], codomain=W_Tp_uv)
      >>> phi_Tp_uv
      Generic morphism:
       From: Tangent space at Point p on the 2-dimensional differentiable manifold M
       To:   Ambient quadratic space of dimension 2 over Symbolic Ring
             Inner product matrix:
             [1/2   0]
             [  0 1/2]

      >>> t1, t2 = Tp.tensor((Integer(1),Integer(0))), Tp.tensor((Integer(1),Integer(0)))
      >>> t1[:] = (Integer(8), Integer(15))
      >>> t2[:] = (Integer(47), Integer(11))
      >>> t1[Tp.bases()[Integer(0)],:]
      [8, 15]
      >>> phi_Tp_xy(t1), phi_Tp_xy(t2)
      ((8, 15), (47, 11))
      >>> phi_Tp_xy(t1).inner_product(phi_Tp_xy(t2))
      541

      >>> Tp_xy_to_uv = M.change_of_frame(c_xy.frame(), c_uv.frame()).at(p); Tp_xy_to_uv
      Automorphism of the Tangent space at Point p on the
       2-dimensional differentiable manifold M
      >>> Tp.set_change_of_basis(Tp.bases()[Integer(0)], Tp.bases()[Integer(1)], Tp_xy_to_uv)
      >>> t1[Tp.bases()[Integer(1)],:]
      [23, -7]
      >>> phi_Tp_uv(t1), phi_Tp_uv(t2)
      ((23, -7), (58, 36))
      >>> phi_Tp_uv(t1).inner_product(phi_Tp_uv(t2))
      541

  See also

  `FiniteRankFreeModule` for more documentation.

  Element

    alias of `TangentVector`

  base_point()

    Return the manifold point at which `self` is defined.

    EXAMPLES:

    Sage

        sage: M = Manifold(2, 'M')
        sage: X.<x,y> = M.chart()
        sage: p = M.point((1,-2), name='p')
        sage: Tp = M.tangent_space(p)
        sage: Tp.base_point()
        Point p on the 2-dimensional differentiable manifold M
        sage: Tp.base_point() is p
        True

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(2), 'M')
        >>> X = M.chart(names=('x', 'y',)); (x, y,) = X._first_ngens(2)
        >>> p = M.point((Integer(1),-Integer(2)), name='p')
        >>> Tp = M.tangent_space(p)
        >>> Tp.base_point()
        Point p on the 2-dimensional differentiable manifold M
        >>> Tp.base_point() is p
        True

  construction()
  dim()

    alias of `dimension()`.

  dimension()

    Return the vector space dimension of `self`.

    EXAMPLES:

    Sage

        sage: M = Manifold(2, 'M')
        sage: X.<x,y> = M.chart()
        sage: p = M.point((1,-2), name='p')
        sage: Tp = M.tangent_space(p)
        sage: Tp.dimension()
        2

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(2), 'M')
        >>> X = M.chart(names=('x', 'y',)); (x, y,) = X._first_ngens(2)
        >>> p = M.point((Integer(1),-Integer(2)), name='p')
        >>> Tp = M.tangent_space(p)
        >>> Tp.dimension()
        2

    A shortcut is `dim()`:

    Sage

        sage: Tp.dim()
        2

    [Python]

        >>> from sage.all import *
        >>> Tp.dim()
        2

    One can also use the global function `dim`:

    Sage

        sage: dim(Tp)
        2

    Python

        >>> from sage.all import *
        >>> dim(Tp)
        2