5. Spheres and spherical coordinates in higher dimensions

This notebook is part of the Introduction to manifolds in SageMath by Andrzej Chrzeszczyk (Jan Kochanowski University of Kielce, Poland).

In [1]:
version()
Out[1]:
'SageMath version 9.6, Release Date: 2022-05-15'


In the EuclideanSpace class, the transitions from spherical to Cartesian and Cartesian to spherical coordinates are predefined in the case $n\leq 3$ (SageMath 9.5).


Example 5.1

Let us demonstrate spherical coordinates for $n=3$.

In [2]:
E.<x1,x2,x3>=EuclideanSpace(3,"E")           # Euclidean space E^3
cart=E.cartesian_coordinates()               # Cartesian coordinates
spher.<r,th,ph> = E.spherical_coordinates()  # spherical coordinates
E.coord_change(spher, cart).display()     # transition spher -> cart 
Out[2]:
x1 = r*cos(ph)*sin(th)
x2 = r*sin(ph)*sin(th)
x3 = r*cos(th)
In [3]:
E.coord_change(cart, spher).display()    # transition cart -> spher
Out[3]:
r = sqrt(x1^2 + x2^2 + x3^2)
th = arctan2(sqrt(x1^2 + x2^2), x3)
ph = arctan2(x2, x1)


The manifolds.Sphere module allows for higher dimensions.

We can use predefined embeddings and transition functions on higher dimensional spheres.


Example 5.2

Let us demonstrate the case of 3-dimensional sphere in $E^4$.

In [4]:
%display latex
dim=3           # dimension of the sphere (not the Euclidean space)
Sph=manifolds.Sphere(dim)            # sphere S^3
spher = Sph.spherical_coordinates()  # spherical coordinates on S^3
Sph.embedding().disp()               # embedding S^3 -> E^4
Out[4]:
\(\displaystyle \begin{array}{llcl} \iota:& \mathbb{S}^{3} & \longrightarrow & \mathbb{E}^{4} \\ \mbox{on}\ A : & \left(\chi, \theta, \phi\right) & \longmapsto & \left({x_{1}}, {x_{2}}, {x_{3}}, {x_{4}}\right) = \left(\cos\left(\phi\right) \sin\left(\chi\right) \sin\left(\theta\right), \sin\left(\chi\right) \sin\left(\phi\right) \sin\left(\theta\right), \cos\left(\theta\right) \sin\left(\chi\right), \cos\left(\chi\right)\right) \end{array}\)


The stereographic projections are also accessible in higher dimensions.


Example 5.3

Stereographic coordinates in $S^3$.

In [5]:
# continuation
%display latex
stereoN, stereoS = Sph.coordinate_charts('stereographic',
        names=['u','v','w'])      # stereographic projections in S^3
