{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# SageManifolds tutorial\n", "\n", "This worksheet provides a short introduction to \n", "[SageManifolds](http://sagemanifolds.obspm.fr) (version 0.9.1).\n", "\n", "Click [here](https://raw.githubusercontent.com/sagemanifolds/SageManifolds/master/Worksheets/v0.9.1/SM_tutorial.ipynb) to download the worksheet file (ipynb format). To run it, you must start SageMath with the Jupyter notebook, via the command `sage -n jupyter`\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we set up the notebook to display mathematical objects using LaTeX formatting:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%display latex" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Defining a manifold

\n", "

The following assumes that the SageManifolds package is installed on your computer (see the download and installation instructions if not).

\n", "

As an example let us define a differentiable manifold of dimension 3 over $\\mathbb{R}$:

" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "M = Manifold(3, 'M', r'\\mathcal{M}', start_index=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The first argument, `3`, is the manifold dimension. In SageManifolds, it can be any\n", " positive integer.\n", "- The second argument, `'M'`, is a string defining the manifold's name; it may be \n", " different from the symbol set on the left-hand side of the = sign (here M): the latter\n", " is a mere Python variable name that refers to the manifold object in the computer \n", " memory, while the string `'M'` identifies the manifold.\n", "- The third argument, `r'\\mathcal{M}'`, is a string defining the LaTeX symbol to represent \n", " the manifold. Note the letter 'r' in front on the first quote: it indicates that the \n", " string is a *raw* one, so that the backslash character in `\\mathcal` is considered as \n", " an ordinary character (otherwise, the backslash is used to escape some special \n", " characters).\n", "- The fourth argument, `start_index=1`, defines the range of indices to be used for \n", " tensor components on the manifold: setting it to 1 means that indices will range \n", " in $\\{1,2,3\\}$. The default value is start_index=0.\n", " \n", "If we ask for M, it is displayed via its LaTeX symbol:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "3-dimensional differentiable manifold M" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

If we use the command print instead, we get a short description of the object:

" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3-dimensional differentiable manifold M\n" ] } ], "source": [ "print(M)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Via the command type, we get the type of the Python object corresponding to M (here the Python class DifferentiableManifold_with_category):

" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(M)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The indices on the manifold are generated by the method irange(), to be used in loops:

" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "3\n" ] } ], "source": [ "for i in M.irange():\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

If the parameter start_index had not been specified, the default range of the indices would have been $\\{0,1,2\\}$ instead:

" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n" ] } ], "source": [ "M0 = Manifold(3, 'M', r'\\mathcal{M}')\n", "for i in M0.irange():\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Defining a chart on the manifold

\n", "

Let us assume that the manifold $\\mathcal{M}$ can be covered by a single chart (other cases are discussed below); the chart is declared as follows:

" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "X. = M.chart()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The writing `.` in the left-hand side means that the Python variables `x`, `y` and `z` are set to the three coordinates of the chart. This allows one to refer subsequently to the coordinates by their names.\n", "\n", "In this example, the function `chart()` has no arguments, which implies that the coordinate symbols will be `x`, `y` and `z` (i.e. exactly the characters set in the <...> operator) and that each coordinate range is $(-\\infty,+\\infty)$. For other cases, an argument must be passed to `chart()`  to specify the coordinate symbols and range, as well as the LaTeX symbols of the coordinates if the latter are different from the coordinate names (an example will be provided below)." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Chart (M, (x, y, z))\n" ] } ], "source": [ "print(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The chart is displayed as a pair formed by the open set covered by it (here the whole manifold) and the coordinate names:

" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Chart (M, (x, y, z))" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The coordinates can be accessed individually, by means of their indices, following the convention defined by start_index=1 in the manifold's definition:

" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "x" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X[1]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "y" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X[2]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "z" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X[3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The full set of coordinates is obtained by means of the operator [:]:

" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(x, y, z)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Thanks to the operator in the chart declaration, each coordinate can be accessed directly via its name:

" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z is X[3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Coordinates are SageMath symbolic expressions:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Functions of the chart coordinates

\n", "

Real-valued functions of the chart coordinates (mathematically speaking, functions defined on the chart codomain) are formed via the method function() acting on the chart:

" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "z^3 + y^2 + x" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f = X.function(x+y^2+z^3) ; f" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(x, y, z) |--> z^3 + y^2 + x" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.display()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "32" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(1,2,3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

They belong to SageManifolds class CoordFunctionSymb:

" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

and differ from SageMath standard symbolic functions by automatic simplifications in all operations. For instance, adding the two symbolic functions

" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [], "source": [ "f0(x,y,z) = cos(x)^2 ; g0(x,y,z) = sin(x)^2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

results in

" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(x, y, z) |--> cos(x)^2 + sin(x)^2" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f0 + g0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

while the sum of the corresponding functions in the class CoordFunctionSymb is automatically simplified:

" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "1" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f1 = X.function(cos(x)^2) ; g1 = X.function(sin(x)^2)\n", "f1 + g1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

To get the same output with symbolic functions, one has to call the method simplify_trig():

" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(x, y, z) |--> 1" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(f0 + g0).simplify_trig()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Another difference regards the display; if we ask for the symbolic function f0, we get:

" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(x, y, z) |--> cos(x)^2" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

while if we ask for the chart function f1, we get only the coordinate expression:

" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "cos(x)^2" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

To get an output similar to that of f0, one should call the method display():

" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(x, y, z) |--> cos(x)^2" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f1.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the method `expr()` returns the underlying symbolic expression:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "cos(x)^2" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f1.expr()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(f1.expr())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Introducing a second chart on the manifold\n", "\n", "Let us first consider an open subset of $\\mathcal{M}$, for instance the complement $U$ of the region defined by $\\{y=0, x\\geq 0\\}$ (note that `(y!=0, x<0)` stands for $y\\not=0$ OR $x<0$; the condition $y\\not=0$ AND $x<0$ would have been written `[y!=0, x<0]` instead):" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [], "source": [ "U = M.open_subset('U', coord_def={X: (y!=0, x<0)})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Let us call X_U the restriction of the chart X to the open subset $U$:

" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Chart (U, (x, y, z))" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_U = X.restrict(U) ; X_U" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

We introduce another chart on $U$, with spherical-type coordinates $(r,\\theta,\\phi)$:

" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Chart (U, (r, th, ph))" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Y. = U.chart(r'r:(0,+oo) th:(0,pi):\\theta ph:(0,2*pi):\\phi') ; Y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The function chart() has now some argument; it is a string, which contains specific LaTeX symbols, hence the prefix 'r' to it (for raw string). It also contains the coordinate ranges, since they are different from the default value, which is $(-\\infty, +\\infty)$. For a given coordinate, the various fields are separated by the character ':' and a space character separates the coordinates. Note that for $r$, there is only two fields, since the LaTeX symbol has not to be specified. The LaTeX symbols are used for the outputs:

" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(th, ph)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "th, ph" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(th, ph)" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Y[2], Y[3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The declared coordinate ranges are now known to Sage, as we may check by means of the command assumptions():

" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[x is real,\n", " y is real,\n", " z is real,\n", " r is real,\n", " r > 0,\n", " th is real,\n", " th > 0,\n", " th < pi,\n", " ph is real,\n", " ph > 0,\n", " ph < 2*pi]" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "assumptions()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

They are used in simplifications:

" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "r" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "simplify(abs(r))" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "abs(x)" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "simplify(abs(x)) # no simplification occurs since x can take any value in R" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

After having been declared, the chart Y can be fully specified by its relation to the chart X_U, via a transition map:

" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [], "source": [ "transit_Y_to_X = Y.transition_map(X_U, [r*sin(th)*cos(ph), r*sin(th)*sin(ph), r*cos(th)])" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Change of coordinates from Chart (U, (r, th, ph)) to Chart (U, (x, y, z))" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "transit_Y_to_X" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "x = r*cos(ph)*sin(th)\n", "y = r*sin(ph)*sin(th)\n", "z = r*cos(th)" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "transit_Y_to_X.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The inverse of the transition map can be specified by means of the method set_inverse():

" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "r = sqrt(x^2 + y^2 + z^2)\n", "th = arctan2(sqrt(x^2 + y^2), z)\n", "ph = arctan2(y, x)" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "transit_Y_to_X.set_inverse(sqrt(x^2+y^2+z^2), atan2(sqrt(x^2+y^2),z), atan2(y, x))\n", "transit_Y_to_X.inverse().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The check is passed, although some simplifications related to the arctan2 function are not performed.

\n", "

At this stage, the manifold's atlas (the \"user atlas\", not the maximal atlas!) contains three charts:

" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[Chart (M, (x, y, z)), Chart (U, (x, y, z)), Chart (U, (r, th, ph))]" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.atlas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The first chart defined on the manifold is considered as the manifold's default chart (it can be changed by the method set_default_chart()):

" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Chart (M, (x, y, z))" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.default_chart()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Each open subset has its own atlas:

" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[Chart (U, (x, y, z)), Chart (U, (r, th, ph))]" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "U.atlas()" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Chart (U, (x, y, z))" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "U.default_chart()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can draw the chart $Y$ in terms of the chart $X$. \n", "Let us first define a viewer for 3D plots (use `'jmol'` for interactive 3D graphics):" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": true }, "outputs": [], "source": [ "viewer3D = 'tachyon' # must be 'jmol', 'tachyon' or None (default)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The plot shows lines of constant coordinates from the $Y$ chart in a \"Cartesian frame\" based on the $X$ coordinates:" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = Y.plot(X)\n", "show(graph, viewer=viewer3D)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The command plot() allows for many options, to control the number of coordinate lines to be drawn, their style and color, as well as the coordinate ranges:

" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\niztjT3V1df/+/ceOHRvvjrReqqurp06dals7kGEiwuLO1HPo0KGqqqqcnJxLLrmEzcbEIXEyZTJJ\nBIs7AwDV1dVTpkzp0qXLueeeG+++NAFLly4tKCjo169fvDvSxFRXVz/zzDOpqalszjMRYXFv1Xg8\nnkTOstsYnn766aeffjrevWheqqurHXntmCaBxb01Yjpzne14SZwVqs0Nu+YZW1jcWxGm67aVSEB5\neXkrXPFv1gh09mObiRIW91ZBZmbmM888E+9etCitx3K3xcEONyZKWNwdi8fjWbt2bWZmJt/hrRnT\nacNC3wphcXcUM2fOzMnJOX78eOfOnZ0XKxITNTU13/rWt+LdiwSirKwMHEzZmmBxdwiZmZmcooSJ\nEnbNtwZY3JOVrVu3XnrppXyXhoIt92jIzMw0/2enjfNgcU8+Pv/885deemnatGnf+c534t0XxiGY\nacvWrl3b2ibeHQyLe9JQWlo6cODA1NTU4cOHHzt2jBN4Mc2BOQ/vdrs7dOjA1kNSw+KeBJw6dSo9\nPf2OO+7o1KlTvPvCtBZOnTo1bdq0Ll26sMQnKSzuiUhubm5qauratWsrKip4mNwwVq9e/atf/Sre\nvXACp06dGj58OE/XJx0s7glHbm4ugHvuuSfeHUluWNybA1Pou3TpcvXVV8e7L0wEWNwTBTNuge30\npoKjZZob/sUmOCzu8eT06dNPPfXU7bffftNNN8W7L06Dxb3FML2IbMsnGizu8SE3N3ft2rXDhw+P\nd0cYpskoLS0152BZ6BMBFvcWJSMjIzU1lf3pLYBS6u677453L1oppms+PT39zDPPjHdfWi8s7s1O\nSUlJRUUFCzrTCjl58uS0adPYaRMXWNybhTVr1ixZsmTdunXDhg274IIL4t2d1gj73BMKMwasS5cu\nANicbxlY3JuYjIyMdevWuVyuxx577LLLLot3d1ovHAqZsJSWlk6dOjUjI4NVvllhcW8aTN9Lly5d\n+PeaILDlnvicPHly7dq1AH7zm9/Euy8OhMW9UUyZMgXAvffeG++OMIGw5Z5EmK558Nq9JoXzfMZM\nRkZGenp69+7dv//970sp2feSmJw4cSLeXWCi5cwzz/TJujkIvvPOO88666z49irZYXGPFinld77z\nHdNIP+uss3JycuLdIyYckyZNuu666+LdCyZmfvOb35hempKSEjNqnp02DYPdMhGYMWPGj370o44d\n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\n1gKk8CjciatVVFQUe5WksU3J6bMgJYfCnRQBo7akGIfwVPJInELVMqQ4TFXRFEtWRiKR/v7+Yjlb\n4j00cifFpFim4Ht6eijZibMo3EkxmZqCHxsbc/pc5hQMBn0+HyU7cRaFOyk+oVAoHo+7c4nVOCvv\nbb8iRYfCnRSlpUuXurARTSQSqa6upjE7cQMKd1LEXNUr2Ej2pUuXOn0ihAAU7qTYhUKhSCTS09Pj\n7Gk0Nzffd999lOzEPSjcSdEzqiTNL7FKKfO7Y3Nzc2tr64IFC0yeACEWonAnXrB06dKKiorm5ubC\nP7SR7IV/XEIyo3An3tHc3ByJREZHR/O7u8/ny+MRKdmJO9EOVeIdCxYsaGxsbG5u9vl8ebRzicfj\n2f+wsU2Jkp24Fo3cide0trbaXQXf09NTXV1N7cCIm1G4Ew9qbW01hvA53SvLaRnjsLR8SlyOwp14\nVmtrq+Xj946OjubmZip5JO5H4U68rLGxsaOjI8sl1vvuuy/DraOjozRmJ0WEwp143P3339/f35/N\nFE1nZ2eGW1tbW5cvX37//fdbd2qE2IjCnXjf0qVLW1tbzVTBGyWPNBtDigjLe1ceIUWno6PD5/PN\nldE9PT1pb6JidlKMKNxJaenu7u7v7087uzI6OjprPr27u/upp56iZCfFiMKdlKKOjo5Z+T46OhqP\nx5ctWzb9Z2ibEileNOdOStSsKfhZY/bm5ubq6mpKdlK8qP0AKUXGsL2jo2Pqv0+fPj11q5Hs00fx\nhBQdmpYhJW16vhuMzuyU7KTYUbiTUmesmj744INtbW2XX345TcUQb6BwJwQA7rrrrkOHDm3atMnp\nEyHEGhTuhBDiQVQtQwghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTggh\nHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkTh\nTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTggh\nHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkTh\nTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTggh\nHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkThTgghHkTh\nTgghHkThTgghHkThTgghHvT/ARf6B4ylmemdAAAAAElFTkSuQmCC\n", "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = Y.plot(X, ranges={r:(1,2), th:(0,pi/2)}, nb_values=4, \n", " color={r:'blue', th:'green', ph:'red'})\n", "show(graph, aspect_ratio=1, viewer=viewer3D)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Conversly, the chart $X|_{U}$ can be plotted in terms of the chart $Y$ (this is not possible for the whole chart $X$ since its domain is larger than that of chart $Y$):

" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = X_U.plot(Y)\n", "show(graph, viewer=viewer3D)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Points on the manifold

\n", "

A point on $\\mathcal{M}$ is defined by its coordinates in a given chart:

" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Point p on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Point p on the 3-dimensional differentiable manifold M" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = M.point((1,2,-1), chart=X, name='p') ; print(p) ; p" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Since $X=(\\mathcal{M}, (x,y,z))$ is the manifold's default chart, its name can be omitted:

" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Point p on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Point p on the 3-dimensional differentiable manifold M" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = M.point((1,2,-1), name='p') ; print(p) ; p" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Of course, $p$ belongs to $\\mathcal{M}$:

" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p in M" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

It is also in $U$:

" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p in U" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Indeed the coordinates of $p$ have $y\\not=0$:

" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1, 2, -1)" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p.coord(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Note in passing that since $X$ is the default chart on $\\mathcal{M}$, its name can be omitted in the arguments of coord():

" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1, 2, -1)" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p.coord()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The coordinates of $p$ can also be obtained by letting the chart acting of the point (from the very definition of a chart!):

" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1, 2, -1)" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Let $q$ be a point with $y = 0$ and $x \\geq 0$:

" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [], "source": [ "q = M.point((1,0,2), name='q')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

This time, the point does not belong to $U$:

" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "False" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q in U" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Accordingly, we cannot ask for the coordinates of $q$ in the chart $Y=(U, (r,\\theta,\\phi))$:

" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Error: the point does not belong to the domain of Chart (U, (r, th, ph))\n" ] } ], "source": [ "try:\n", " q.coord(Y)\n", "except ValueError as exc:\n", " print(\"Error: \" + str(exc))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

but we can for point $p$:

" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(sqrt(3)*sqrt(2), pi - arctan(sqrt(5)), arctan(2))" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p.coord(Y)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(sqrt(3)*sqrt(2), pi - arctan(sqrt(5)), arctan(2))" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Y(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Points can be compared:

" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "False" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q == p" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p1 = U.point((sqrt(6), pi-atan(sqrt(5)), atan(2)), Y)\n", "p1 == p" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

In SageMath's terminology, points are elements, whose parents are the manifold on which they have been defined:

" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "3-dimensional differentiable manifold M" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p.parent()" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "3-dimensional differentiable manifold M" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q.parent()" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Open subset U of the 3-dimensional differentiable manifold M" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p1.parent()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Scalar fields

\n", "

A scalar field is a differentiable mapping $U\\subset \\mathcal{M} \\longrightarrow \\mathbb{R}$, where $U$ is an open subset of $\\mathcal{M}$.

\n", "

The scalar field is defined by its expressions in terms of charts covering its domain (in general more than one chart is necessary to cover all the domain):

" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field f on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "f = U.scalar_field({X_U: x+y^2+z^3}, name='f') ; print(f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The coordinate expressions of the scalar field are passed as a Python dictionary, with the charts as keys, hence the writing {X_U: x+y^2+z^3}.

\n", "

Since in the present case, there is only one chart in the dictionary, an alternative writing is

" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field f on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "f = U.scalar_field(x+y^2+z^3, chart=X_U, name='f') ; print(f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Since X_U is the domain's default chart, it can be omitted in the above declaration:

" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field f on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "f = U.scalar_field(x+y^2+z^3, name='f') ; print(f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As a mapping $U\\subset\\mathcal{M}\\longrightarrow\\mathbb{R}$, a scalar field acts on points, not on coordinates:" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "4" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The expression of the scalar field in terms of the coordinates $(x,y,z)$:

" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "f: U --> R\n", " (x, y, z) |--> z^3 + y^2 + x" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.display(X_U)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

If the method display() is used without any argument, it displays the coordinate expression of the scalar field in all the charts defined on the domain (except for subcharts, i.e. the restrictions of some chart to a subdomain):

" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "f: U --> R\n", " (x, y, z) |--> z^3 + y^2 + x\n", " (r, th, ph) |--> r^3*cos(th)^3 + r^2*sin(ph)^2*sin(th)^2 + r*cos(ph)*sin(th)" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Note that the expression of the scalar field in terms of the coordinates $(r,\\theta,\\phi)$ has not been provided by the user: it has been automatically computed via the change-of-coordinate formula declared above in the transition map.

" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "f: U --> R\n", " (r, th, ph) |--> r^3*cos(th)^3 + r^2*sin(ph)^2*sin(th)^2 + r*cos(ph)*sin(th)" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.display(Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

In each chart, the scalar field is represented by a function of the chart coordinates (an object of the type CoordFunctionSymb described above), which is accessible via the method coord_function():

" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "z^3 + y^2 + x" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.coord_function(X_U)" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(x, y, z) |--> z^3 + y^2 + x" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.coord_function(X_U).display()" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "r^3*cos(th)^3 + r^2*sin(ph)^2*sin(th)^2 + r*cos(ph)*sin(th)" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.coord_function(Y)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(r, th, ph) |--> r^3*cos(th)^3 + r^2*sin(ph)^2*sin(th)^2 + r*cos(ph)*sin(th)" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.coord_function(Y).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The \"raw\" symbolic expression is returned by the method expr():

" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "z^3 + y^2 + x" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.expr(X_U)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "r^3*cos(th)^3 + r^2*sin(ph)^2*sin(th)^2 + r*cos(ph)*sin(th)" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.expr(Y)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.expr(Y) is f.coord_function(Y).expr()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A scalar field can also be defined by some unspecified function of the coordinates:

" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field h on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "h = U.scalar_field(function('H')(x, y, z), name='h') ; print(h)" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "h: U --> R\n", " (x, y, z) |--> H(x, y, z)\n", " (r, th, ph) |--> H(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th))" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.display()" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "h: U --> R\n", " (r, th, ph) |--> H(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th))" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.display(Y)" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "H(1, 2, -1)" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h(p) # remember that p is the point of coordinates (1,2,-1) in the chart X_U" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The parent of $f$ is the set $C^\\infty(U)$ of all smooth scalar fields on $U$, which is a commutative algebra over $\\mathbb{R}$:

" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Algebra of differentiable scalar fields on the Open subset U of the 3-dimensional differentiable manifold M" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "CU = f.parent() ; CU" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Algebra of differentiable scalar fields on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "print(CU)" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Category of commutative algebras over Symbolic Ring" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "CU.category()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
 
\n", "
\n", "

The base ring of the algebra is the field $\\mathbb{R}$, which is represented by Sage's Symbolic Ring (SR):

\n", "
\n", "
 
" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Symbolic Ring" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "CU.base_ring()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Arithmetic operations on scalar fields are defined through the algebra structure:

" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "s = f + 2*h ; print(s)" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "U --> R\n", "(x, y, z) |--> z^3 + y^2 + x + 2*H(x, y, z)\n", "(r, th, ph) |--> r^3*cos(th)^3 + r^2*sin(ph)^2*sin(th)^2 + r*cos(ph)*sin(th) + 2*H(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th))" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Tangent spaces

\n", "

The tangent vector space to the manifold at point $p$ is obtained as follows:

" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Tangent space at Point p on the 3-dimensional differentiable manifold M" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Tp = M.tangent_space(p) ; Tp" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tangent space at Point p on the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "print(Tp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

$T_p\\, \\mathcal{M}$ is a 2-dimensional vector space over $\\mathbb{R}$ (represented here by Sage Symbolic Ring (SR)) :

" ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Category of finite dimensional vector spaces over Symbolic Ring\n" ] } ], "source": [ "print(Tp.category())" ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "3" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Tp.dim()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

$T_p\\, \\mathcal{M}$ is automatically endowed with vector bases deduced from the vector frames defined around the point:

" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[Basis (d/dx,d/dy,d/dz) on the Tangent space at Point p on the 3-dimensional differentiable manifold M,\n", " Basis (d/dr,d/dth,d/dph) on the Tangent space at Point p on the 3-dimensional differentiable manifold M]" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Tp.bases()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

For the tangent space at the point $q$, on the contrary, there is only one pre-defined basis, since $q$ is not in the domain $U$ of the frame associated with coordinates $(r,\\theta,\\phi)$:

" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[Basis (d/dx,d/dy,d/dz) on the Tangent space at Point q on the 3-dimensional differentiable manifold M]" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Tq = M.tangent_space(q)\n", "Tq.bases()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A random element:

" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tangent vector at Point p on the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "v = Tp.an_element() ; print(v)" ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "d/dx + 2 d/dy + 3 d/dz" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.display()" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tangent vector at Point q on the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "u = Tq.an_element() ; print(u)" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "d/dx + 2 d/dy + 3 d/dz" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Note that, despite what the above simplified writing may suggest (the mention of the point $p$ or $q$ is omitted in the basis vectors), $u$ and $v$ are different vectors, for they belong to different vector spaces:

" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Tangent space at Point p on the 3-dimensional differentiable manifold M" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.parent()" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Tangent space at Point q on the 3-dimensional differentiable manifold M" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u.parent()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

In particular, it is not possible to add $u$ and $v$:

" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Error: unsupported operand parent(s) for '+': 'Tangent space at Point q on the 3-dimensional differentiable manifold M' and 'Tangent space at Point p on the 3-dimensional differentiable manifold M'\n" ] } ], "source": [ "try:\n", " s = u + v\n", "except TypeError as exc:\n", " print(\"Error: \" + str(exc))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Vector Fields

\n", "

Each chart defines a vector frame on the chart domain: the so-called coordinate basis:

" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Coordinate frame (M, (d/dx,d/dy,d/dz))" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.frame()" ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "3-dimensional differentiable manifold M" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.frame().domain() # this frame is defined on the whole manifold" ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Coordinate frame (U, (d/dr,d/dth,d/dph))" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Y.frame()" ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Open subset U of the 3-dimensional differentiable manifold M" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Y.frame().domain() # this frame is defined only on U" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The list of frames defined on a given open subset is returned by the method frames():

" ] }, { "cell_type": "code", "execution_count": 108, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[Coordinate frame (M, (d/dx,d/dy,d/dz)),\n", " Coordinate frame (U, (d/dx,d/dy,d/dz)),\n", " Coordinate frame (U, (d/dr,d/dth,d/dph))]" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.frames()" ] }, { "cell_type": "code", "execution_count": 109, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[Coordinate frame (U, (d/dx,d/dy,d/dz)),\n", " Coordinate frame (U, (d/dr,d/dth,d/dph))]" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "U.frames()" ] }, { "cell_type": "code", "execution_count": 110, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Coordinate frame (M, (d/dx,d/dy,d/dz))" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.default_frame()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Unless otherwise specified (via the command set_default_frame()), the default frame is that associated with the default chart:

" ] }, { "cell_type": "code", "execution_count": 111, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.default_frame() is M.default_chart().frame()" ] }, { "cell_type": "code", "execution_count": 112, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "U.default_frame() is U.default_chart().frame()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Individual elements of a frame can be accessed by means of their indices:

" ] }, { "cell_type": "code", "execution_count": 113, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Vector field d/dy on the Open subset U of the 3-dimensional differentiable manifold M" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "e = U.default_frame() ; e2 = e[2] ; e2" ] }, { "cell_type": "code", "execution_count": 114, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Vector field d/dy on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "print(e2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

We may define a new vector field as follows:

" ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Vector field on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "v = e[2] + 2*x*e[3] ; print(v)" ] }, { "cell_type": "code", "execution_count": 116, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "d/dy + 2*x d/dz" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A vector field can be defined by its components with respect to a given vector frame. When the latter is not specified, the open set's default frame is of course assumed:

" ] }, { "cell_type": "code", "execution_count": 117, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "v = (y + 1) d/dx - x d/dy + x*y*z d/dz" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v = U.vector_field(name='v') # vector field defined on the open set U\n", "v[1] = 1+y\n", "v[2] = -x\n", "v[3] = x*y*z\n", "v.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Vector fields on $U$ are Sage element objects, whose parent is the set $\\mathcal{X}(U)$ of vector fields defined on $U$:

" ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Free module X(U) of vector fields on the Open subset U of the 3-dimensional differentiable manifold M" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.parent()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The set $\\mathcal{X}(U)$ is a module over the commutative algebra $C^\\infty(U)$ of scalar fields on $U$:

" ] }, { "cell_type": "code", "execution_count": 119, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Free module X(U) of vector fields on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "print(v.parent())" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Category of finite dimensional modules over Algebra of differentiable scalar fields on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "print(v.parent().category())" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Algebra of differentiable scalar fields on the Open subset U of the 3-dimensional differentiable manifold M" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.parent().base_ring()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A vector field acts on scalar fields:

" ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "f: U --> R\n", " (x, y, z) |--> z^3 + y^2 + x\n", " (r, th, ph) |--> r^3*cos(th)^3 + r^2*sin(ph)^2*sin(th)^2 + r*cos(ph)*sin(th)" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.display()" ] }, { "cell_type": "code", "execution_count": 123, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field v(f) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "s = v(f) ; print(s)" ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "v(f): U --> R\n", " (x, y, z) |--> 3*x*y*z^3 - (2*x - 1)*y + 1\n", " (r, th, ph) |--> -3*r^5*cos(ph)*cos(th)^5*sin(ph) + 3*r^5*cos(ph)*cos(th)^3*sin(ph) - 2*r^2*cos(ph)*sin(ph)*sin(th)^2 + r*sin(ph)*sin(th) + 1" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.display()" ] }, { "cell_type": "code", "execution_count": 125, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "d/dz = d/dz" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "e[3].display()" ] }, { "cell_type": "code", "execution_count": 126, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "d/dz(f): U --> R\n", " (x, y, z) |--> 3*z^2\n", " (r, th, ph) |--> 3*r^2*cos(th)^2" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "e[3](f).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Unset components are assumed to be zero:

" ] }, { "cell_type": "code", "execution_count": 127, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "w = 3 d/dy" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w = U.vector_field(name='w')\n", "w[2] = 3\n", "w.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A vector field on $U$ can be expanded in the vector frame associated with the chart $(r,\\theta,\\phi)$:

" ] }, { "cell_type": "code", "execution_count": 128, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "v = (x*y*z^2 + x)/sqrt(x^2 + y^2 + z^2) d/dr - (x^3*y + x*y^3 - x)*sqrt(x^2 + y^2)*z/(x^4 + 2*x^2*y^2 + y^4 + (x^2 + y^2)*z^2) d/dth - (x^2 + y^2 + y)/(x^2 + y^2) d/dph" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.display(Y.frame())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

By default, the components are expressed in terms of the default coordinates $(x,y,z)$. To express them in terms of the coordinates $(r,\\theta,\\phi)$, one should add the corresponding chart as the second argument of the method display():

" ] }, { "cell_type": "code", "execution_count": 129, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "v = (r^3*cos(ph)*cos(th)^2*sin(ph)*sin(th)^2 + cos(ph)*sin(th)) d/dr - (r^3*cos(ph)*cos(th)*sin(ph)*sin(th)^3 - cos(ph)*cos(th))/r d/dth - (r*sin(th) + sin(ph))/(r*sin(th)) d/dph" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.display(Y.frame(), Y)" ] }, { "cell_type": "code", "execution_count": 130, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for i in M.irange(): e[i].display(Y.frame(), Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The components of a tensor field w.r.t. the default frame can also be obtained as a list, via the command [:]:

" ] }, { "cell_type": "code", "execution_count": 131, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[y + 1, -x, x*y*z]" ] }, "execution_count": 131, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

