This worksheet is based on SageMath 7.5.beta4 and the three.js viewer developed at trac #12402.
NB: a version of SageMath at least equal to 7.5.beta4 is required:
version()
'SageMath version 7.5.beta4, Release Date: 2016-11-24'
First we set up the notebook to display mathematical objects using LaTeX formatting:
%display latex
We also define a viewer for 3D plots (use 'threejs'
or 'jmol'
for interactive 3D graphics):
viewer3D = 'threejs' # must be 'jmol', 'tachyon', 'threejs' or None (default)
We declare $\mathbb{S}^2$ as a differentiable manifold of dimension 2 over $\mathbb{R}$ and we endow it with the stereographic charts from the North pole (stereoN
) and the South pole (stereoS
):
S2 = Manifold(2, 'S^2', latex_name=r'\mathbb{S}^2', start_index=1)
U = S2.open_subset('U')
V = S2.open_subset('V')
S2.declare_union(U, V)
stereoN.<x,y> = U.chart()
stereoS.<xp,yp> = V.chart(r"xp:x' yp:y'")
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= xp^2+xp^2!=0)
stereoS_to_N = stereoN_to_S.inverse()
W = U.intersection(V)
eU = stereoN.frame()
eV = stereoS.frame()
S2.frames()
The standard spherical (or polar) coordinates $(\theta,\phi)$ are defined on the open domain $A\subset W \subset \mathbb{S}^2$ that is the complement of the "origin meridian"; since the latter is the half-circle defined by $y=0$ and $x\geq 0$, we declare:
A = W.open_subset('A', coord_def={stereoN.restrict(W): (y!=0, x<0),
stereoS.restrict(W): (yp!=0, xp<0)})
spher.<th,ph> = A.chart(r'th:(0,pi):\theta ph:(0,2*pi):\phi')
spher_to_stereoN = spher.transition_map(stereoN.restrict(A),
(sin(th)*cos(ph)/(1-cos(th)),
sin(th)*sin(ph)/(1-cos(th))) )
spher_to_stereoN.set_inverse(2*atan(1/sqrt(x^2+y^2)), atan2(-y,-x)+pi)
spher_to_stereoN.display()
Let us first declare $\mathbb{R}^3$ as a 3-dimensional manifold covered by a single chart (Cartesian coordinates):
R3 = Manifold(3, 'R^3', r'\mathbb{R}^3', start_index=1)
cart.<X,Y,Z> = R3.chart() ; cart
The embedding of the sphere is defined as a differential mapping $\Phi: \mathbb{S}^2 \rightarrow \mathbb{R}^3$:
Phi = S2.diff_map(R3, {(stereoN, cart): [2*x/(1+x^2+y^2), 2*y/(1+x^2+y^2),
(x^2+y^2-1)/(1+x^2+y^2)],
(stereoS, cart): [2*xp/(1+xp^2+yp^2), 2*yp/(1+xp^2+yp^2),
(1-xp^2-yp^2)/(1+xp^2+yp^2)]},
name='Phi', latex_name=r'\Phi')
Phi.expr(stereoN.restrict(A), cart)
Phi.display()
Let us use $\Phi$ to draw the grid of spherical coordinates $(\theta,\phi)$ in terms of the Cartesian coordinates $(X,Y,Z)$ of $\mathbb{R}^3$:
graph_spher = spher.plot(chart=cart, mapping=Phi, number_values=11, color='blue',
label_axes=False)
show(graph_spher, viewer=viewer3D)
We may also use the embedding $\Phi$ to display the stereographic coordinate grid in terms of the Cartesian coordinates in $\mathbb{R}^3$. First for the stereographic coordinates from the North pole:
graph_stereoN = stereoN.plot(chart=cart, mapping=Phi, number_values=25,
label_axes=False)
show(graph_stereoN, viewer=viewer3D)
and then have a view with the stereographic coordinates from the South pole superposed (in green):
graph_stereoS = stereoS.plot(chart=cart, mapping=Phi, number_values=25,
color='green', label_axes=False)
show(graph_stereoN + graph_stereoS, viewer=viewer3D)
Let us add the North and South poles to the graphic:
N = V.point((0,0), chart=stereoS, name='N')
S = U.point((0,0), chart=stereoN, name='S')
graph_N = N.plot(chart=cart, mapping=Phi, color='red', label_offset=0.05)
graph_S = S.plot(chart=cart, mapping=Phi, color='green', label_offset=0.05)
show(graph_stereoN + graph_stereoS + graph_N + graph_S, viewer=viewer3D)
We define the vector field $v$ in terms of its components in the frame eU
= $(\partial_x, \partial_y)$ associated with stereographic coordinates from the North pole:
v = S2.vector_field(name='v')
v[eU,:] = [1, -2]
v.display(eU)
v.add_comp_by_continuation(eV, W, chart=stereoS)
v.display(eV)
A 3D view of the vector field $v$ is obtained via the embedding $\Phi$:
graph_v = v.plot(chart=cart, mapping=Phi, chart_domain=spher, number_values=11,
scale=0.2, label_axes=False)
show(graph_v, viewer=viewer3D)
Let us superpose the plot of the spherical coordinate grid:
graph = graph_v + graph_spher
show(graph, viewer=viewer3D, aspect_ratio=1)
Similarly, let us draw the first vector field of the stereographic frame from the North pole, namely $\frac{\partial}{\partial x}$
ex = stereoN.frame()[1]
ex
graph_ex = ex.plot(chart=cart, mapping=Phi, chart_domain=spher,
number_values=11, scale=0.4, label_axes=False)
show(graph_ex + graph_spher, viewer=viewer3D)
For the second vector field of the stereographic frame from the North pole, namely $\frac{\partial}{\partial y}$, we get:
ey = stereoN.frame()[2]
ey
graph_ey = ey.plot(chart=cart, mapping=Phi, chart_domain=spher,
number_values=11, scale=0.4, color='red', label_axes=False)
show(graph_ey + graph_spher, viewer=viewer3D)
We may superpose the two graphs, to get a 3D view of the frame associated with the stereographic coordinates from the North pole:
show(graph_spher + graph_ex + graph_ey + sphere(color='lightgrey', opacity=0.4),
viewer=viewer3D)
In order to define curves in $\mathbb{S}^2$, we first introduce the field of real numbers $\mathbb{R}$ as a 1-dimensional smooth manifold with a canonical coordinate chart:
R.<t> = RealLine() ; print(R)
Real number line R
Let us define a loxodrome of the sphere in terms of its parametric equation with respect to the chart spher
= $(A,(\theta,\phi))$
c = S2.curve({spher: [2*atan(exp(-t/10)), t]}, (t, -oo, +oo), name='c')
Curves in $\mathbb{S}^2$ are considered as morphisms from the manifold $\mathbb{R}$ to the manifold $\mathbb{S}^2$:
c.parent()
c.display()
Thanks to the embedding $\Phi$, we may plot $c$ in terms of the Cartesian coordinates of $\mathbb{R}^3$:
graph_c = c.plot(mapping=Phi, max_range=40, plot_points=200, thickness=2,
label_axes=False)
show(graph_c + graph_spher, viewer=viewer3D)
The tangent vector field (or velocity vector) to the curve $c$ is
vc = c.tangent_vector_field()
vc.display()
Let us plot $c'$ atop $c$:
graph_vc = vc.plot(chart=cart, mapping=Phi, ranges={t: (-20, 20)}, number_values=30,
scale=0.5, color='red', label_axes=False)
show(graph_spher + graph_c + graph_vc , viewer=viewer3D)