First we set up the notebook to display math with LaTeX:
%display latex
We introduce a 2-dimensional manifold $S$, aimed to represent the sphere $\mathbb{S}^2$ (or more precisely the part of $\mathbb{S}^2$ covered by spherical coordinates):
S = Manifold(2, 'S')
print(S)
2-dimensional differentiable manifold S
This manifold is created "bare", with no chart in its (user) atlas. This means that the manifold is not fully defined yet:
S.atlas()
We create the chart of spherical coordinates $(\theta, \phi)$ via the method chart()
, by providing the coordinate ranges and their LaTeX symbols:
X.<th,ph> = S.chart(r"th:(0,pi):\theta ph:(0,2*pi):\phi")
X
Thanks to the operator <,>
the Python variables th
and ph
are set to the coordinates $\theta$ and $\phi$ respectively, so that they are immediately available to the user:
sin(th)*cos(ph)
One can access each coordinate by its index in the chart X
:
X[0] is th
The user atlas is no longer empty:
S.atlas()
Charts can be plotted: they are rendered as coordinate grids:
graph = X.plot()
graph
Let us introduce a point $p\in S$, via the parent/element syntax of SageMath:
p = S((pi/2, pi/3), name='p')
print(p)
Point p on the 2-dimensional differentiable manifold S
p.parent()
The coordinates of $p$ with respect to chart $X$ are recovered by letting the chart act on $p$:
X(p)
Points can be plotted: let us add $p$ to the plot graph
previously created
graph += p.plot()
graph
Euclidean spaces are predefined Riemannian manifolds in SageMath. To get the 3-dimensional Euclidean space $\mathbb{E}^3$, along with its canonical Cartesian coordinates $(x,y,z)$, we simply type:
E.<x,y,z> = EuclideanSpace()
E
The Python variables x
, y
and z
are then injected in the global namespace to represent the coordinates $x$, $y$ and $z$ respectively.
The chart of coordinates $(x,y,z)$ is returned by the method cartesian_coordinates()
:
E.cartesian_coordinates()
The embedding $S\to \mathbb{E}^3$ is defined by its coordinate expression:
F = S.diff_map(E, [sin(th)*cos(ph), sin(th)*sin(ph), cos(th)])
F.display()
The image of the point $p$ by the embedding:
F(p)
E.cartesian_coordinates()(F(p))
We may use $F$ to have a 3D view of the chart of spherical coordinates on $S$:
graph3 = X.plot(E.cartesian_coordinates(), mapping=F,
number_values=9)
graph3
Adding the point $p$ to the plot:
graph3 += p.plot(E.cartesian_coordinates(), mapping=F)
graph3
The vector frame associated with the spherical coordinates is:
X.frame()
Let us define a vector field on $S$ from its components in this vector frame (which is, at this stage, the default one on $S$):
v = S.vector_field(name='v')
v[:] = sin(th)/2, 1
v.display()
v.display_comp()
v.plot()
Thanks to the embedding $F: S\to \mathbb{E}^3$, we may add the plot of $v$ atop the 3D view of $S$:
graph3 += v.plot(E.cartesian_coordinates(), mapping=F,
number_values=7)
graph3
Value of the vector field $v$ at the point $p$:
vp = v.at(p)
print(vp)
Tangent vector v at Point p on the 2-dimensional differentiable manifold S
vp.parent()
vp.display()
graph3 += vp.plot(E.cartesian_coordinates(), mapping=F,
color='gold')
graph3
The Euclidean space arrives with its default metric:
g = E.metric()
print(g)
Riemannian metric g on the Euclidean space E^3
g.display()
It is a flat metric, i.e. its Riemann curvature tensor vanished identically:
g.riemann().display()
Let us define the metric on $S$ as being the metric induced by the Euclidean metric $g$, i.e. the pullback of $g$ by the embedding $F$:
h = S.metric(name='h')
h.set(F.pullback(g))
The result of the pullback computation:
h.display()
The scalar square of the vector field $v$ with respect to the metric $h$:
print(h(v,v))
Scalar field h(v,v) on the 2-dimensional differentiable manifold S
h(v,v).display()
h(v,v).expr()
The nonzero (and noredundant) Christoffel symbols of $h$ with respect to spherical coordinates:
h.christoffel_symbols_display()
Contrary to $g$, $h$ is not a flat metric:
h.riemann().display()
h.riemann().display_comp()
The Ricci tensor of $h$:
h.ricci().display()
$(S, h)$ is a manifold of constant positive curvature:
h.ricci_scalar().display()
See
If interested in extending the differential geometry part of SageMath, you are welcome to join the SageManifolds project developed by these people.