An alternative is to use the method display_comp():

" ] }, { "cell_type": "code", "execution_count": 132, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "v^x = y + 1 \n", "v^y = -x \n", "v^z = x*y*z " ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.display_comp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

To obtain the components w.r.t. to another frame, one may go through the method comp() and specify the frame:

" ] }, { "cell_type": "code", "execution_count": 133, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[(x*y*z^2 + x)/sqrt(x^2 + y^2 + z^2),\n", " -(x^3*y + x*y^3 - x)*sqrt(x^2 + y^2)*z/(x^4 + 2*x^2*y^2 + y^4 + (x^2 + y^2)*z^2),\n", " -(x^2 + y^2 + y)/(x^2 + y^2)]" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.comp(Y.frame())[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

However a shortcut is to provide the frame as the first argument of the square brackets:

" ] }, { "cell_type": "code", "execution_count": 134, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[(x*y*z^2 + x)/sqrt(x^2 + y^2 + z^2),\n", " -(x^3*y + x*y^3 - x)*sqrt(x^2 + y^2)*z/(x^4 + 2*x^2*y^2 + y^4 + (x^2 + y^2)*z^2),\n", " -(x^2 + y^2 + y)/(x^2 + y^2)]" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v[Y.frame(), :]" ] }, { "cell_type": "code", "execution_count": 135, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "v^r = (x*y*z^2 + x)/sqrt(x^2 + y^2 + z^2) \n", "v^th = -(x^3*y + x*y^3 - x)*sqrt(x^2 + y^2)*z/(x^4 + 2*x^2*y^2 + y^4 + (x^2 + y^2)*z^2) \n", "v^ph = -(x^2 + y^2 + y)/(x^2 + y^2) " ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.display_comp(Y.frame())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Components are shown expressed in terms of the default's coordinates; to get them in terms of the coordinates $(r,\\theta,\\phi)$ instead, add the chart name as the last argument in the square brackets:

" ] }, { "cell_type": "code", "execution_count": 136, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[r^3*cos(ph)*cos(th)^2*sin(ph)*sin(th)^2 + cos(ph)*sin(th),\n", " -(r^3*cos(ph)*cos(th)*sin(ph)*sin(th)^3 - cos(ph)*cos(th))/r,\n", " -(r*sin(th) + sin(ph))/(r*sin(th))]" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v[Y.frame(), :, Y]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

or specify the chart in display_comp():

" ] }, { "cell_type": "code", "execution_count": 137, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "v^r = r^3*cos(ph)*cos(th)^2*sin(ph)*sin(th)^2 + cos(ph)*sin(th) \n", "v^th = -(r^3*cos(ph)*cos(th)*sin(ph)*sin(th)^3 - cos(ph)*cos(th))/r \n", "v^ph = -(r*sin(th) + sin(ph))/(r*sin(th)) " ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.display_comp(Y.frame(), chart=Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

To get some components of a vector as a scalar field, instead of a coordinate expression, use double square brackets:

" ] }, { "cell_type": "code", "execution_count": 138, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "print(v[[1]])" ] }, { "cell_type": "code", "execution_count": 139, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "U --> R\n", "(x, y, z) |--> y + 1\n", "(r, th, ph) |--> r*sin(ph)*sin(th) + 1" ] }, "execution_count": 139, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v[[1]].display()" ] }, { "cell_type": "code", "execution_count": 140, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "y + 1" ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v[[1]].expr(X_U)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A vector field can be defined with components being unspecified functions of the coordinates:

" ] }, { "cell_type": "code", "execution_count": 141, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "u = u_x(x, y, z) d/dx + u_y(x, y, z) d/dy + u_z(x, y, z) d/dz" ] }, "execution_count": 141, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u = U.vector_field(name='u')\n", "u[:] = [function('u_x')(x,y,z), function('u_y')(x,y,z), function('u_z')(x,y,z)]\n", "u.display()" ] }, { "cell_type": "code", "execution_count": 142, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "s = (y + u_x(x, y, z) + 1) d/dx + (-x + u_y(x, y, z)) d/dy + (x*y*z + u_z(x, y, z)) d/dz" ] }, "execution_count": 142, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = v + u ; s.set_name('s') ; s.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Values of vector fields at a given point