Sph.embedding().disp()            # show embeddings into E^4
Out[5]:
\(\displaystyle \begin{array}{llcl} \iota:& \mathbb{S}^{3} & \longrightarrow & \mathbb{E}^{4} \\ \mbox{on}\ A : & \left(\chi, \theta, \phi\right) & \longmapsto & \left({x_{1}}, {x_{2}}, {x_{3}}, {x_{4}}\right) = \left(\cos\left(\phi\right) \sin\left(\chi\right) \sin\left(\theta\right), \sin\left(\chi\right) \sin\left(\phi\right) \sin\left(\theta\right), \cos\left(\theta\right) \sin\left(\chi\right), \cos\left(\chi\right)\right) \\ \mbox{on}\ \mathbb{S}^{3}\setminus\{\mathrm{NP}\} : & \left(u, v, w\right) & \longmapsto & \left({x_{1}}, {x_{2}}, {x_{3}}, {x_{4}}\right) = \left(\frac{2 \, u}{u^{2} + v^{2} + w^{2} + 1}, \frac{2 \, v}{u^{2} + v^{2} + w^{2} + 1}, \frac{2 \, w}{u^{2} + v^{2} + w^{2} + 1}, \frac{u^{2} + v^{2} + w^{2} - 1}{u^{2} + v^{2} + w^{2} + 1}\right) \\ \mbox{on}\ \mathbb{S}^{3}\setminus\{\mathrm{SP}\} : & \left({u'}, {v'}, {w'}\right) & \longmapsto & \left({x_{1}}, {x_{2}}, {x_{3}}, {x_{4}}\right) = \left(\frac{2 \, {u'}}{{u'}^{2} + {v'}^{2} + {w'}^{2} + 1}, \frac{2 \, {v'}}{{u'}^{2} + {v'}^{2} + {w'}^{2} + 1}, \frac{2 \, {w'}}{{u'}^{2} + {v'}^{2} + {w'}^{2} + 1}, -\frac{{u'}^{2} + {v'}^{2} + {w'}^{2} - 1}{{u'}^{2} + {v'}^{2} + {w'}^{2} + 1}\right) \end{array}\)

We have also the corresponding transitions in $S^3$ predefined.

In [6]:
A = spher.domain()               # domain of spherical coordinates
# intersection of domains of stereoN and stereoS coordinates:
W = Sph._stereoN_dom.intersection(Sph._stereoS_dom)
# intersection of domains of stereoN,stereoS and spher coordinates:
V=W.intersection(A) 
                                # transition spher -> stereoN:
F1=Sph.coord_change(spher.restrict(V), stereoN.restrict(V))
                                # transition stereoN -> spher:
F2=Sph.coord_change( stereoN.restrict(V),spher.restrict(V))
                                # transition spher -> stereoS 
F3=Sph.coord_change(spher.restrict(V), stereoS.restrict(V))
                                # transition stereoS -> spher
F4=Sph.coord_change( stereoS.restrict(V),spher.restrict(V))
                                # transition stereoN -> stereoS
F5=Sph.coord_change( stereoN.restrict(V),stereoS.restrict(V))
                                # transition stereoS -> stereoN
F6=Sph.coord_change( stereoS.restrict(V),stereoN.restrict(V))
F6.disp()
Out[6]:
\(\displaystyle \left\{\begin{array}{lcl} u & = & \frac{{u'}}{{u'}^{2} + {v'}^{2} + {w'}^{2}} \\ v & = & \frac{{v'}}{{u'}^{2} + {v'}^{2} + {w'}^{2}} \\ w & = & \frac{{w'}}{{u'}^{2} + {v'}^{2} + {w'}^{2}} \end{array}\right.\)
In [7]:
F5.disp()
Out[7]:
\(\displaystyle \left\{\begin{array}{lcl} {u'} & = & \frac{u}{u^{2} + v^{2} + w^{2}} \\ {v'} & = & \frac{v}{u^{2} + v^{2} + w^{2}} \\ {w'} & = & \frac{w}{u^{2} + v^{2} + w^{2}} \end{array}\right.\)


Example 5.4

Spherical coordinates in $R^4$.

We can use manifolds.Sphere to obtain the transition from spherical to Cartesian coordinates in $R^4$.

In [8]:
%display plain # to obtain output which can be re-used in the code
dim=3                              # dimension of the sphere
r=var('r')                         # symbolic variable
Sph=manifolds.Sphere(dim,radius=r) # 3-dim sphere with radius r
Phi=Sph.embedding()                # embedding into E^4
E=Sph.ambient()                    # ambient space E^4
fun=Phi.coord_functions()          # embedding functions
fun.expr()                         # show embedding functions
Out[8]:
(r*cos(phi)*sin(chi)*sin(theta),
 r*sin(chi)*sin(phi)*sin(theta),
 r*cos(theta)*sin(chi),
 r*cos(chi))

The result can be used to define the transition spherU -> cartU in $R^4$.

In [9]:
R4=Manifold(4,'R^4',start_index=1) # manifold R^4
cart.<x1,x2,x3,x4>=R4.chart()      # Cartesian coordinates in R^4
U=R4.open_subset('U',              # open subset of R^4 with half-
  coord_def={cart: (x2!=0, x1<0)}) # plane {x2 = 0, x1 ≥ 0} excluded
cartU=cart.restrict(U)             # restrict cart to U
                                   # spherical coordinates on U, use
                                   # names from the previous output!
spherU.<r,chi,theta,phi>=U.chart(r'r:(0,+oo) chi:(0,pi):\chi\
    theta:(0,pi):\theta  phi:(-pi,pi):periodic:\phi')
                                   # transition spherU -> cartU
spher_to_cart = spherU.transition_map(cartU,fun.expr())
spher_to_cart.disp()               # show transition
Out[9]:
x1 = r*cos(phi)*sin(chi)*sin(theta)
x2 = r*sin(chi)*sin(phi)*sin(theta)
x3 = r*cos(theta)*sin(chi)
x4 = r*cos(chi)
In [10]:
# spher_to_cart.inverse() does not work

Inverse transition can be defined as follows:

In [11]:
fun=(sqrt(x1^2+x2^2+x3^2+x4^2),        # functions defining
     atan2(sqrt(x1^2+x2^2+x3^2),x4),   # inverse transition
     atan2(sqrt(x1^2+x2^2),x3),        # spher -> cart
     atan2(x2,x1))
spher_to_cart.set_inverse(*fun)        # set inverse trans.
Check of the inverse coordinate transformation:
  r == r  *passed*
  chi == arctan2(r*sin(chi), r*cos(chi))  **failed**
  theta == arctan2(r*sin(chi)*sin(theta), r*cos(theta)*sin(chi))  **failed**
  phi == arctan2(r*sin(chi)*sin(phi)*sin(theta), r*cos(phi)*sin(chi)*sin(theta))  **failed**
  x1 == x1  *passed*
  x2 == x2  *passed*
  x3 == x3  *passed*
  x4 == x4  *passed*
NB: a failed report can reflect a mere lack of simplification.

The failed computations reflect a lack of simplification in SageMath and can be checked by hand (https://en.wikipedia.org/wiki/Atan2)


Example 5.5

Spherical coordinates in $R^5$.

In [12]:
%display plain                       # We don't want the Latex output
dim=4                                # dimension of the sphere
r=var('r')                           # symbolic variable
Sph=manifolds.Sphere(dim,radius=r)   # 4-dim sphere, radius r,in E^5
Phi=Sph.embedding()                  # embedding S^4 -> E^5
E=Sph.ambient()                      # ambient space E^5
print("In",E)
print("the spherical coordinates are")
print(E.cartesian_coordinates()[:],"=")
Phi.coord_functions()[:]             # print coordinate functions
In 5-dimensional Euclidean space E^5
the spherical coordinates are
(x1, x2, x3, x4, x5) =
Out[12]:
(r*cos(phi_4)*sin(phi_1)*sin(phi_2)*sin(phi_3),
 r*sin(phi_1)*sin(phi_2)*sin(phi_3)*sin(phi_4),
 r*cos(phi_3)*sin(phi_1)*sin(phi_2),
 r*cos(phi_2)*sin(phi_1),
 r*cos(phi_1))

Using the result we can define the transition spherU -> cartU in $R^5$.

In [13]:
R5=Manifold(5,'R^5')                      # manifold R^5
cart.<x1,x2,x3,x4,x5>=R5.chart()          # Cartesian coord. in R^5
U=R5.open_subset('U',                     # open subset of R^5,
    coord_def={cart:(x3!=0,x2!=0,x1<0)})  #{x3=0,x2=0,x1>=0} exclud.
cartU=cart.restrict(U)                    # restrict Cart.coord.to U
# use the same names as in the output of the previous command
spherU.<r,phi_1,phi_2,phi_3,phi_4>=U.chart(r'r:(0,+oo) phi1:(0,pi):\phi_1\
phi2:(0,pi):\phi_2 phi3:0,pi):\phi_3 phi4:(-pi,pi):periodic:\phi_4')
                                          # spherical coordinates on U
spher_to_cart = spherU.transition_map(cartU,     # define transition
(r*cos(phi_4)*sin(phi_1)*sin(phi_2)*sin(phi_3),  # spher -> cart
r*sin(phi_1)*sin(phi_2)*sin(phi_3)*sin(phi_4),
r*cos(phi_3)*sin(phi_1)*sin(phi_2),
r*cos(phi_2)*sin(phi_1),
r*cos(phi_1)))

spher_to_cart.disp()                      # show transition 
Out[13]:
x1 = r*cos(phi4)*sin(phi1)*sin(phi2)*sin(phi3)
x2 = r*sin(phi1)*sin(phi2)*sin(phi3)*sin(phi4)
x3 = r*cos(phi3)*sin(phi1)*sin(phi2)
x4 = r*cos(phi2)*sin(phi1)
x5 = r*cos(phi1)


Inverse transition:

In [14]:
fun=(sqrt(x1^2+x2^2+x3^2+x4^2+x5^2),        # functions defining the 
     atan2(sqrt(x1^2+x2^2+x3^2+x4^2),x5),   # inverse transition
     atan2(sqrt(x1^2+x2^2+x3^2),x4),
     atan2(sqrt(x1^2+x2^2),x3),
     atan2(x2,x1))
cart_to_spher=spher_to_cart.set_inverse(*fun)  # define inv. trans.
Check of the inverse coordinate transformation:
  r == r  *passed*
  phi1 == arctan2(r*sin(phi1), r*cos(phi1))  **failed**
  phi2 == arctan2(r*sin(phi1)*sin(phi2), r*cos(phi2)*sin(phi1))  **failed**
  phi3 == arctan2(r*abs(sin(phi3))*sin(phi1)*sin(phi2), r*cos(phi3)*sin(phi1)*sin(phi2))  **failed**
  phi4 == arctan2(r*sin(phi1)*sin(phi2)*sin(phi3)*sin(phi4), r*cos(phi4)*sin(phi1)*sin(phi2)*sin(phi3))  **failed**
  x1 == x1  *passed*
  x2 == x2  *passed*
  x3 == x3  *passed*
  x4 == x4  *passed*
  x5 == x5  *passed*
NB: a failed report can reflect a mere lack of simplification.

What's next?

Take a look at the notebook The notion of module.