Coordinate Functions¶
In the context of a topological manifold \(M\) over a topological field \(K\), a coordinate function is a function from a chart codomain to \(K\). In other words, a coordinate function is a \(K\)-valued function of the coordinates associated to some chart.
More precisely, let \((U, \varphi)\) be a chart on \(M\), i.e. \(U\) is an open subset of \(M\) and \(\varphi: U \to V \subset K^n\) is a homeomorphism from \(U\) to an open subset \(V\) of \(K^n\). A coordinate function associated to the chart \((U, \varphi)\) is a function
Coordinate functions are implemented by derived classes of the abstract base
class CoordFunction
.
The class MultiCoordFunction
implements \(K^m\)-valued functions of
the coordinates of a chart, with \(m\) a positive integer.
AUTHORS:
- Eric Gourgoulhon, Michal Bejger (2013-2015) : initial version
- Travis Scrimshaw (2016) : make
CoordFunction
inheritate fromAlgebraElement
-
class
sage.manifolds.coord_func.
CoordFunction
(parent)¶ Bases:
sage.structure.element.AlgebraElement
Abstract base class for coordinate functions.
If \((U, \varphi)\) is a chart on a topological manifold \(M\) of dimension \(n\) over a topological field \(K\), a coordinate function associated to \((U, \varphi)\) is a map \(f: V \subset K^n \to K\), where \(V\) is the codomain of \(\varphi\). In other words, \(f\) is a \(K\)-valued function of the coordinates associated to the chart \((U, \varphi)\).
The class
CoordFunction
is an abstract one. Specific coordinate functions must be implemented by derived classes, likeCoordFunctionSymb
for symbolic coordinate functions.INPUT:
parent
– the algebra of coordinate functions on a given chart
-
arccos
()¶ Arc cosine of
self
.OUTPUT:
- coordinate function \(\arccos(f)\), where \(f\) is the current coordinate function
-
arccosh
()¶ Inverse hyperbolic cosine of
self
.OUTPUT:
- coordinate function \(\mathrm{arcosh}(f)\), where \(f\) is the current coordinate function
-
arcsin
()¶ Arc sine of
self
.OUTPUT:
- coordinate function \(\arcsin(f)\), where \(f\) is the current coordinate function
-
arcsinh
()¶ Inverse hyperbolic sine of
self
.OUTPUT:
- coordinate function \(\mathrm{arsinh}(f)\), where \(f\) is the current coordinate function
-
arctan
()¶ Arc tangent of
self
.OUTPUT:
- coordinate function \(\arctan(f)\), where \(f\) is the current coordinate function
-
arctanh
()¶ Inverse hyperbolic tangent of
self
.OUTPUT:
- coordinate function \(\mathrm{artanh}(f)\), where \(f\) is the current coordinate function
-
chart
()¶ Return the chart with respect to which
self
is defined.OUTPUT:
- a
Chart
EXAMPLES:
sage: M = Manifold(2, 'M', structure='topological') sage: X.<x,y> = M.chart() sage: f = X.function(1+x+y^2) sage: f.chart() Chart (M, (x, y)) sage: f.chart() is X True
- a
-
copy
()¶ Return an exact copy of the object.
OUTPUT:
- an instance of
CoordFunction
- an instance of
-
cos
()¶ Cosine of
self
.OUTPUT:
- coordinate function \(\cos(f)\), where \(f\) is the current coordinate function
-
cosh
()¶ Hyperbolic cosine of
self
.OUTPUT:
- coordinate function \(\cosh(f)\), where \(f\) is the current coordinate function
-
diff
(coord)¶ Return the partial derivative of
self
with respect to a coordinate.INPUT:
coord
– either the coordinate \(x^i\) with respect to which the derivative of the coordinate function \(f\) is to be taken, or the index \(i\) labelling this coordinate (with the index convention defined on the chart domain via the parameterstart_index
)
OUTPUT:
- instance of
CoordFunction
representing the partial derivative \(\frac{\partial f}{\partial x^i}\)
-
disp
()¶ Display the function in arrow notation.
-
display
()¶ Display the function in arrow notation.
-
exp
()¶ Exponential of
self
.OUTPUT:
- coordinate function \(\exp(f)\), where \(f\) is the current coordinate function.
-
expr
()¶ Return some data that, along with the chart, is sufficient to reconstruct the object.
For a symbolic coordinate function, this returns the symbol expression representing the function (see
sage.manifolds.coord_func_symb.CoordFunctionSymb.expr()
)
-
is_trivial_zero
()¶ Check if
self
is trivially equal to zero without any simplification.This method is supposed to be fast as compared with
self.is_zero()
orself == 0
and is intended to be used in library code where trying to obtain a mathematically correct result by applying potentially expensive rewrite rules is not desirable.
-
log
(base=None)¶ Logarithm of
self
.INPUT:
base
– (default:None
) base of the logarithm; if None, the natural logarithm (i.e. logarithm to base e) is returned
OUTPUT:
- coordinate function \(\log_a(f)\), where \(f\) is the current coordinate function and \(a\) is the base
-
scalar_field
(name=None, latex_name=None)¶ Construct the scalar field that has
self
as coordinate expression.The domain of the scalar field is the open subset covered by the chart on which
self
is defined.INPUT:
name
– (default:None
) name given to the scalar fieldlatex_name
– (default:None
) LaTeX symbol to denote the scalar field; ifNone
, the LaTeX symbol is set toname
OUTPUT:
EXAMPLES:
Construction of a scalar field on a 2-dimensional manifold:
sage: M = Manifold(2, 'M', structure='topological') sage: c_xy.<x,y> = M.chart() sage: fc = c_xy.function(x+2*y^3) sage: f = fc.scalar_field() ; f Scalar field on the 2-dimensional topological manifold M sage: f.display() M --> R (x, y) |--> 2*y^3 + x sage: f.coord_function(c_xy) is fc True
-
sin
()¶ Sine of
self
.OUTPUT:
- coordinate function \(\sin(f)\), where \(f\) is the current coordinate function
-
sinh
()¶ Hyperbolic sine of
self
.OUTPUT:
- coordinate function \(\sinh(f)\), where \(f\) is the current coordinate function
-
sqrt
()¶ Square root of
self
.OUTPUT:
- coordinate function \(\sqrt{f}\), where \(f\) is the current coordinate function
-
tan
()¶ Tangent of
self
.OUTPUT:
- coordinate function \(\tan(f)\), where \(f\) is the current coordinate function
-
tanh
()¶ Hyperbolic tangent of
self
.OUTPUT:
- coordinate function \(\tanh(f)\), where \(f\) is the current coordinate function
-
class
sage.manifolds.coord_func.
MultiCoordFunction
(chart, expressions)¶ Bases:
sage.structure.sage_object.SageObject
Coordinate function to some Cartesian power of the base field.
If \(n\) and \(m\) are two positive integers and \((U, \varphi)\) is a chart on a topological manifold \(M\) of dimension \(n\) over a topological field \(K\), a multi-coordinate function associated to \((U, \varphi)\) is a map
\[\begin{split}\begin{array}{llcl} f:& V \subset K^n & \longrightarrow & K^m \\ & (x^1, \ldots, x^n) & \longmapsto & (f_1(x^1, \ldots, x^n), \ldots, f_m(x^1, \ldots, x^n)), \end{array}\end{split}\]where \(V\) is the codomain of \(\varphi\). In other words, \(f\) is a \(K^m\)-valued function of the coordinates associated to the chart \((U, \varphi)\). Each component \(f_i\) (\(1 \leq i \leq m\)) is a coordinate function and is therefore stored as a
CoordFunction
.INPUT:
chart
– the chart \((U, \varphi)\)expressions
– list (or tuple) of length \(m\) of elements to construct the coordinate functions \(f_i\) (\(1 \leq i \leq m\)); for symbolic coordinate functions, this must be symbolic expressions involving the chart coordinates, while for numerical coordinate functions, this must be data file names
EXAMPLES:
A function \(f: V \subset \RR^2 \longrightarrow \RR^3\):
sage: M = Manifold(2, 'M', structure='topological') sage: X.<x,y> = M.chart() sage: f = X.multifunction(x-y, x*y, cos(x)*exp(y)); f Coordinate functions (x - y, x*y, cos(x)*e^y) on the Chart (M, (x, y)) sage: type(f) <class 'sage.manifolds.coord_func.MultiCoordFunction'> sage: f(x,y) (x - y, x*y, cos(x)*e^y) sage: latex(f) \left(x - y, x y, \cos\left(x\right) e^{y}\right)
Each real-valued function \(f_i\) (\(1 \leq i \leq m\)) composing \(f\) can be accessed via the square-bracket operator, by providing \(i-1\) as an argument:
sage: f[0] x - y sage: f[1] x*y sage: f[2] cos(x)*e^y
We can give a more verbose explanation of each function:
sage: f[0].display() (x, y) |--> x - y
Each
f[i-1]
is an instance ofCoordFunction
:sage: isinstance(f[0], sage.manifolds.coord_func.CoordFunction) True
In the present case,
f[i-1]
is an instance of the subclassCoordFunctionSymb
:sage: type(f[0]) <class 'sage.manifolds.coord_func_symb.CoordFunctionSymbRing_with_category.element_class'>
A class
MultiCoordFunction
can represent a real-valued function (case \(m = 1\)), although one should rather employ the classCoordFunction
for this purpose:sage: g = X.multifunction(x*y^2) sage: g(x,y) (x*y^2,)
Evaluating the functions at specified coordinates:
sage: f(1,2) (-1, 2, cos(1)*e^2) sage: var('a b') (a, b) sage: f(a,b) (a - b, a*b, cos(a)*e^b) sage: g(1,2) (4,)
-
chart
()¶ Return the chart with respect to which
self
is defined.OUTPUT:
- a
Chart
EXAMPLES:
sage: M = Manifold(2, 'M', structure='topological') sage: X.<x,y> = M.chart() sage: f = X.multifunction(x-y, x*y, cos(x)*exp(y)) sage: f.chart() Chart (M, (x, y)) sage: f.chart() is X True
- a
-
expr
()¶ Return a tuple of data, the item no.`i` begin sufficient to reconstruct the coordinate function no. \(i\).
In other words, if
f
is a multi-coordinate function, thenf.chart().multifunction(*(f.expr()))
results in a multi-coordinate function identical tof
.For a symbolic multi-coordinate function,
expr()
returns the tuple of the symbolic expressions of the coordinate functions composing the object.EXAMPLES:
sage: M = Manifold(2, 'M', structure='topological') sage: X.<x,y> = M.chart() sage: f = X.multifunction(x-y, x*y, cos(x)*exp(y)) sage: f.expr() (x - y, x*y, cos(x)*e^y) sage: type(f.expr()[0]) <type 'sage.symbolic.expression.Expression'>
One shall always have:
sage: f.chart().multifunction(*(f.expr())) == f True
-
jacobian
()¶ Return the Jacobian matrix of the system of coordinate functions.
jacobian()
is a 2-dimensional array of size \(m \times n\), where \(m\) is the number of functions and \(n\) the number of coordinates, the generic element being \(J_{ij} = \frac{\partial f_i}{\partial x^j}\) with \(1 \leq i \leq m\) (row index) and \(1 \leq j \leq n\) (column index).OUTPUT:
- Jacobian matrix as a 2-dimensional array
J
of coordinate functions withJ[i-1][j-1]
being \(J_{ij} = \frac{\partial f_i}{\partial x^j}\) for \(1 \leq i \leq m\) and \(1 \leq j \leq n\)
EXAMPLES:
Jacobian of a set of 3 functions of 2 coordinates:
sage: M = Manifold(2, 'M', structure='topological') sage: X.<x,y> = M.chart() sage: f = X.multifunction(x-y, x*y, y^3*cos(x)) sage: f.jacobian() [ 1 -1] [ y x] [ -y^3*sin(x) 3*y^2*cos(x)]
Each element of the result is a
coordinate function
:sage: type(f.jacobian()[2,0]) <class 'sage.manifolds.coord_func_symb.CoordFunctionSymbRing_with_category.element_class'> sage: f.jacobian()[2,0].display() (x, y) |--> -y^3*sin(x)
Test of the computation:
sage: [[f.jacobian()[i,j] == f[i].diff(j) for j in range(2)] for i in range(3)] [[True, True], [True, True], [True, True]]
Test with
start_index = 1
:sage: M = Manifold(2, 'M', structure='topological', start_index=1) sage: X.<x,y> = M.chart() sage: f = X.multifunction(x-y, x*y, y^3*cos(x)) sage: f.jacobian() [ 1 -1] [ y x] [ -y^3*sin(x) 3*y^2*cos(x)] sage: [[f.jacobian()[i,j] == f[i].diff(j+1) for j in range(2)] # note the j+1 ....: for i in range(3)] [[True, True], [True, True], [True, True]]
- Jacobian matrix as a 2-dimensional array
-
jacobian_det
()¶ Return the Jacobian determinant of the system of functions.
The number \(m\) of coordinate functions must equal the number \(n\) of coordinates.
OUTPUT:
- a
CoordFunction
representing the determinant
EXAMPLES:
Jacobian determinant of a set of 2 functions of 2 coordinates:
sage: M = Manifold(2, 'M', structure='topological') sage: X.<x,y> = M.chart() sage: f = X.multifunction(x-y, x*y) sage: f.jacobian_det() x + y
The output of
jacobian_det()
is an instance ofCoordFunction
and can therefore be called on specific values of the coordinates, e.g. \((x,y) = (1,2)\):sage: type(f.jacobian_det()) <class 'sage.manifolds.coord_func_symb.CoordFunctionSymbRing_with_category.element_class'> sage: f.jacobian_det().display() (x, y) |--> x + y sage: f.jacobian_det()(1,2) 3
The result is cached:
sage: f.jacobian_det() is f.jacobian_det() True
We verify the determinant of the Jacobian:
sage: f.jacobian_det() == det(matrix([[f[i].diff(j).expr() for j in range(2)] ....: for i in range(2)])) True
Jacobian determinant of a set of 3 functions of 3 coordinates:
sage: M = Manifold(3, 'M', structure='topological') sage: X.<x,y,z> = M.chart() sage: f = X.multifunction(x*y+z^2, z^2*x+y^2*z, (x*y*z)^3) sage: f.jacobian_det().display() (x, y, z) |--> 6*x^3*y^5*z^3 - 3*x^4*y^3*z^4 - 12*x^2*y^4*z^5 + 6*x^3*y^2*z^6
We verify the determinant of the Jacobian:
sage: f.jacobian_det() == det(matrix([[f[i].diff(j).expr() for j in range(3)] ....: for i in range(3)])) True
- a