\n", "

The value of a vector field at some point of the manifold is obtained via the method at():

" ] }, { "cell_type": "code", "execution_count": 143, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tangent vector v at Point p on the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "vp = v.at(p) ; print(vp)" ] }, { "cell_type": "code", "execution_count": 144, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "v = 3 d/dx - d/dy - 2 d/dz" ] }, "execution_count": 144, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vp.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Indeed, recall that, w.r.t. chart X_U=$(x,y,z)$,  the coordinates of the point $p$ and the components of the vector field $v$ are

" ] }, { "cell_type": "code", "execution_count": 145, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1, 2, -1)" ] }, "execution_count": 145, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p.coord(X_U)" ] }, { "cell_type": "code", "execution_count": 146, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "v = (y + 1) d/dx - x d/dy + x*y*z d/dz" ] }, "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.display(X_U.frame(), X_U)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Note that to simplify the writing, the symbol used to denote the value of the vector field at point $p$ is the same as that of the vector field itself (namely $v$); this can be changed by the method set_name():

" ] }, { "cell_type": "code", "execution_count": 147, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "v = 3 d/dx - d/dy - 2 d/dz" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vp.set_name(latex_name='v|_p')\n", "vp.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Of course, $v|_p$ belongs to the tangent space at $p$:

" ] }, { "cell_type": "code", "execution_count": 148, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Tangent space at Point p on the 3-dimensional differentiable manifold M" ] }, "execution_count": 148, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vp.parent()" ] }, { "cell_type": "code", "execution_count": 149, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vp in M.tangent_space(p)" ] }, { "cell_type": "code", "execution_count": 150, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tangent vector u at Point p on the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "up = u.at(p) ; print(up)" ] }, { "cell_type": "code", "execution_count": 151, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "u = u_x(1, 2, -1) d/dx + u_y(1, 2, -1) d/dy + u_z(1, 2, -1) d/dz" ] }, "execution_count": 151, "metadata": {}, "output_type": "execute_result" } ], "source": [ "up.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

1-forms

\n", "

A 1-form on $\\mathcal{M}$ is a field of linear forms. For instance, it can be the differential of a scalar field:

" ] }, { "cell_type": "code", "execution_count": 152, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1-form df on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "df = f.differential() ; print(df)" ] }, { "cell_type": "code", "execution_count": 153, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "df = dx + 2*y dy + 3*z^2 dz" ] }, "execution_count": 153, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

In the above writing, the 1-form is expanded over the basis $(\\mathrm{d}x, \\mathrm{d}y, \\mathrm{d}z)$ associated with the chart $(x,y,z)$. This basis can be accessed via the method coframe():

" ] }, { "cell_type": "code", "execution_count": 154, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Coordinate coframe (M, (dx,dy,dz))" ] }, "execution_count": 154, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dX = X.coframe() ; dX" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The list of all coframes defined on a given manifold open subset is returned by the method coframes():

