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
Tp
are 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
p1
andp
share 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
FiniteRankFreeModule
for more documentation.- Element[source]¶
alias of
TangentVector
- base_point()[source]¶
Return the manifold point at which
self
is 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