Differentiable Manifolds¶
Given a non-discrete topological field \(K\) (in most applications, \(K = \RR\) or \(K = \CC\); see however [Ser1992] for \(K = \QQ_p\) and [Ber2008] for other fields), a differentiable manifold over \(K\) is a topological manifold \(M\) over \(K\) equipped with an atlas whose transitions maps are of class \(C^k\) (i.e. \(k\)-times continuously differentiable) for a fixed positive integer \(k\) (possibly \(k=\infty\)). \(M\) is then called a \(C^k\)-manifold over \(K\).
Note that
- if the mention of \(K\) is omitted, then \(K=\RR\) is assumed;
- if \(K=\CC\), any \(C^k\)-manifold with \(k\geq 1\) is actually a \(C^\infty\)-manifold (even an analytic manifold);
- if \(K=\RR\), any \(C^k\)-manifold with \(k\geq 1\) admits a compatible \(C^\infty\)-structure (Whitney’s smoothing theorem).
Differentiable manifolds are implemented via the class
DifferentiableManifold
.
Open subsets of differentiable manifolds are also implemented via
DifferentiableManifold
, since they are differentiable manifolds by
themselves.
The user interface is provided by the generic function
Manifold()
, with
the argument structure
set to 'differentiable'
and the argument
diff_degree
set to \(k\), or the argument structure
set to 'smooth'
(the default value).
Example 1: the 2-sphere as a differentiable manifold of dimension 2 over \(\RR\)
One starts by declaring \(S^2\) as a 2-dimensional differentiable manifold:
sage: M = Manifold(2, 'S^2')
sage: M
2-dimensional differentiable manifold S^2
Since the base topological field has not been specified in the argument list
of Manifold
, \(\RR\) is assumed:
sage: M.base_field()
Real Field with 53 bits of precision
sage: dim(M)
2
By default, the created object is a smooth manifold:
sage: M.diff_degree()
+Infinity
Let us consider the complement of a point, the “North pole” say; this is an open subset of \(S^2\), which we call \(U\):
sage: U = M.open_subset('U'); U
Open subset U of the 2-dimensional differentiable manifold S^2
A standard chart on \(U\) is provided by the stereographic projection from the North pole to the equatorial plane:
sage: stereoN.<x,y> = U.chart(); stereoN
Chart (U, (x, y))
Thanks to the operator <x,y>
on the left-hand side, the coordinates
declared in a chart (here \(x\) and \(y\)), are accessible by their names; they are
Sage’s symbolic variables:
sage: y
y
sage: type(y)
<type 'sage.symbolic.expression.Expression'>
The South pole is the point of coordinates \((x,y)=(0,0)\) in the above chart:
sage: S = U.point((0,0), chart=stereoN, name='S'); S
Point S on the 2-dimensional differentiable manifold S^2
Let us call \(V\) the open subset that is the complement of the South pole and let us introduce on it the chart induced by the stereographic projection from the South pole to the equatorial plane:
sage: V = M.open_subset('V'); V
Open subset V of the 2-dimensional differentiable manifold S^2
sage: stereoS.<u,v> = V.chart(); stereoS
Chart (V, (u, v))
The North pole is the point of coordinates \((u,v)=(0,0)\) in this chart:
sage: N = V.point((0,0), chart=stereoS, name='N'); N
Point N on the 2-dimensional differentiable manifold S^2
To fully construct the manifold, we declare that it is the union of \(U\) and \(V\):
sage: M.declare_union(U,V)
and we provide the transition map between the charts stereoN
= \((U, (x, y))\)
and stereoS
= \((V, (u, v))\), denoting by \(W\) the intersection of \(U\) and
\(V\) (\(W\) is the subset of \(U\) defined by \(x^2+y^2\not=0\), as well as the subset
of \(V\) defined by \(u^2+v^2\not=0\)):
sage: stereoN_to_S = stereoN.transition_map(stereoS,
....: [x/(x^2+y^2), y/(x^2+y^2)], intersection_name='W',
....: restrictions1= x^2+y^2!=0, restrictions2= u^2+v^2!=0)
sage: stereoN_to_S
Change of coordinates from Chart (W, (x, y)) to Chart (W, (u, v))
sage: stereoN_to_S.display()
u = x/(x^2 + y^2)
v = y/(x^2 + y^2)
We give the name W
to the Python variable representing \(W=U\cap V\):
sage: W = U.intersection(V)
The inverse of the transition map is computed by the method inverse()
:
sage: stereoN_to_S.inverse()
Change of coordinates from Chart (W, (u, v)) to Chart (W, (x, y))
sage: stereoN_to_S.inverse().display()
x = u/(u^2 + v^2)
y = v/(u^2 + v^2)
At this stage, we have four open subsets on \(S^2\):
sage: M.list_of_subsets()
[2-dimensional differentiable manifold S^2,
Open subset U of the 2-dimensional differentiable manifold S^2,
Open subset V of the 2-dimensional differentiable manifold S^2,
Open subset W of the 2-dimensional differentiable manifold S^2]
\(W\) is the open subset that is the complement of the two poles:
sage: N in W or S in W
False
The North pole lies in \(V\) and the South pole in \(U\):
sage: N in V, N in U
(True, False)
sage: S in U, S in V
(True, False)
The manifold’s (user) atlas contains four charts, two of them being restrictions of charts to a smaller domain:
sage: M.atlas()
[Chart (U, (x, y)), Chart (V, (u, v)), Chart (W, (x, y)), Chart (W, (u, v))]
Let us consider the point of coordinates (1,2) in the chart stereoN
:
sage: p = M.point((1,2), chart=stereoN, name='p'); p
Point p on the 2-dimensional differentiable manifold S^2
sage: p.parent()
2-dimensional differentiable manifold S^2
sage: p in W
True
The coordinates of \(p\) in the chart stereoS
are computed by letting
the chart act on the point:
sage: stereoS(p)
(1/5, 2/5)
Given the definition of \(p\), we have of course:
sage: stereoN(p)
(1, 2)
Similarly:
sage: stereoS(N)
(0, 0)
sage: stereoN(S)
(0, 0)
A differentiable scalar field on the sphere:
sage: f = M.scalar_field({stereoN: atan(x^2+y^2), stereoS: pi/2-atan(u^2+v^2)},
....: name='f')
sage: f
Scalar field f on the 2-dimensional differentiable manifold S^2
sage: f.display()
f: S^2 --> R
on U: (x, y) |--> arctan(x^2 + y^2)
on V: (u, v) |--> 1/2*pi - arctan(u^2 + v^2)
sage: f(p)
arctan(5)
sage: f(N)
1/2*pi
sage: f(S)
0
sage: f.parent()
Algebra of differentiable scalar fields on the 2-dimensional differentiable
manifold S^2
sage: f.parent().category()
Category of commutative algebras over Symbolic Ring
A differentiable manifold has a default vector frame, which, unless otherwise specified, is the coordinate frame associated with the first defined chart:
sage: M.default_frame()
Coordinate frame (U, (d/dx,d/dy))
sage: latex(M.default_frame())
\left(U, \left(\frac{\partial}{\partial x },\frac{\partial}{\partial y }\right)\right)
sage: M.default_frame() is stereoN.frame()
True
A vector field on the sphere:
sage: w = M.vector_field('w')
sage: w[stereoN.frame(), :] = [x, y]
sage: w.add_comp_by_continuation(stereoS.frame(), W, stereoS)
sage: w.display() # display in the default frame (stereoN.frame())
w = x d/dx + y d/dy
sage: w.display(stereoS.frame())
w = -u d/du - v d/dv
sage: w.parent()
Module X(S^2) of vector fields on the 2-dimensional differentiable
manifold S^2
sage: w.parent().category()
Category of modules over Algebra of differentiable scalar fields on the
2-dimensional differentiable manifold S^2
Vector fields act on scalar fields:
sage: w(f)
Scalar field w(f) on the 2-dimensional differentiable manifold S^2
sage: w(f).display()
w(f): S^2 --> R
on U: (x, y) |--> 2*(x^2 + y^2)/(x^4 + 2*x^2*y^2 + y^4 + 1)
on V: (u, v) |--> 2*(u^2 + v^2)/(u^4 + 2*u^2*v^2 + v^4 + 1)
sage: w(f) == f.differential()(w)
True
The value of the vector field at point \(p\) is a vector tangent to the sphere:
sage: w.at(p)
Tangent vector w at Point p on the 2-dimensional differentiable manifold S^2
sage: w.at(p).display()
w = d/dx + 2 d/dy
sage: w.at(p).parent()
Tangent space at Point p on the 2-dimensional differentiable manifold S^2
A 1-form on the sphere:
sage: df = f.differential() ; df
1-form df on the 2-dimensional differentiable manifold S^2
sage: df.display()
df = 2*x/(x^4 + 2*x^2*y^2 + y^4 + 1) dx + 2*y/(x^4 + 2*x^2*y^2 + y^4 + 1) dy
sage: df.display(stereoS.frame())
df = -2*u/(u^4 + 2*u^2*v^2 + v^4 + 1) du - 2*v/(u^4 + 2*u^2*v^2 + v^4 + 1) dv
sage: df.parent()
Module Omega^1(S^2) of 1-forms on the 2-dimensional differentiable
manifold S^2
sage: df.parent().category()
Category of modules over Algebra of differentiable scalar fields on the
2-dimensional differentiable manifold S^2
The value of the 1-form at point \(p\) is a linear form on the tangent space at \(p\):
sage: df.at(p)
Linear form df on the Tangent space at Point p on the 2-dimensional
differentiable manifold S^2
sage: df.at(p).display()
df = 1/13 dx + 2/13 dy
sage: df.at(p).parent()
Dual of the Tangent space at Point p on the 2-dimensional differentiable
manifold S^2
Example 2: the Riemann sphere as a differentiable manifold of dimension 1 over \(\CC\)
We declare the Riemann sphere \(\CC^*\) as a 1-dimensional differentiable manifold over \(\CC\):
sage: M = Manifold(1, 'C*', field='complex'); M
1-dimensional complex manifold C*
We introduce a first open subset, which is actually \(\CC = \CC^*\setminus\{\infty\}\) if we interpret \(\CC^*\) as the Alexandroff one-point compactification of \(\CC\):
sage: U = M.open_subset('U')
A natural chart on \(U\) is then nothing but the identity map of \(\CC\), hence we denote the associated coordinate by \(z\):
sage: Z.<z> = U.chart()
The origin of the complex plane is the point of coordinate \(z=0\):
sage: O = U.point((0,), chart=Z, name='O'); O
Point O on the 1-dimensional complex manifold C*
Another open subset of \(\CC^*\) is \(V = \CC^*\setminus\{O\}\):
sage: V = M.open_subset('V')
We define a chart on \(V\) such that the point at infinity is the point of coordinate 0 in this chart:
sage: W.<w> = V.chart(); W
Chart (V, (w,))
sage: inf = M.point((0,), chart=W, name='inf', latex_name=r'\infty')
sage: inf
Point inf on the 1-dimensional complex manifold C*
To fully construct the Riemann sphere, we declare that it is the union of \(U\) and \(V\):
sage: M.declare_union(U,V)
and we provide the transition map between the two charts as \(w=1/z\) on on \(A = U\cap V\):
sage: Z_to_W = Z.transition_map(W, 1/z, intersection_name='A',
....: restrictions1= z!=0, restrictions2= w!=0)
sage: Z_to_W
Change of coordinates from Chart (A, (z,)) to Chart (A, (w,))
sage: Z_to_W.display()
w = 1/z
sage: Z_to_W.inverse()
Change of coordinates from Chart (A, (w,)) to Chart (A, (z,))
sage: Z_to_W.inverse().display()
z = 1/w
Let consider the complex number \(i\) as a point of the Riemann sphere:
sage: i = M((I,), chart=Z, name='i'); i
Point i on the 1-dimensional complex manifold C*
Its coordinates with respect to the charts Z
and W
are:
sage: Z(i)
(I,)
sage: W(i)
(-I,)
and we have:
sage: i in U
True
sage: i in V
True
The following subsets and charts have been defined:
sage: M.list_of_subsets()
[Open subset A of the 1-dimensional complex manifold C*,
1-dimensional complex manifold C*,
Open subset U of the 1-dimensional complex manifold C*,
Open subset V of the 1-dimensional complex manifold C*]
sage: M.atlas()
[Chart (U, (z,)), Chart (V, (w,)), Chart (A, (z,)), Chart (A, (w,))]
A constant map \(\CC^* \rightarrow \CC\):
sage: f = M.constant_scalar_field(3+2*I, name='f'); f
Scalar field f on the 1-dimensional complex manifold C*
sage: f.display()
f: C* --> C
on U: z |--> 2*I + 3
on V: w |--> 2*I + 3
sage: f(O)
2*I + 3
sage: f(i)
2*I + 3
sage: f(inf)
2*I + 3
sage: f.parent()
Algebra of differentiable scalar fields on the 1-dimensional complex
manifold C*
sage: f.parent().category()
Category of commutative algebras over Symbolic Ring
A vector field on the Riemann sphere:
sage: v = M.vector_field(name='v')
sage: v[Z.frame(), 0] = z^2
sage: v.add_comp_by_continuation(W.frame(), U.intersection(V), W)
sage: v.display(Z.frame())
v = z^2 d/dz
sage: v.display(W.frame())
v = -d/dw
sage: v.parent()
Module X(C*) of vector fields on the 1-dimensional complex manifold C*
The vector field \(v\) acting on the scalar field \(f\):
sage: v(f)
Scalar field v(f) on the 1-dimensional complex manifold C*
Since \(f\) is constant, \(v(f)\) is vanishing:
sage: v(f).display()
v(f): C* --> C
on U: z |--> 0
on V: w |--> 0
The value of the vector field \(v\) at the point \(\infty\) is a vector tangent to the Riemann sphere:
sage: v.at(inf)
Tangent vector v at Point inf on the 1-dimensional complex manifold C*
sage: v.at(inf).display()
v = -d/dw
sage: v.at(inf).parent()
Tangent space at Point inf on the 1-dimensional complex manifold C*
AUTHORS:
- Eric Gourgoulhon (2015): initial version
- Travis Scrimshaw (2016): review tweaks
REFERENCES:
-
sage.manifolds.differentiable.manifold.
DifferentiableManifold
¶ Differentiable manifold over a topological field \(K\).
Given a non-discrete topological field \(K\) (in most applications, \(K = \RR\) or \(K = \CC\); see however [Ser1992] for \(K = \QQ_p\) and [Ber2008] for other fields), a differentiable manifold over \(K\) is a topological manifold \(M\) over \(K\) equipped with an atlas whose transitions maps are of class \(C^k\) (i.e. \(k\)-times continuously differentiable) for a fixed positive integer \(k\) (possibly \(k=\infty\)). \(M\) is then called a \(C^k\)-manifold over \(K\).
Note that
- if the mention of \(K\) is omitted, then \(K=\RR\) is assumed;
- if \(K=\CC\), any \(C^k\)-manifold with \(k\geq 1\) is actually a \(C^\infty\)-manifold (even an analytic manifold);
- if \(K=\RR\), any \(C^k\)-manifold with \(k\geq 1\) admits a compatible \(C^\infty\)-structure (Whitney’s smoothing theorem).
INPUT:
n
– positive integer; dimension of the manifoldname
– string; name (symbol) given to the manifoldfield
– field \(K\) on which the manifold is defined; allowed values are'real'
or an object of typeRealField
(e.g.,RR
) for a manifold over \(\RR\)'complex'
or an object of typeComplexField
(e.g.,CC
) for a manifold over \(\CC\)- an object in the category of topological fields (see
Fields
andTopologicalSpaces
) for other types of manifolds
structure
– manifold structure (seeDifferentialStructure
orRealDifferentialStructure
)ambient
– (default:None
) if notNone
, must be a differentiable manifold; the created object is then an open subset ofambient
diff_degree
– (default:infinity
) degree \(k\) of differentiabilitylatex_name
– (default:None
) string; LaTeX symbol to denote the manifold; if none is provided, it is set toname
start_index
– (default: 0) integer; lower value of the range of indices used for “indexed objects” on the manifold, e.g. coordinates in a chartcategory
– (default:None
) to specify the category; ifNone
,Manifolds(field).Differentiable()
(orManifolds(field).Smooth()
ifdiff_degree
=infinity
) is assumed (see the categoryManifolds
)unique_tag
– (default:None
) tag used to force the construction of a new object when all the other arguments have been used previously (withoutunique_tag
, theUniqueRepresentation
behavior inherited fromManifoldSubset
, viaTopologicalManifold
, would return the previously constructed object corresponding to these arguments).
EXAMPLES:
A 4-dimensional differentiable manifold (over \(\RR\)):
sage: M = Manifold(4, 'M', latex_name=r'\mathcal{M}'); M 4-dimensional differentiable manifold M sage: type(M) <class 'sage.manifolds.differentiable.manifold.DifferentiableManifold_with_category'> sage: latex(M) \mathcal{M} sage: dim(M) 4
Since the base field has not been specified, \(\RR\) has been assumed:
sage: M.base_field() Real Field with 53 bits of precision
Since the degree of differentiability has not been specified, the default value, \(C^\infty\), has been assumed:
sage: M.diff_degree() +Infinity
The input parameter
start_index
defines the range of indices on the manifold:sage: M = Manifold(4, 'M') sage: list(M.irange()) [0, 1, 2, 3] sage: M = Manifold(4, 'M', start_index=1) sage: list(M.irange()) [1, 2, 3, 4] sage: list(Manifold(4, 'M', start_index=-2).irange()) [-2, -1, 0, 1]
A complex manifold:
sage: N = Manifold(3, 'N', field='complex'); N 3-dimensional complex manifold N
A differentiable manifold over \(\QQ_5\), the field of 5-adic numbers:
sage: N = Manifold(2, 'N', field=Qp(5)); N 2-dimensional differentiable manifold N over the 5-adic Field with capped relative precision 20
A differentiable manifold is of course a topological manifold:
sage: isinstance(M, sage.manifolds.manifold.TopologicalManifold) True sage: isinstance(N, sage.manifolds.manifold.TopologicalManifold) True
A differentiable manifold is a Sage parent object, in the category of differentiable (here smooth) manifolds over a given topological field (see
Manifolds
):sage: isinstance(M, Parent) True sage: M.category() Category of smooth manifolds over Real Field with 53 bits of precision sage: from sage.categories.manifolds import Manifolds sage: M.category() is Manifolds(RR).Smooth() True sage: M.category() is Manifolds(M.base_field()).Smooth() True sage: M in Manifolds(RR).Smooth() True sage: N in Manifolds(Qp(5)).Smooth() True
The corresponding Sage elements are points:
sage: X.<t, x, y, z> = M.chart() sage: p = M.an_element(); p Point on the 4-dimensional differentiable manifold M sage: p.parent() 4-dimensional differentiable manifold M sage: M.is_parent_of(p) True sage: p in M True
The manifold’s points are instances of class
ManifoldPoint
:sage: isinstance(p, sage.manifolds.point.ManifoldPoint) True
Since an open subset of a differentiable manifold \(M\) is itself a differentiable manifold, open subsets of \(M\) have all attributes of manifolds:
sage: U = M.open_subset('U', coord_def={X: t>0}); U Open subset U of the 4-dimensional differentiable manifold M sage: U.category() Join of Category of subobjects of sets and Category of smooth manifolds over Real Field with 53 bits of precision sage: U.base_field() == M.base_field() True sage: dim(U) == dim(M) True
The manifold passes all the tests of the test suite relative to its category:
sage: TestSuite(M).run()