" ] }, { "cell_type": "code", "execution_count": 155, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[Coordinate coframe (M, (dx,dy,dz)),\n", " Coordinate coframe (U, (dx,dy,dz)),\n", " Coordinate coframe (U, (dr,dth,dph))]" ] }, "execution_count": 155, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.coframes()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

As for a vector field, the value of the differential form at some point on the manifold is obtained by the method at():

" ] }, { "cell_type": "code", "execution_count": 156, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Linear form df on the Tangent space at Point p on the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "dfp = df.at(p) ; print(dfp)" ] }, { "cell_type": "code", "execution_count": 157, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "df = dx + 4 dy + 3 dz" ] }, "execution_count": 157, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dfp.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Recall that

" ] }, { "cell_type": "code", "execution_count": 158, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1, 2, -1)" ] }, "execution_count": 158, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p.coord()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The linear form $\\mathrm{d}f|_p$ belongs to the dual of the tangent vector space at $p$:

" ] }, { "cell_type": "code", "execution_count": 159, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Dual of the Tangent space at Point p on the 3-dimensional differentiable manifold M" ] }, "execution_count": 159, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dfp.parent()" ] }, { "cell_type": "code", "execution_count": 160, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 160, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dfp.parent() is M.tangent_space(p).dual()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

As such, it is acting on vectors at $p$, yielding a real number:

" ] }, { "cell_type": "code", "execution_count": 161, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tangent vector v at Point p on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "v = 3 d/dx - d/dy - 2 d/dz" ] }, "execution_count": 161, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(vp) ; vp.display()" ] }, { "cell_type": "code", "execution_count": 162, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-7" ] }, "execution_count": 162, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dfp(vp)" ] }, { "cell_type": "code", "execution_count": 163, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tangent vector u at Point p on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "u = u_x(1, 2, -1) d/dx + u_y(1, 2, -1) d/dy + u_z(1, 2, -1) d/dz" ] }, "execution_count": 163, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(up) ; up.display()" ] }, { "cell_type": "code", "execution_count": 164, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "u_x(1, 2, -1) + 4*u_y(1, 2, -1) + 3*u_z(1, 2, -1)" ] }, "execution_count": 164, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dfp(up)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The differential 1-form of the unspecified scalar field $h$:

" ] }, { "cell_type": "code", "execution_count": 165, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "dh = d(H)/dx dx + d(H)/dy dy + d(H)/dz dz" ] }, "execution_count": 165, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h.display() ; dh = h.differential() ; dh.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A 1-form can also be defined from scratch:

" ] }, { "cell_type": "code", "execution_count": 166, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1-form omega on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "om = U.one_form('omega', r'\\omega') ; print(om)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

It can be specified by providing its components in a given coframe:

" ] }, { "cell_type": "code", "execution_count": 167, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "omega = (x^2 + y^2) dx + z dy + (x - z) dz" ] }, "execution_count": 167, "metadata": {}, "output_type": "execute_result" } ], "source": [ "om[:] = [x^2+y^2, z, x-z] # components in the default coframe (dx,dy,dz)\n", "om.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Of course, one may set the components in a frame different from the default one:

" ] }, { "cell_type": "code", "execution_count": 168, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "omega = r*cos(ph)*sin(th) dr + r*sin(ph)*sin(th) dph" ] }, "execution_count": 168, "metadata": {}, "output_type": "execute_result" } ], "source": [ "om[Y.frame(), :, Y] = [r*sin(th)*cos(ph), 0, r*sin(th)*sin(ph)]\n", "om.display(Y.frame(), Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The components in the coframe $(\\mathrm{d}x,\\mathrm{d}y,\\mathrm{d}z)$ are updated automatically:

" ] }, { "cell_type": "code", "execution_count": 169, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "omega = (x^4 + x^2*y^2 - sqrt(x^2 + y^2 + z^2)*y^2)/(sqrt(x^2 + y^2 + z^2)*(x^2 + y^2)) dx + (x^3*y + x*y^3 + sqrt(x^2 + y^2 + z^2)*x*y)/(sqrt(x^2 + y^2 + z^2)*(x^2 + y^2)) dy + x*z/sqrt(x^2 + y^2 + z^2) dz" ] }, "execution_count": 169, "metadata": {}, "output_type": "execute_result" } ], "source": [ "om.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Let us revert to the values set previously:

" ] }, { "cell_type": "code", "execution_count": 170, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "omega = (x^2 + y^2) dx + z dy + (x - z) dz" ] }, "execution_count": 170, "metadata": {}, "output_type": "execute_result" } ], "source": [ "om[:] = [x^2+y^2, z, x-z]\n", "om.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

This time, the components in the coframe $(\\mathrm{d}r, \\mathrm{d}\\theta,\\mathrm{d}\\phi)$ are those that are updated:

" ] }, { "cell_type": "code", "execution_count": 171, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "omega = (r^2*cos(ph)*sin(th)^3 + r*(cos(ph) + sin(ph))*cos(th)*sin(th) - r*cos(th)^2) dr + (r^2*cos(th)^2*sin(ph) + r^2*cos(th)*sin(th) + (r^3*cos(ph)*cos(th) - r^2*cos(ph))*sin(th)^2) dth + (-r^3*sin(ph)*sin(th)^3 + r^2*cos(ph)*cos(th)*sin(th)) dph" ] }, "execution_count": 171, "metadata": {}, "output_type": "execute_result" } ], "source": [ "om.display(Y.frame(), Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A 1-form acts on vector fields, resulting in a scalar field:

" ] }, { "cell_type": "code", "execution_count": 172, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field omega(v) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "omega(v): U --> R\n", " (x, y, z) |--> -x*y*z^2 + x^2*y + y^3 + x^2 + y^2 + (x^2*y - x)*z\n", " (r, th, ph) |--> -r^2*cos(ph)*cos(th)*sin(th) + (r^4*cos(ph)^2*cos(th)*sin(ph) + r^3*sin(ph))*sin(th)^3 - (r^4*cos(ph)*cos(th)^2*sin(ph) - r^2)*sin(th)^2" ] }, "execution_count": 172, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.display() ; om.display() ; print(om(v)) ; om(v).display()" ] }, { "cell_type": "code", "execution_count": 173, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field df(v) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "df(v): U --> R\n", " (x, y, z) |--> 3*x*y*z^3 - (2*x - 1)*y + 1\n", " (r, th, ph) |--> r*sin(ph)*sin(th) + (3*r^5*cos(ph)*cos(th)^3*sin(ph) - 2*r^2*cos(ph)*sin(ph))*sin(th)^2 + 1" ] }, "execution_count": 173, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.display() ; print(df(v)) ; df(v).display()" ] }, { "cell_type": "code", "execution_count": 174, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "omega(u): U --> R\n", " (x, y, z) |--> x^2*u_x(x, y, z) + y^2*u_x(x, y, z) + z*(u_y(x, y, z) - u_z(x, y, z)) + x*u_z(x, y, z)\n", " (r, th, ph) |--> r^2*sin(th)^2*u_x(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th)) + r*cos(th)*u_y(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th)) + (r*cos(ph)*sin(th) - r*cos(th))*u_z(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th))" ] }, "execution_count": 174, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u.display() ; om(u).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

