This notebook is part of the Introduction to manifolds in SageMath by Andrzej Chrzeszczyk (Jan Kochanowski University of Kielce, Poland).
version()
'SageMath version 9.6, Release Date: 2022-05-15'
A vector field $X$ on a manifold $M$ assigns to a point $p ∈ M$ a tangent vector $X(p) ∈ T_p M$. Instead of $X(p)$ we shall write $X_p$. Since a vector field gives us a tangent vector at each point of its domain and a tangent vector can be applied to real-valued smooth functions to yield real numbers, given a vector field $X$ and $f ∈ C^∞ (M)$, we can form a real-valued function $X(f)=Xf$, defined by \begin{equation} (X f )( p) ≡ X_p( f ). \label{}\tag{11.1} \end{equation}
We have also an equivalent definition
A vector field $X$ on a manifold $M$ is a linear map $X : C^∞ (M ) → C^∞ (M )$ such that
A vector field $X$ is smooth if for all $f\in C^\infty(M)$ the function $Xf$ is also in $C^\infty(M)$.
Equivalently we can say that a vector field $X$ on a manifold $M$ is smooth if for any coordinate chart $φ = (x^1 ,\ldots , x^n ) :U → R^n$ we have for any point $p ∈ U$
\begin{equation}
X(p) = f^i(p)\frac{\partial}{\partial x^i}\Big|_p
\label{}\tag{11.2}
\end{equation}
for some $C^\infty$ functions $f^i : U → R$.
To define vector fields with specified components in SageMath Manifolds we need vector frames.
If $U$ is an open subset of a manifold $M$ (for example a coordinate neighborhood) then the vector frame on $U$ is the sequence $e$ of vector fields on $U$ such that for each $p∈U, \ e(p)$ is a vector basis of the tangent space $T_pU$.
Usually we shall use the coordinate frames associated with the local coordinates.
Example 11.1
Let us display the frame corresponding to the default chart
%display latex
R2=Manifold(2,'R^2',start_index=1) # manifold R^2
c_xy.<x,y>=R2.chart() # global coordinates
v = R2.vector_field(name='v') # vector field on R2
e = c_xy.frame() # vector frame
print(e)
e
Coordinate frame (R^2, (∂/∂x,∂/∂y))
In this case the elements of the frame are the vector fields $p\to \frac{\partial}{\partial x^i}\big|_p\quad$
($\frac{\partial}{\partial x^i}\big|_p$ was defined by formula (8.3)).
If the frame is not defined by the user, the default frame is used.
Let us check how the elements e[1],e[2] of our frame e act on a scalar function.
# continuation # f is a scalar function on R2:
f = R2.scalar_field(function('f')(x,y), name='f')
e[1](f).expr(), e[2](f).expr() # values of the vector frame on f
If the frame is defined, we can define the components of the vector field in this frame.
Example 11.2
Here defining a vector field, we use frame e:
R2=Manifold(2,'R^2',start_index=1) # manifold R2
c_xy.<x,y>=R2.chart() # global coordinates
v = R2.vector_field(name='v') # vector field v
e = c_xy.frame() # vector frame e
v[e,:] = [-y, 1+x] # components of v in e
v.display() # show v
Since we use the default frame, the previous code can be simplified.
Example 11.3
Here the frame is not specified, the result is the same, since we have used the default frame
R2=Manifold(2,'R^2',start_index=1) # manifold R2
c_xy.<x,y>=R2.chart() # global coordinates
v = R2.vector_field(name='v') # vector field
v[:] = [-y, 1+x] # components of v in default frame
v.display() # show v
The value of v on a scalar function:
# continuation # scalar function
f = R2.scalar_field(function('f')(x,y), name='f')
s=v(f) # value of v on f
s.expr() # show expression
Example 11.4
Let us check that vector fields are derivations.
# vector fields are derivations
R2=Manifold(2,'R^2',start_index=1) # manifold R2
c_xy.<x,y>=R2.chart() # global coordinates
v = R2.vector_field(name='v') # vector field v
e = c_xy.frame() # frame on R2
f=R2.scalar_field(function('f')(x,y)) # scalar function f
g=R2.scalar_field(function('g')(x,y)) # scalar function g
v1=R2.scalar_field(function('v1')(x,y)) # component v1 of v
v2=R2.scalar_field(function('v2')(x,y)) # component v2 of v
v[e,:] = [v1, v2] # components of v in frame e
First we compute the value of $\ v(fg)$:
v(f*g).expr() # value of v on f*g
and next the value of $\ fv(g)+gv(f)$:
(f*v(g)+g*v(f)).expr() # value of f*v(g)+g*v(f)
Both values are the same:
v(f*g) == f*v(g) + g*v(f) # check if v is derivation
Example 11.5
Let us plot the vector field $\quad v_0=\frac{-y}{\sqrt{x^2+y^2}}\frac{\partial}{\partial x} +\frac{x}{\sqrt{x^2+y^2}}\frac{\partial}{\partial y}. $
To obtain the plot, some restriction are necessary.
%display latex
R2=Manifold(2,'R^2',start_index=1) # manifold R2
c_xy.<x,y>=R2.chart(coord_restrictions=lambda x,y:x^2+y^2>0)
v0=R2.vector_field(name='v0') # vector field v0
v0[:]=-y/sqrt(x^2+y^2),x/sqrt(x^2+y^2) # components of v0
v0.display()
v0.plot(arrowsize=2,color='black',aspect_ratio=1) # plot v0
Use the command v0.plot?
to see how to plot vector fields.
Example 11.6
Now let us plot the vector field $\quad v_1=x\frac{\partial}{\partial x} -y\frac{\partial}{\partial y}. $
Here we have excluded some neighborhood of the origin.
M=Manifold(2,'M') # manifold M
X.<x,y>=M.chart(coord_restrictions=lambda x,y:(abs(x)>0.1,abs(y)>0.1))
e=X.frame() # frame e on M
v1=M.vector_field(name='v1') # vector field v1
v1[e,:]=x,-y # components of v1
v1.plot(number_values=10, scale=0.2,
arrowsize=2,color='black',aspect_ratio=1) # plot v1
Example 11.7
Let us consider the two-dimensional sphere with spherical coordinates $\theta,\phi$ and the corresponding frame $\frac{\partial}{\partial\theta},\frac{\partial}{\partial\phi}$.
%display latex
S2=manifolds.Sphere(2) # sphere S^2
Phi=S2.embedding() # embedding S^2 -> E^3
sph.<th,ph>=S2.spherical_coordinates() # spherical coord. on S^2
sphFr=sph.frame() # frame on S^2
E=S2.ambient() # Euclidean space E^3
cart.<x,y,z> = E.cartesian_coordinates() # Cart.coord. in E^3
First let us plot the vector field $\frac{\partial}{\partial\phi}$:
p1=sphFr[2].plot(chart=cart, mapping=Phi,number_values=10,
scale=0.5,arrowsize=0.5,label_axes=False,thickness=0.5,
width=0.5,color='black') # plot vector field d/dphi
s=sphere(color='lightgrey',opacity=0.9) # plot the sphere
(p1+s).show(frame=False,label_axes=False) # combine plots