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:
FiniteRankFreeModuleTangent 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
p1andpshare 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