In the case of a differential 1-form, the following identity holds:

" ] }, { "cell_type": "code", "execution_count": 175, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 175, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df(v) == v(f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

1-forms are Sage element objects, whose parent is the $C^\\infty(U)$-module $\\Lambda^{1}(U)$ of all 1-forms defined on $U$:

" ] }, { "cell_type": "code", "execution_count": 176, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Free module /\\^1(U) of 1-forms on the Open subset U of the 3-dimensional differentiable manifold M" ] }, "execution_count": 176, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.parent()" ] }, { "cell_type": "code", "execution_count": 177, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Free module /\\^1(U) of 1-forms on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "print(df.parent())" ] }, { "cell_type": "code", "execution_count": 178, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Free module /\\^1(U) of 1-forms on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "print(om.parent())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

$\\Lambda^{1}(U)$ is actually the dual of the free module $\\mathcal{X}(U)$:

" ] }, { "cell_type": "code", "execution_count": 179, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 179, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.parent() is v.parent().dual()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Differential forms and exterior calculus

\n", "

The exterior product of two 1-forms is taken via the method wedge() and results in a 2-form:

" ] }, { "cell_type": "code", "execution_count": 180, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2-form omega/\\df on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "omega/\\df = (2*x^2*y + 2*y^3 - z) dx/\\dy + (3*(x^2 + y^2)*z^2 - x + z) dx/\\dz + (3*z^3 - 2*x*y + 2*y*z) dy/\\dz" ] }, "execution_count": 180, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = om.wedge(df) ; print(a) ; a.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A matrix view of the components:

" ] }, { "cell_type": "code", "execution_count": 181, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ 0 2*x^2*y + 2*y^3 - z 3*(x^2 + y^2)*z^2 - x + z]\n", "[ -2*x^2*y - 2*y^3 + z 0 3*z^3 - 2*x*y + 2*y*z]\n", "[-3*(x^2 + y^2)*z^2 + x - z -3*z^3 + 2*x*y - 2*y*z 0]" ] }, "execution_count": 181, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Displaying only the non-vanishing components, skipping the redundant ones (i.e. those that can be deduced by antisymmetry):

" ] }, { "cell_type": "code", "execution_count": 182, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "omega/\\df_xy = 2*x^2*y + 2*y^3 - z \n", "omega/\\df_xz = 3*(x^2 + y^2)*z^2 - x + z \n", "omega/\\df_yz = 3*z^3 - 2*x*y + 2*y*z " ] }, "execution_count": 182, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.display_comp(only_nonredundant=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The 2-form $\\omega\\wedge\\mathrm{d}f$ can be expanded on the $(\\mathrm{d}r,\\mathrm{d}\\theta,\\mathrm{d}\\phi)$ coframe:

" ] }, { "cell_type": "code", "execution_count": 183, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "omega/\\df = (3*r^5*cos(ph)*sin(th)^4 - (3*r^5*cos(ph) - 3*r^4*cos(th)*sin(ph) - 2*r^3*cos(ph)*sin(ph)^2)*sin(th)^2 - (3*r^4*sin(ph) + r^2*cos(ph))*cos(th) - (2*r^3*cos(th)*sin(ph)^2 + (sin(ph)^2 - 1)*r^2)*sin(th)) dr/\\dth + (2*r^4*sin(ph)*sin(th)^5 + (3*r^5*cos(th)^3*sin(ph) + 2*r^3*cos(ph)^2*cos(th)*sin(ph))*sin(th)^3 - (2*r^3*cos(ph)*cos(th)^2*sin(ph) + (cos(ph)*sin(ph) + 1)*r^2*cos(th))*sin(th)^2 - (3*r^4*cos(ph)*cos(th)^4 - r^2*cos(th)^2*sin(ph))*sin(th)) dr/\\dph + (-r^3*cos(th)^2*sin(th) - (3*r^6*cos(th)^2*sin(ph) + 2*r^4*cos(ph)^2*sin(ph) - 2*r^5*cos(th)*sin(ph))*sin(th)^4 + (2*r^4*cos(ph)*cos(th)*sin(ph) + r^3*cos(ph)*sin(ph))*sin(th)^3 + (3*r^5*cos(ph)*cos(th)^3 - r^3*cos(th)*sin(ph))*sin(th)^2) dth/\\dph" ] }, "execution_count": 183, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.display(Y.frame(), Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

As a 2-form, $A:=\\omega\\wedge\\mathrm{d}f$ can be applied to a pair of vectors and is antisymmetric:

" ] }, { "cell_type": "code", "execution_count": 184, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field A(u,v) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "A(u,v): U --> R\n", " (x, y, z) |--> 3*x*y*z^4*u_y(x, y, z) - 2*x^2*y^2*u_y(x, y, z) - 2*y^4*u_y(x, y, z) - 2*(x*u_x(x, y, z) + u_y(x, y, z))*y^3 + 3*(x^3*y*u_x(x, y, z) + x*y^3*u_x(x, y, z) + x*u_z(x, y, z))*z^3 - (3*y^3*u_z(x, y, z) - (2*x*u_y(x, y, z) - 3*u_z(x, y, z))*y^2 + 3*x^2*u_z(x, y, z) + (3*x^2*u_z(x, y, z) - x*u_x(x, y, z))*y)*z^2 - (2*x^3*u_x(x, y, z) + 2*x^2*u_y(x, y, z) + (2*x^2 - x)*u_z(x, y, z))*y - (2*x^2*y^2*u_y(x, y, z) + (x^2*u_x(x, y, z) - (2*x - 1)*u_z(x, y, z) - u_y(x, y, z))*y - x*u_x(x, y, z) - u_y(x, y, z) + u_z(x, y, z))*z + x*u_z(x, y, z)\n", " (r, th, ph) |--> (r^4*cos(ph)*cos(th)^2*sin(ph)*sin(th)^2 + (sin(ph)^3 - sin(ph))*r^4*cos(th)*sin(th)^3 + r^2*cos(ph)*cos(th)*sin(th) + (3*r^7*cos(ph)*cos(th)^3*sin(ph) - 2*r^4*cos(ph)*sin(ph))*sin(th)^4)*u_x(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th)) + (3*r^6*cos(ph)*cos(th)^4*sin(ph)*sin(th)^2 + r^2*cos(th)*sin(ph)*sin(th) + 2*((sin(ph)^4 - sin(ph)^2)*r^5*cos(th) - r^4*sin(ph)^2)*sin(th)^4 + 2*(r^5*cos(ph)*cos(th)^2*sin(ph)^2 - r^3*sin(ph))*sin(th)^3 + r*cos(th))*u_y(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th)) - ((3*r^5*cos(th)^2*sin(ph) - 2*(sin(ph)^3 - sin(ph))*r^3)*sin(th)^3 + (3*r^4*cos(th)^2 - 2*r^3*cos(ph)*cos(th)*sin(ph) - r^2*cos(ph)*sin(ph))*sin(th)^2 + r*cos(th) - (3*r^4*cos(ph)*cos(th)^3 - r^2*cos(th)*sin(ph) + r*cos(ph))*sin(th))*u_z(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th))" ] }, "execution_count": 184, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.set_name('A')\n", "print(a(u,v)) ; a(u,v).display()" ] }, { "cell_type": "code", "execution_count": 185, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 185, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a(u,v) == - a(v,u)" ] }, { "cell_type": "code", "execution_count": 186, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "no symmetry; antisymmetry: (0, 1)\n" ] } ], "source": [ "a.symmetries()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The exterior derivative  of a differential form:

" ] }, { "cell_type": "code", "execution_count": 187, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2-form domega on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "domega = -2*y dx/\\dy + dx/\\dz - dy/\\dz" ] }, "execution_count": 187, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dom = om.exterior_derivative() ; print(dom) ; dom.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Instead of invoking the method exterior_derivative(), one can use the function xder, after having imported it from sage.manifolds.utilities:

" ] }, { "cell_type": "code", "execution_count": 188, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sage.manifolds.utilities import xder\n", "dom = xder(om)" ] }, { "cell_type": "code", "execution_count": 189, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3-form dA on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "dA = (-6*y*z^2 - 2*y - 1) dx/\\dy/\\dz" ] }, "execution_count": 189, "metadata": {}, "output_type": "execute_result" } ], "source": [ "da = xder(a) ; print(da) ; da.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The exterior derivative is nilpotent:

" ] }, { "cell_type": "code", "execution_count": 190, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "ddf = 0" ] }, "execution_count": 190, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ddf = xder(df) ; ddf.display()" ] }, { "cell_type": "code", "execution_count": 191, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "ddomega = 0" ] }, "execution_count": 191, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ddom = xder(dom) ; ddom.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Lie derivative

\n", "

The Lie derivative of any tensor field with respect to a vector field is computed by the method lie_der(), with the vector field as argument:

" ] }, { "cell_type": "code", "execution_count": 192, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1-form on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "(-y*z^2 + (x*y - 1)*z + 2*x) dx + (-x*z^2 + x^2 + y^2 + (x^2 + x*y)*z) dy + (-2*x*y*z + (x^2 + 1)*y + 1) dz" ] }, "execution_count": 192, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lv_om = om.lie_der(v) ; print(lv_om) ; lv_om.display()" ] }, { "cell_type": "code", "execution_count": 193, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1-form on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "(u_x(x, y, z)*d^2(H)/dx^2 + u_y(x, y, z)*d^2(H)/dxdy + u_z(x, y, z)*d^2(H)/dxdz + d(H)/dx*d(u_x)/dx + d(H)/dy*d(u_y)/dx + d(H)/dz*d(u_z)/dx) dx + (u_x(x, y, z)*d^2(H)/dxdy + u_y(x, y, z)*d^2(H)/dy^2 + u_z(x, y, z)*d^2(H)/dydz + d(H)/dx*d(u_x)/dy + d(H)/dy*d(u_y)/dy + d(H)/dz*d(u_z)/dy) dy + (u_x(x, y, z)*d^2(H)/dxdz + u_y(x, y, z)*d^2(H)/dydz + u_z(x, y, z)*d^2(H)/dz^2 + d(H)/dx*d(u_x)/dz + d(H)/dy*d(u_y)/dz + d(H)/dz*d(u_z)/dz) dz" ] }, "execution_count": 193, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lu_dh = dh.lie_der(u) ; print(lu_dh) ; lu_dh.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Let us check Cartan identity on the 1-form $\\omega$:

\n", "

$\\mathcal{L}_v \\omega = v\\cdot \\mathrm{d}\\omega + \\mathrm{d}\\langle \\omega, v\\rangle$

\n", "

and on the 2-form $A$:

\n", "

