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)[source]¶
- 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: 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 - >>> 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: 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 - >>> 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: 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))] - >>> 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: 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] - >>> 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 - Tpare on the same footing. Accordingly the tangent space is not in the category of modules with a distinguished basis:- sage: Tp in ModulesWithBasis(SR) False - >>> from sage.all import * >>> Tp in ModulesWithBasis(SR) False - It is simply in the category of modules: - sage: Tp in Modules(SR) True - >>> 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: Tp in VectorSpaces(SR) True - >>> from sage.all import * >>> Tp in VectorSpaces(SR) True - A typical element: - 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 - >>> 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: 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 - >>> 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: M.tangent_space(p) is Tp True sage: p1 = M.point((-1,2)) sage: M.tangent_space(p1) is Tp True - >>> 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: p1 is p False - >>> from sage.all import * >>> p1 is p False - Actually - p1and- pshare the same tangent space because they compare equal:- sage: p1 == p True - >>> from sage.all import * >>> p1 == p True - The tangent-space uniqueness holds even if the points are created in different coordinate systems: - 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 - >>> 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: 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 - >>> 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 - FiniteRankFreeModulefor more documentation.- Element[source]¶
- alias of - TangentVector
 - base_point()[source]¶
- Return the manifold point at which - selfis defined.- EXAMPLES: - 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 - >>> 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 
 - dim()[source]¶
- Return the vector space dimension of - self.- EXAMPLES: - 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 - >>> 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: Tp.dim() 2 - >>> from sage.all import * >>> Tp.dim() 2 - One can also use the global function - dim:- sage: dim(Tp) 2 - >>> from sage.all import * >>> dim(Tp) 2 
 - dimension()[source]¶
- Return the vector space dimension of - self.- EXAMPLES: - 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 - >>> 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: Tp.dim() 2 - >>> from sage.all import * >>> Tp.dim() 2 - One can also use the global function - dim:- sage: dim(Tp) 2 - >>> from sage.all import * >>> dim(Tp) 2