$\\mathcal{L}_v A = v\\cdot \\mathrm{d}A + \\mathrm{d}(v\\cdot A)$

" ] }, { "cell_type": "code", "execution_count": 194, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 194, "metadata": {}, "output_type": "execute_result" } ], "source": [ "om.lie_der(v) == v.contract(xder(om)) + xder(om(v))" ] }, { "cell_type": "code", "execution_count": 195, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 195, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.lie_der(v) == v.contract(xder(a)) + xder(v.contract(a))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The Lie derivative of a vector field along another one is the commutator of the two vectors fields:

" ] }, { "cell_type": "code", "execution_count": 196, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 196, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.lie_der(u)(f) == u(v(f)) - v(u(f))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Tensor fields of arbitrary rank

\n", "

Up to now, we have encountered tensor fields

\n", "
    \n", "
  • of type (0,0) (i.e. scalar fields),
  • \n", "
  • of type (1,0) (i.e. vector fields),
  • \n", "
  • of type (0,1) (i.e. 1-forms),
  • \n", "
  • of type (0,2) and antisymmetric (i.e. 2-forms).
  • \n", "
\n", "

More generally, tensor fields of any type $(p,q)$ can be introduced in SageManifolds. For instance a tensor field of type (1,2) on the open subset $U$ is declared as follows:

" ] }, { "cell_type": "code", "execution_count": 197, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field T of type (1,2) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "t = U.tensor_field(1, 2, name='T') ; print(t)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

As for vectors or 1-forms, the tensor's components with respect to the domain's default frame are set by means of square brackets:

" ] }, { "cell_type": "code", "execution_count": 198, "metadata": { "collapsed": false }, "outputs": [], "source": [ "t[1,2,1] = 1 + x^2\n", "t[3,2,1] = x*y*z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Unset components are zero:

" ] }, { "cell_type": "code", "execution_count": 199, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "T = (x^2 + 1) d/dx*dy*dx + x*y*z d/dz*dy*dx" ] }, "execution_count": 199, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t.display()" ] }, { "cell_type": "code", "execution_count": 200, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[[[0, 0, 0], [x^2 + 1, 0, 0], [0, 0, 0]],\n", " [[0, 0, 0], [0, 0, 0], [0, 0, 0]],\n", " [[0, 0, 0], [x*y*z, 0, 0], [0, 0, 0]]]" ] }, "execution_count": 200, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Display of the nonzero components:

" ] }, { "cell_type": "code", "execution_count": 201, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "T^x_yx = x^2 + 1 \n", "T^z_yx = x*y*z " ] }, "execution_count": 201, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t.display_comp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Double square brackets return the component (still w.r.t. the default frame) as a scalar field, while single square brackets return the expression of this scalar field in terms of the domain's default coordinates:

" ] }, { "cell_type": "code", "execution_count": 202, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "U --> R\n", "(x, y, z) |--> x^2 + 1\n", "(r, th, ph) |--> r^2*cos(ph)^2*sin(th)^2 + 1" ] }, "execution_count": 202, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(t[[1,2,1]]) ; t[[1,2,1]].display()" ] }, { "cell_type": "code", "execution_count": 203, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x^2 + 1\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "x^2 + 1" ] }, "execution_count": 203, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(t[1,2,1]) ; t[1,2,1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A tensor field of type (1,2) maps a 3-tuple (1-form, vector field, vector field) to a scalar field:

" ] }, { "cell_type": "code", "execution_count": 204, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field T(omega,u,v) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "T(omega,u,v): U --> R\n", " (x, y, z) |--> (x^2 + 1)*y^3*u_y(x, y, z) + (x^2 + 1)*y^2*u_y(x, y, z) - (x*y^2*u_y(x, y, z) + x*y*u_y(x, y, z))*z^2 + (x^4 + x^2)*y*u_y(x, y, z) + (x^2*y^2*u_y(x, y, z) + x^2*y*u_y(x, y, z))*z + (x^4 + x^2)*u_y(x, y, z)\n", " (r, th, ph) |--> (r^5*cos(ph)^2*sin(ph)*sin(th)^5 - ((cos(ph)^4 - cos(ph)^2)*r^5*cos(th) - r^4*cos(ph)^2)*sin(th)^4 + ((cos(ph)^3 - cos(ph))*r^5*cos(th)^2 + r^4*cos(ph)^2*cos(th)*sin(ph) + r^3*sin(ph))*sin(th)^3 - (r^4*cos(ph)*cos(th)^2*sin(ph) - r^2)*sin(th)^2)*u_y(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th))" ] }, "execution_count": 204, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(t(om, u, v)) ; t(om, u, v).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

As for vectors and differential forms, the tensor components can be taken in any frame defined on the manifold:

" ] }, { "cell_type": "code", "execution_count": 205, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "r^2*cos(ph)^4*sin(ph)*sin(th)^5 + (cos(ph)^4 - cos(ph)^2)*r^3*sin(th)^6 - (cos(ph)^4 - cos(ph)^2)*r^3*sin(th)^4 + cos(ph)^2*sin(ph)*sin(th)^3" ] }, "execution_count": 205, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t[Y.frame(), 1,1,1, Y]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Tensor calculus

\n", "

The tensor product $\\otimes$ is denoted by `*`:

" ] }, { "cell_type": "code", "execution_count": 206, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, 2)" ] }, "execution_count": 206, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.tensor_type() ; a.tensor_type()" ] }, { "cell_type": "code", "execution_count": 207, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field v*A of type (1,2) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Tensor field v*A of type (1,2) on the Open subset U of the 3-dimensional differentiable manifold M" ] }, "execution_count": 207, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = v*a ; print(b) ; b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The tensor product preserves the (anti)symmetries: since $A$ is a 2-form, it is antisymmetric with respect to its two arguments (positions 0 and 1); as a result, b is antisymmetric with respect to its last two arguments (positions 1 and 2):

" ] }, { "cell_type": "code", "execution_count": 208, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "no symmetry; antisymmetry: (0, 1)\n" ] } ], "source": [ "a.symmetries()" ] }, { "cell_type": "code", "execution_count": 209, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "no symmetry; antisymmetry: (1, 2)\n" ] } ], "source": [ "b.symmetries()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Standard tensor arithmetics is implemented:

" ] }, { "cell_type": "code", "execution_count": 210, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field of type (1,2) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "s = - t + 2*f* b ; print(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Tensor contractions are dealt with by the methods trace() and contract(): for instance, let us contract the tensor $T$ w.r.t. its first two arguments (positions 0 and 1), i.e. let us form the tensor $c$ of components $c_i = T^k_{\\ \\, k i}$:

" ] }, { "cell_type": "code", "execution_count": 211, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1-form on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "c = t.trace(0,1)\n", "print(c)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

An alternative to the writing trace(0,1) is to use the index notation to denote the contraction: the indices are given in a string inside the [] operator, with '^' in front of the contravariant indices and '_' in front of the covariant ones:

" ] }, { "cell_type": "code", "execution_count": 212, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1-form on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 212, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c1 = t['^k_ki']\n", "print(c1)\n", "c1 == c" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The contraction is performed on the repeated index (here k); the letter denoting the remaining index (here i) is arbitrary:

" ] }, { "cell_type": "code", "execution_count": 213, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 213, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t['^k_kj'] == c" ] }, { "cell_type": "code", "execution_count": 214, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 214, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t['^b_ba'] == c" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

It can even be replaced by a dot:

" ] }, { "cell_type": "code", "execution_count": 215, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 215, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t['^k_k.'] == c" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

LaTeX notations are allowed:

" ] }, { "cell_type": "code", "execution_count": 216, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 216, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t['^{k}_{ki}'] == c" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The contraction $T^i_{\\ j k} v^k$ of the tensor fields $T$ and $v$ is taken as follows (2 refers to the last index position of $T$ and 0 to the only index position of v):

" ] }, { "cell_type": "code", "execution_count": 217, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field of type (1,1) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "tv = t.contract(2, v, 0)\n", "print(tv)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Since 2 corresponds to the last index position of $T$ and 0 to the first index position of $v$, a shortcut for the above is

" ] }, { "cell_type": "code", "execution_count": 218, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field of type (1,1) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "tv1 = t.contract(v)\n", "print(tv1)" ] }, { "cell_type": "code", "execution_count": 219, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 219, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tv1 == tv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Instead of contract(), the index notation, combined with the * operator, can be used to denote the contraction:

" ] }, { "cell_type": "code", "execution_count": 220, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 220, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t['^i_jk']*v['^k'] == tv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The non-repeated indices can be replaced by dots:

" ] }, { "cell_type": "code", "execution_count": 221, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 221, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t['^._.k']*v['^k'] == tv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Metric structures

\n", "

A Riemannian metric on the manifold $\\mathcal{M}$ is declared as follows:

" ] }, { "cell_type": "code", "execution_count": 222, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Riemannian metric g on the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "g = M.riemannian_metric('g')\n", "print(g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

It is a symmetric tensor field of type (0,2):

" ] }, { "cell_type": "code", "execution_count": 223, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Free module T^(0,2)(M) of type-(0,2) tensors fields on the 3-dimensional differentiable manifold M" ] }, "execution_count": 223, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.parent()" ] }, { "cell_type": "code", "execution_count": 224, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Free module T^(0,2)(M) of type-(0,2) tensors fields on the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "print(g.parent())" ] }, { "cell_type": "code", "execution_count": 225, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "symmetry: (0, 1); no antisymmetry\n" ] } ], "source": [ "g.symmetries()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The metric is initialized by its components with respect to some vector frame. For instance, using the default frame of $\\mathcal{M}$:

" ] }, { "cell_type": "code", "execution_count": 226, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g = dx*dx + dy*dy + dz*dz" ] }, "execution_count": 226, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g[1,1], g[2,2], g[3,3] = 1, 1, 1\n", "g.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The components w.r.t. another vector frame are obtained as for any tensor field:

" ] }, { "cell_type": "code", "execution_count": 227, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g = dr*dr + r^2 dth*dth + r^2*sin(th)^2 dph*dph" ] }, "execution_count": 227, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.display(Y.frame(), Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Of course, the metric acts on vector pairs:

" ] }, { "cell_type": "code", "execution_count": 228, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field g(u,v) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "g(u,v): U --> R\n", " (x, y, z) |--> x*y*z*u_z(x, y, z) + y*u_x(x, y, z) - x*u_y(x, y, z) + u_x(x, y, z)\n", " (r, th, ph) |--> r^3*cos(ph)*cos(th)*sin(ph)*sin(th)^2*u_z(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th)) - r*cos(ph)*sin(th)*u_y(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th)) + (r*sin(ph)*sin(th) + 1)*u_x(r*cos(ph)*sin(th), r*sin(ph)*sin(th), r*cos(th))" ] }, "execution_count": 228, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u.display() ; v.display(); print(g(u,v)) ; g(u,v).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The Levi-Civita connection associated to the metric $g$:

" ] }, { "cell_type": "code", "execution_count": 229, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Levi-Civita connection nabla_g associated with the Riemannian metric g on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Levi-Civita connection nabla_g associated with the Riemannian metric g on the 3-dimensional differentiable manifold M" ] }, "execution_count": 229, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nabla = g.connection() \n", "print(nabla) ; nabla" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The Christoffel symbols with respect to the manifold's default coordinates:

" ] }, { "cell_type": "code", "execution_count": 230, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[[[0, 0, 0], [0, 0, 0], [0, 0, 0]],\n", " [[0, 0, 0], [0, 0, 0], [0, 0, 0]],\n", " [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]" ] }, "execution_count": 230, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nabla.coef()[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The Christoffel symbols with respect to the coordinates $(r,\\theta,\\phi)$:

" ] }, { "cell_type": "code", "execution_count": 231, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[[[0, 0, 0], [0, -r, 0], [0, 0, -r*sin(th)^2]],\n", " [[0, 1/r, 0], [1/r, 0, 0], [0, 0, -cos(th)*sin(th)]],\n", " [[0, 0, 1/r], [0, 0, cos(th)/sin(th)], [1/r, cos(th)/sin(th), 0]]]" ] }, "execution_count": 231, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nabla.coef(Y.frame())[:, Y]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A nice view is obtained via the method `display()` (by default, only the nonzero connection coefficients are shown):" ] }, { "cell_type": "code", "execution_count": 232, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Gam^r_th,th = -r \n", "Gam^r_ph,ph = -r*sin(th)^2 \n", "Gam^th_r,th = 1/r \n", "Gam^th_th,r = 1/r \n", "Gam^th_ph,ph = -cos(th)*sin(th) \n", "Gam^ph_r,ph = 1/r \n", "Gam^ph_th,ph = cos(th)/sin(th) \n", "Gam^ph_ph,r = 1/r \n", "Gam^ph_ph,th = cos(th)/sin(th) " ] }, "execution_count": 232, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nabla.display(frame=Y.frame(), chart=Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The connection acting as a covariant derivative:

" ] }, { "cell_type": "code", "execution_count": 233, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field nabla_g(v) of type (1,1) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "nabla_g(v) = d/dx*dy - d/dy*dx + y*z d/dz*dx + x*z d/dz*dy + x*y d/dz*dz" ] }, "execution_count": 233, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nab_v = nabla(v)\n", "print(nab_v) ; nab_v.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Being a Levi-Civita connection, $\\nabla_g$ is torsion.free:

" ] }, { "cell_type": "code", "execution_count": 234, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field of type (1,2) on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 234, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(nabla.torsion()) ; nabla.torsion().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

In the present case, it is also flat:

" ] }, { "cell_type": "code", "execution_count": 235, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field Riem(g) of type (1,3) on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Riem(g) = 0" ] }, "execution_count": 235, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(nabla.riemann()) ; nabla.riemann().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Let us consider a non-flat metric, by changing $g_{rr}$ to $1/(1+r^2)$:

" ] }, { "cell_type": "code", "execution_count": 236, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g = 1/(r^2 + 1) dr*dr + r^2 dth*dth + r^2*sin(th)^2 dph*dph" ] }, "execution_count": 236, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g[Y.frame(), 1,1, Y] = 1/(1+r^2)\n", "g.display(Y.frame(), Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

For convenience, we change the default chart on the domain $U$ to Y=$(U,(r,\\theta,\\phi))$:

" ] }, { "cell_type": "code", "execution_count": 237, "metadata": { "collapsed": false }, "outputs": [], "source": [ "U.set_default_chart(Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

In this way, we do not have to specify Y when asking for coordinate expressions in terms of $(r,\\theta,\\phi)$:

" ] }, { "cell_type": "code", "execution_count": 238, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g = 1/(r^2 + 1) dr*dr + r^2 dth*dth + r^2*sin(th)^2 dph*dph" ] }, "execution_count": 238, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.display(Y.frame())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

We recognize the metric of the hyperbolic space $\\mathbb{H}^3$. Its expression in terms of the chart $(U,(x,y,z))$ is

" ] }, { "cell_type": "code", "execution_count": 239, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g = (y^2 + z^2 + 1)/(x^2 + y^2 + z^2 + 1) dx*dx - x*y/(x^2 + y^2 + z^2 + 1) dx*dy - x*z/(x^2 + y^2 + z^2 + 1) dx*dz - x*y/(x^2 + y^2 + z^2 + 1) dy*dx + (x^2 + z^2 + 1)/(x^2 + y^2 + z^2 + 1) dy*dy - y*z/(x^2 + y^2 + z^2 + 1) dy*dz - x*z/(x^2 + y^2 + z^2 + 1) dz*dx - y*z/(x^2 + y^2 + z^2 + 1) dz*dy + (x^2 + y^2 + 1)/(x^2 + y^2 + z^2 + 1) dz*dz" ] }, "execution_count": 239, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.display(X_U.frame(), X_U)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A matrix view of the components may be more appropriate:

" ] }, { "cell_type": "code", "execution_count": 240, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[(y^2 + z^2 + 1)/(x^2 + y^2 + z^2 + 1) -x*y/(x^2 + y^2 + z^2 + 1) -x*z/(x^2 + y^2 + z^2 + 1)]\n", "[ -x*y/(x^2 + y^2 + z^2 + 1) (x^2 + z^2 + 1)/(x^2 + y^2 + z^2 + 1) -y*z/(x^2 + y^2 + z^2 + 1)]\n", "[ -x*z/(x^2 + y^2 + z^2 + 1) -y*z/(x^2 + y^2 + z^2 + 1) (x^2 + y^2 + 1)/(x^2 + y^2 + z^2 + 1)]" ] }, "execution_count": 240, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g[X_U.frame(), :, X_U]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

We extend these components, a priori defined only on $U$, to the whole manifold $\\mathcal{M}$, by demanding the same coordinate expressions in the frame associated to the chart X=$(\\mathcal{M},(x,y,z))$:

" ] }, { "cell_type": "code", "execution_count": 241, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g = (y^2 + z^2 + 1)/(x^2 + y^2 + z^2 + 1) dx*dx - x*y/(x^2 + y^2 + z^2 + 1) dx*dy - x*z/(x^2 + y^2 + z^2 + 1) dx*dz - x*y/(x^2 + y^2 + z^2 + 1) dy*dx + (x^2 + z^2 + 1)/(x^2 + y^2 + z^2 + 1) dy*dy - y*z/(x^2 + y^2 + z^2 + 1) dy*dz - x*z/(x^2 + y^2 + z^2 + 1) dz*dx - y*z/(x^2 + y^2 + z^2 + 1) dz*dy + (x^2 + y^2 + 1)/(x^2 + y^2 + z^2 + 1) dz*dz" ] }, "execution_count": 241, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.add_comp_by_continuation(X.frame(), U, X)\n", "g.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The Levi-Civita connection is automatically recomputed, after the change in $g$:

" ] }, { "cell_type": "code", "execution_count": 242, "metadata": { "collapsed": false }, "outputs": [], "source": [ "nabla = g.connection()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

In particular, the Christoffel symbols are different:

" ] }, { "cell_type": "code", "execution_count": 243, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Gam^x_xx = -(x*y^2 + x*z^2 + x)/(x^2 + y^2 + z^2 + 1) \n", "Gam^x_xy = x^2*y/(x^2 + y^2 + z^2 + 1) \n", "Gam^x_xz = x^2*z/(x^2 + y^2 + z^2 + 1) \n", "Gam^x_yy = -(x^3 + x*z^2 + x)/(x^2 + y^2 + z^2 + 1) \n", "Gam^x_yz = x*y*z/(x^2 + y^2 + z^2 + 1) \n", "Gam^x_zz = -(x^3 + x*y^2 + x)/(x^2 + y^2 + z^2 + 1) \n", "Gam^y_xx = -(y^3 + y*z^2 + y)/(x^2 + y^2 + z^2 + 1) \n", "Gam^y_xy = x*y^2/(x^2 + y^2 + z^2 + 1) \n", "Gam^y_xz = x*y*z/(x^2 + y^2 + z^2 + 1) \n", "Gam^y_yy = -(y*z^2 + (x^2 + 1)*y)/(x^2 + y^2 + z^2 + 1) \n", "Gam^y_yz = y^2*z/(x^2 + y^2 + z^2 + 1) \n", "Gam^y_zz = -(y^3 + (x^2 + 1)*y)/(x^2 + y^2 + z^2 + 1) \n", "Gam^z_xx = -(z^3 + (y^2 + 1)*z)/(x^2 + y^2 + z^2 + 1) \n", "Gam^z_xy = x*y*z/(x^2 + y^2 + z^2 + 1) \n", "Gam^z_xz = x*z^2/(x^2 + y^2 + z^2 + 1) \n", "Gam^z_yy = -(z^3 + (x^2 + 1)*z)/(x^2 + y^2 + z^2 + 1) \n", "Gam^z_yz = y*z^2/(x^2 + y^2 + z^2 + 1) \n", "Gam^z_zz = -(x^2 + y^2 + 1)*z/(x^2 + y^2 + z^2 + 1) " ] }, "execution_count": 243, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nabla.display(only_nonredundant=True)" ] }, { "cell_type": "code", "execution_count": 244, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Gam^r_r,r = -r/(r^2 + 1) \n", "Gam^r_th,th = -r^3 - r \n", "Gam^r_ph,ph = -(r^3 + r)*sin(th)^2 \n", "Gam^th_r,th = 1/r \n", "Gam^th_ph,ph = -cos(th)*sin(th) \n", "Gam^ph_r,ph = 1/r \n", "Gam^ph_th,ph = cos(th)/sin(th) " ] }, "execution_count": 244, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nabla.display(frame=Y.frame(), chart=Y, only_nonredundant=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The Riemann tensor is now

" ] }, { "cell_type": "code", "execution_count": 245, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field Riem(g) of type (1,3) on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Riem(g) = -r^2 d/dr*dth*dr*dth + r^2 d/dr*dth*dth*dr - r^2*sin(th)^2 d/dr*dph*dr*dph + r^2*sin(th)^2 d/dr*dph*dph*dr + 1/(r^2 + 1) d/dth*dr*dr*dth - 1/(r^2 + 1) d/dth*dr*dth*dr - r^2*sin(th)^2 d/dth*dph*dth*dph + r^2*sin(th)^2 d/dth*dph*dph*dth + 1/(r^2 + 1) d/dph*dr*dr*dph - 1/(r^2 + 1) d/dph*dr*dph*dr + r^2 d/dph*dth*dth*dph - r^2 d/dph*dth*dph*dth" ] }, "execution_count": 245, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Riem = nabla.riemann()\n", "print(Riem) ; Riem.display(Y.frame())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Note that it can be accessed directely via the metric, without any explicit mention of the connection:

" ] }, { "cell_type": "code", "execution_count": 246, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 246, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.riemann() is nabla.riemann()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The Ricci tensor is

" ] }, { "cell_type": "code", "execution_count": 247, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Field of symmetric bilinear forms Ric(g) on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Ric(g) = -2/(r^2 + 1) dr*dr - 2*r^2 dth*dth - 2*r^2*sin(th)^2 dph*dph" ] }, "execution_count": 247, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Ric = g.ricci()\n", "print(Ric) ; Ric.display(Y.frame())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The Weyl tensor is:

" ] }, { "cell_type": "code", "execution_count": 248, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field C(g) of type (1,3) on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "C(g) = 0" ] }, "execution_count": 248, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C = g.weyl()\n", "print(C) ; C.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The Weyl tensor vanishes identically because the dimension of $\\mathcal{M}$ is 3.

\n", "

Finally, the Ricci scalar is

" ] }, { "cell_type": "code", "execution_count": 249, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field r(g) on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "r(g): M --> R\n", " (x, y, z) |--> -6\n", "on U: (r, th, ph) |--> -6" ] }, "execution_count": 249, "metadata": {}, "output_type": "execute_result" } ], "source": [ "R = g.ricci_scalar()\n", "print(R) ; R.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

We recover the fact that $\\mathbb{H}^3$ is a Riemannian manifold of constant negative curvature.

\n", "\n", "

Tensor transformations induced by a metric

\n", "

The most important tensor transformation induced by the metric $g$ is the so-called musical isomorphism, or index raising and index lowering:

" ] }, { "cell_type": "code", "execution_count": 250, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field T of type (1,2) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "print(t)" ] }, { "cell_type": "code", "execution_count": 251, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "T = (r^2*cos(ph)^2*sin(th)^2 + 1) d/dx*dy*dx + r^3*cos(ph)*cos(th)*sin(ph)*sin(th)^2 d/dz*dy*dx" ] }, "execution_count": 251, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t.display()" ] }, { "cell_type": "code", "execution_count": 252, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "T = (x^2 + 1) d/dx*dy*dx + x*y*z d/dz*dy*dx" ] }, "execution_count": 252, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t.display(X_U.frame(), X_U)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Raising the last index of $T$ with $g$:

" ] }, { "cell_type": "code", "execution_count": 253, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field of type (2,1) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "s = t.up(g, 2)\n", "print(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Raising all the covariant indices of $T$ (i.e. those at the positions 1 and 2):

" ] }, { "cell_type": "code", "execution_count": 254, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field of type (3,0) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "s = t.up(g)\n", "print(s)" ] }, { "cell_type": "code", "execution_count": 255, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field of type (0,3) on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "s = t.down(g)\n", "print(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Hodge duality

\n", "

The volume 3-form (Levi-Civita tensor) associated with the metric $g$ is

" ] }, { "cell_type": "code", "execution_count": 256, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3-form eps_g on the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "eps_g = 1/sqrt(x^2 + y^2 + z^2 + 1) dx/\\dy/\\dz" ] }, "execution_count": 256, "metadata": {}, "output_type": "execute_result" } ], "source": [ "epsilon = g.volume_form()\n", "print(epsilon) ; epsilon.display()" ] }, { "cell_type": "code", "execution_count": 257, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "eps_g = r^2*sin(th)/sqrt(r^2 + 1) dr/\\dth/\\dph" ] }, "execution_count": 257, "metadata": {}, "output_type": "execute_result" } ], "source": [ "epsilon.display(Y.frame())" ] }, { "cell_type": "code", "execution_count": 258, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field f on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "f: U --> R\n", " (x, y, z) |--> z^3 + y^2 + x\n", " (r, th, ph) |--> r^3*cos(th)^3 + r^2*sin(ph)^2*sin(th)^2 + r*cos(ph)*sin(th)" ] }, "execution_count": 258, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(f) ; f.display()" ] }, { "cell_type": "code", "execution_count": 259, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3-form *f on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "*f = (r^3*cos(th)^3 + r^2*sin(ph)^2*sin(th)^2 + r*cos(ph)*sin(th))/sqrt(r^2 + 1) dx/\\dy/\\dz" ] }, "execution_count": 259, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sf = f.hodge_dual(g)\n", "print(sf) ; sf.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

We check the classical formula $\\star f = f\\, \\epsilon_g$, or, more precisely, $\\star f = f\\, \\epsilon_g|_U$ (for $f$ is defined on $U$ only):

" ] }, { "cell_type": "code", "execution_count": 260, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 260, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sf == f * epsilon.restrict(U)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The Hodge dual of a 1-form is a 2-form:

" ] }, { "cell_type": "code", "execution_count": 261, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1-form omega on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "omega = r^2*sin(th)^2 dx + r*cos(th) dy + (r*cos(ph)*sin(th) - r*cos(th)) dz" ] }, "execution_count": 261, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(om) ; om.display()" ] }, { "cell_type": "code", "execution_count": 262, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2-form *omega on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "*omega = (r^4*cos(ph)*cos(th)*sin(th)^3 - r^3*cos(th)^3 - r*cos(th) + (r^3*(cos(ph) + sin(ph))*cos(th)^2 + r*cos(ph))*sin(th))/sqrt(r^2 + 1) dx/\\dy - (r^4*cos(ph)*sin(ph)*sin(th)^4 - r^3*cos(th)^2*sin(ph)*sin(th) + (cos(ph)*sin(ph) + sin(ph)^2)*r^3*cos(th)*sin(th)^2 + r*cos(th))/sqrt(r^2 + 1) dx/\\dz + (r^4*cos(ph)^2*sin(th)^4 - r^3*cos(ph)*cos(th)^2*sin(th) + ((cos(ph)^2 + cos(ph)*sin(ph))*r^3*cos(th) + r^2)*sin(th)^2)/sqrt(r^2 + 1) dy/\\dz" ] }, "execution_count": 262, "metadata": {}, "output_type": "execute_result" } ], "source": [ "som = om.hodge_dual(g)\n", "print(som) ; som.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The Hodge dual of a 2-form is a 1-form:

" ] }, { "cell_type": "code", "execution_count": 263, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2-form A on the Open subset U of the 3-dimensional differentiable manifold M\n" ] } ], "source": [ "print(a)" ] }, { "cell_type": "code", "execution_count": 264, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1-form *A on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "*A = (3*r^5*cos(th)^5 + 3*r^3*cos(th)^3 + (3*r^6*cos(ph)*cos(th)^2*sin(ph) - 2*r^5*cos(ph)*cos(th)*sin(ph) - 2*r^4*cos(ph)*sin(ph)^3)*sin(th)^4 + (2*r^4*cos(th)*sin(ph)^3 + (sin(ph)^3 - sin(ph))*r^3)*sin(th)^3 + (3*r^5*cos(th)^3*sin(ph)^2 - 2*r^4*cos(ph)*cos(th)^2*sin(ph) + r^3*cos(ph)*cos(th)*sin(ph) - 2*r^2*cos(ph)*sin(ph))*sin(th)^2 + (2*r^4*cos(th)^3*sin(ph) + r^3*cos(ph)*cos(th)^2 + 2*r^2*cos(th)*sin(ph))*sin(th))/sqrt(r^2 + 1) dx - (r^3*cos(th)^3 - (3*(sin(ph)^2 - 1)*r^6*cos(th)^2 - 2*r^5*cos(th)*sin(ph)^2 - 2*(sin(ph)^4 - sin(ph)^2)*r^4)*sin(th)^4 + (2*r^4*cos(ph)*cos(th)*sin(ph)^2 + (cos(ph)*sin(ph)^2 - cos(ph))*r^3)*sin(th)^3 + (3*r^6*cos(th)^4 + 3*r^5*cos(ph)*cos(th)^3*sin(ph) + 3*r^4*cos(th)^2 - (sin(ph)^2 - 1)*r^3*cos(th))*sin(th)^2 + r*cos(th) - (r^3*(cos(ph) + sin(ph))*cos(th)^2 + r*cos(ph))*sin(th))/sqrt(r^2 + 1) dy + (2*r^5*sin(ph)*sin(th)^5 + (3*r^6*cos(th)^3*sin(ph) + 2*r^4*cos(ph)^2*cos(th)*sin(ph) + 2*r^3*sin(ph))*sin(th)^3 - (2*r^4*cos(ph)*cos(th)^2*sin(ph) + (cos(ph)*sin(ph) + 1)*r^3*cos(th))*sin(th)^2 - r*cos(th) - (3*r^5*cos(ph)*cos(th)^4 - r^3*cos(th)^2*sin(ph))*sin(th))/sqrt(r^2 + 1) dz" ] }, "execution_count": 264, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sa = a.hodge_dual(g)\n", "print(sa) ; sa.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Finally, the Hodge dual of a 3-form is a 0-form:

" ] }, { "cell_type": "code", "execution_count": 265, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3-form dA on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "dA = (-2*(3*r^3*cos(th)^2*sin(ph) + r*sin(ph))*sin(th) - 1) dx/\\dy/\\dz" ] }, "execution_count": 265, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(da) ; da.display()" ] }, { "cell_type": "code", "execution_count": 266, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scalar field *dA on the Open subset U of the 3-dimensional differentiable manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "*dA: U --> R\n", " (x, y, z) |--> -(6*y*z^2 + 2*y + 1)*sqrt(x^2 + y^2 + z^2 + 1)\n", " (r, th, ph) |--> -sqrt(r^2*cos(th)^2 + r^2*sin(th)^2 + 1)*(2*(3*r^3*cos(th)^2*sin(ph) + r*sin(ph))*sin(th) + 1)" ] }, "execution_count": 266, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sda = da.hodge_dual(g)\n", "print(sda) ; sda.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

In dimension 3 and for a Riemannian metric, the Hodge star is idempotent:

" ] }, { "cell_type": "code", "execution_count": 267, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 267, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sf.hodge_dual(g) == f" ] }, { "cell_type": "code", "execution_count": 268, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 268, "metadata": {}, "output_type": "execute_result" } ], "source": [ "som.hodge_dual(g) == om" ] }, { "cell_type": "code", "execution_count": 269, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 269, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sa.hodge_dual(g) == a" ] }, { "cell_type": "code", "execution_count": 270, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 270, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sda.hodge_dual(g) == da" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Getting help

\n", "

To get the list of functions (methods) that can be called on a object, type the name of the object, followed by a dot and the TAB key, e.g.

\n", "

sa.

\n", "

To get information on an object or a method, use the question mark:

" ] }, { "cell_type": "code", "execution_count": 271, "metadata": { "collapsed": false }, "outputs": [], "source": [ "nabla?" ] }, { "cell_type": "code", "execution_count": 272, "metadata": { "collapsed": false }, "outputs": [], "source": [ "g.ricci_scalar?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Using a double question mark leads directly to the Python source code (SageMath and SageManifolds are open source, aren't they ?)

" ] }, { "cell_type": "code", "execution_count": 273, "metadata": { "collapsed": false }, "outputs": [], "source": [ "g.ricci_scalar??" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Going further

\n", "

Have a look at the examples on SageManifolds page, especially the 2-dimensional sphere example for usage on a non-parallelizable manifold (each scalar field has to be defined in at least two coordinate charts, the module $\\mathcal{X}(\\mathcal{M})$ is no longer free and each tensor field has to be defined in at least two vector frames).

" ] } ], "metadata": { "kernelspec": { "display_name": "SageMath 7.4.beta4", "language": "", "name": "sagemath" }, "language": "python", "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 }