{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 16. Exterior derivative\n", "\n", "This notebook is part of the [Introduction to manifolds in SageMath](https://sagemanifolds.obspm.fr/intro_to_manifolds.html) by Andrzej Chrzeszczyk (Jan Kochanowski University of Kielce, Poland)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'SageMath version 9.6, Release Date: 2022-05-15'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "version()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If $(x^1,\\ldots,x^n)$ are local coordinates on a smooth manifold $M$, then from (14.9) we know that for any differential $k$-form on $M$\n", "\n", "$$\\omega=\\sum_{1\\leq i_1<\\ldots\n", "\n", "**Example 16.1**\n", "\n", "Take a 1-form and compute its exterior derivative." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\alpha = a_{0}\\left({x^{0}}, {x^{1}}, {x^{2}}\\right) \\mathrm{d} {x^{0}} + a_{1}\\left({x^{0}}, {x^{1}}, {x^{2}}\\right) \\mathrm{d} {x^{1}} + a_{2}\\left({x^{0}}, {x^{1}}, {x^{2}}\\right) \\mathrm{d} {x^{2}}\\)" ], "text/latex": [ "$\\displaystyle \\alpha = a_{0}\\left({x^{0}}, {x^{1}}, {x^{2}}\\right) \\mathrm{d} {x^{0}} + a_{1}\\left({x^{0}}, {x^{1}}, {x^{2}}\\right) \\mathrm{d} {x^{1}} + a_{2}\\left({x^{0}}, {x^{1}}, {x^{2}}\\right) \\mathrm{d} {x^{2}}$" ], "text/plain": [ "\\alpha = a_0(x0, x1, x2) dx0 + a_1(x0, x1, x2) dx1 + a_2(x0, x1, x2) dx2" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "dim = 3 # dimension of manifold N\n", "N = Manifold(dim, 'N') # manifold N\n", "X = N.chart(' '.join(['x'+str(i)+':x^{'+str(i)+'}' for i in range(dim)])) # chart on N\n", "al = N.diff_form(1, name=r'\\alpha') # 1-form alpha \n", "def astr(i): return 'a_'+str(i) # names of components\n", "af = [N.scalar_field(function(astr(i))(*X), name=astr(i)) \n", " for i in range(dim)] # component functions\n", "al[:] = af # define all components\n", "al.disp() # show al" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use the method `exterior_derivative()` to compute the result:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\mathrm{d}\\alpha = \\left( -\\frac{\\partial\\,a_{0}}{\\partial {x^{1}}} + \\frac{\\partial\\,a_{1}}{\\partial {x^{0}}} \\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{1}} + \\left( -\\frac{\\partial\\,a_{0}}{\\partial {x^{2}}} + \\frac{\\partial\\,a_{2}}{\\partial {x^{0}}} \\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{2}} + \\left( -\\frac{\\partial\\,a_{1}}{\\partial {x^{2}}} + \\frac{\\partial\\,a_{2}}{\\partial {x^{1}}} \\right) \\mathrm{d} {x^{1}}\\wedge \\mathrm{d} {x^{2}}\\)" ], "text/latex": [ "$\\displaystyle \\mathrm{d}\\alpha = \\left( -\\frac{\\partial\\,a_{0}}{\\partial {x^{1}}} + \\frac{\\partial\\,a_{1}}{\\partial {x^{0}}} \\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{1}} + \\left( -\\frac{\\partial\\,a_{0}}{\\partial {x^{2}}} + \\frac{\\partial\\,a_{2}}{\\partial {x^{0}}} \\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{2}} + \\left( -\\frac{\\partial\\,a_{1}}{\\partial {x^{2}}} + \\frac{\\partial\\,a_{2}}{\\partial {x^{1}}} \\right) \\mathrm{d} {x^{1}}\\wedge \\mathrm{d} {x^{2}}$" ], "text/plain": [ "d\\alpha = (-d(a_0)/dx1 + d(a_1)/dx0) dx0∧dx1 + (-d(a_0)/dx2 + d(a_2)/dx0) dx0∧dx2 + (-d(a_1)/dx2 + d(a_2)/dx1) dx1∧dx2" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dal = al.exterior_derivative()\n", "dal.disp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us apply the definition (16.1) for comparison:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\mathrm{d}a_0\\wedge \\mathrm{d} {x^{0}} + \\mathrm{d}a_1\\wedge \\mathrm{d} {x^{1}} + \\mathrm{d}a_2\\wedge \\mathrm{d} {x^{2}} = \\left( -\\frac{\\partial\\,a_{0}}{\\partial {x^{1}}} + \\frac{\\partial\\,a_{1}}{\\partial {x^{0}}} \\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{1}} + \\left( -\\frac{\\partial\\,a_{0}}{\\partial {x^{2}}} + \\frac{\\partial\\,a_{2}}{\\partial {x^{0}}} \\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{2}} + \\left( -\\frac{\\partial\\,a_{1}}{\\partial {x^{2}}} + \\frac{\\partial\\,a_{2}}{\\partial {x^{1}}} \\right) \\mathrm{d} {x^{1}}\\wedge \\mathrm{d} {x^{2}}\\)" ], "text/latex": [ "$\\displaystyle \\mathrm{d}a_0\\wedge \\mathrm{d} {x^{0}} + \\mathrm{d}a_1\\wedge \\mathrm{d} {x^{1}} + \\mathrm{d}a_2\\wedge \\mathrm{d} {x^{2}} = \\left( -\\frac{\\partial\\,a_{0}}{\\partial {x^{1}}} + \\frac{\\partial\\,a_{1}}{\\partial {x^{0}}} \\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{1}} + \\left( -\\frac{\\partial\\,a_{0}}{\\partial {x^{2}}} + \\frac{\\partial\\,a_{2}}{\\partial {x^{0}}} \\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{2}} + \\left( -\\frac{\\partial\\,a_{1}}{\\partial {x^{2}}} + \\frac{\\partial\\,a_{2}}{\\partial {x^{1}}} \\right) \\mathrm{d} {x^{1}}\\wedge \\mathrm{d} {x^{2}}$" ], "text/plain": [ "da_0∧dx0+da_1∧dx1+da_2∧dx2 = (-d(a_0)/dx1 + d(a_1)/dx0) dx0∧dx1 + (-d(a_0)/dx2 + d(a_2)/dx0) dx0∧dx2 + (-d(a_1)/dx2 + d(a_2)/dx1) dx1∧dx2" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# continuation\n", "dx = X.coframe() # (dx0,dx1,dx2)\n", " # apply the formula (16.1):\n", "s = sum([(af[i]).differential().wedge(dx[i]) for i in range(dim)])\n", "# SageMath automatically displays the wedge products \n", "# with increasing indices of variables\n", "s.disp() # show the result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that for example (since $dx^i\\wedge dx^i=0$) \n", "\n", "$$da_0\\wedge dx^0=(\\frac{\\partial a_0}{\\partial x^0}dx^0+\\frac{\\partial a_0}{\\partial x^1}dx^1+\\frac{\\partial a_0}{\\partial x^2}dx^2)\\wedge dx^0\\\\\n", "=\\frac{\\partial a_0}{\\partial x^1}dx^1\\wedge dx^0+\n", "\\frac{\\partial a_0}{\\partial x^2}dx^2\\wedge dx^0\n", "=-\\frac{\\partial a_0}{\\partial x^1}dx^0\\wedge dx^1\n", "-\\frac{\\partial a_0}{\\partial x^2}dx^0\\wedge dx^2,\n", "$$\n", "\n", "and analogously for the remaining terms (in $\\ \\ da_2\\wedge dx^2\\ \\ $ there is no need of reordering the terms).\n", "\n", "
\n", "\n", "**Example 16.2**\n", "\n", "Consider now a 2-form and its exterior differential." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle a = a_{01}\\left({x^{0}}, {x^{1}}, {x^{2}}\\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{1}} + a_{02}\\left({x^{0}}, {x^{1}}, {x^{2}}\\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{2}} + a_{12}\\left({x^{0}}, {x^{1}}, {x^{2}}\\right) \\mathrm{d} {x^{1}}\\wedge \\mathrm{d} {x^{2}}\\)" ], "text/latex": [ "$\\displaystyle a = a_{01}\\left({x^{0}}, {x^{1}}, {x^{2}}\\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{1}} + a_{02}\\left({x^{0}}, {x^{1}}, {x^{2}}\\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{2}} + a_{12}\\left({x^{0}}, {x^{1}}, {x^{2}}\\right) \\mathrm{d} {x^{1}}\\wedge \\mathrm{d} {x^{2}}$" ], "text/plain": [ "a = a01(x0, x1, x2) dx0∧dx1 + a02(x0, x1, x2) dx0∧dx2 + a12(x0, x1, x2) dx1∧dx2" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "N=3 # dimension of the manifold M\n", "M = Manifold(N, 'M') # manifold M\n", "X = M.chart(' '.join(['x'+str(i)+':x^{'+str(i)+'}' for i in range(N)])) # chart on M\n", "a = M.diff_form(2, name='a') # 2-form a\n", " # components of the 2-form a:\n", "x0, x1, x2 = X[:] # coordinates x^0, x^1, x^2 of chart X as the Python variables x0, x1, x2\n", "a01 = M.scalar_field(function('a01')(x0,x1,x2), name='a01')\n", "a02 = M.scalar_field(function('a02')(x0,x1,x2), name='a02')\n", "a12 = M.scalar_field(function('a12')(x0,x1,x2), name='a12')\n", "a[0,1] = a01; a[0,2] = a02 # define components of a\n", "a[1,2] = a12 # (up.triangle of comp.matr.)\n", "a.disp() # show a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The exterior derivative:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\mathrm{d}a = \\left( \\frac{\\partial\\,a_{01}}{\\partial {x^{2}}} - \\frac{\\partial\\,a_{02}}{\\partial {x^{1}}} + \\frac{\\partial\\,a_{12}}{\\partial {x^{0}}} \\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{1}}\\wedge \\mathrm{d} {x^{2}}\\)" ], "text/latex": [ "$\\displaystyle \\mathrm{d}a = \\left( \\frac{\\partial\\,a_{01}}{\\partial {x^{2}}} - \\frac{\\partial\\,a_{02}}{\\partial {x^{1}}} + \\frac{\\partial\\,a_{12}}{\\partial {x^{0}}} \\right) \\mathrm{d} {x^{0}}\\wedge \\mathrm{d} {x^{1}}\\wedge \\mathrm{d} {x^{2}}$" ], "text/plain": [ "da = (d(a01)/dx2 - d(a02)/dx1 + d(a12)/dx0) dx0∧dx1∧dx2" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.exterior_derivative().disp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case for each differential $da_{ij}$ only one term of the form $\\frac{\\partial a_{ij}}{\\partial x^i}dx^i$ (no summation) gives a nonzero contribution to the final result. For example, for the second term of $a$ we have \n", "\n", "$$da_{02}\\wedge dx^0\\wedge dx^2=\\Big(\\frac{\\partial a_{02}}{\\partial x^0}dx^0+\\frac{\\partial a_{02}}{\\partial x^1}dx^1+\\frac{\\partial a_{02}}{\\partial x^2}dx^2\\Big)dx^0\\wedge dx^2\\\\\n", "=\\frac{\\partial a_{02}}{\\partial x^1}dx^1\\wedge dx^0\\wedge dx^2\n", "=-\\frac{\\partial a_{02}}{\\partial x^1}dx^0\\wedge dx^1\\wedge dx^2.\n", "$$\n", "\n", "The calculations for the remaining terms are analogous." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Exterior derivative is antiderivation\n", "\n", "
\n", "\n", "\\begin{equation}\n", "d(ω ∧ η) = dω ∧ η + (−1)^k ω ∧ dη,\n", "\\label{}\\tag{16.2}\n", "\\end{equation}\n", "\n", "for $\\omega\\in\\Omega^k(M)$ and $\\eta \\in\\Omega^m(M)$.\n", "\n", "\n", "Using the linearity of the operation $d$, it is enough to prove the antiderivation property for single terms\n", " $ω = ω_{i_1 ...i_k} dx^{i_1} ∧ · · · ∧ dx^{i_k}$ and\n", "$η = η_{j_1 ... j_m }dx^{j_1} ∧· · · ∧ dx^{j_m}$ (no summation here). From (16.1) and (13.4) we obtain\n", "\n", "$$\n", "d(ω ∧ η) = d( ω_{i_1 ...i_k} η_{j_1 ... j_m} dx^{i_1} ∧ · · · ∧ dx^{i_k} ∧ dx^{j_1} ∧ · · · ∧ dx^{j_m})\\\\\n", "= d(ω_{i_1 ...i_k} η_{j_1 ... j_m} ) ∧ dx^{i_1} ∧ · · · ∧ dx^{i_k} ∧ dx^{j_1} ∧ · · · ∧ dx^{j_m}\\\\\n", "=[(dω_{i_1 ...i_k} )η_{j_1 ... j_m} + ω_{i_1 ...i_k} dη_{j_1 ... j_m}] ∧ dx^{i_1} ∧ · · · ∧ dx^{i_k} ∧ dx^{j_1} ∧ · · · ∧ dx^{j_m}\\\\\n", "=(dω_{i_1 ...i_k} ∧ dx^{i_1} ∧ · · · ∧ dx^{i_k} ) ∧ (η_{j_1 ... j_m} dx^{j_1} ∧ · · · ∧ dx^{j_m} )\\\\\n", "+(−1)^k (ω_{i_1 ...i_k} dx^{i_1} ∧ · · · ∧ dx^{i_k} ) ∧ (dη_{j_1 ... j_m} ∧ dx^{j_1} ∧ · · · ∧ dx^{j_m}) \\\\\n", "= dω ∧ η + (−1)^k ω ∧ dη.\n", "$$\n", "We have proved (16.2).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Exterior derivative is nilpotent\n", "\n", "
\n", "\n", "\\begin{equation}\n", "d^2\\eta=d(d\\eta)=0.\n", "\\label{}\\tag{16.3}\n", "\\end{equation}\n", "\n", "Again, it is enough to consider forms \n", "$\\eta= η_{i_1 ...i_m} ∧ dx^{i_1} ∧ · · · ∧ dx^{i_m}$ (no summation here).\n", "If $ω = dη$ with $η ∈ \\Omega^m (M)$, we have\n", "$$ω = dη_{i_1 ...i_m} ∧ dx^{i_1} ∧ · · · ∧ dx^{i_m} =\n", "\\Big(\\frac{\\partial}{\\partial x^j}η_{i_1 ...i_m}\\Big)dx^j ∧ dx^{i_1} ∧ · · · ∧ dx^{i_m}.$$\n", "
\n", "Computing the exterior derivative of $\\omega$ we obtain\n", "$$d\\omega=d\\Big(\\frac{\\partial}{\\partial x^j}η_{i_1 ...i_m}\\Big)dx^j ∧ dx^{i_1} ∧ · · · ∧ dx^{i_m}\\\\\n", "=\\Big(\\frac{\\partial}{\\partial x^p}\\frac{\\partial}{\\partial x^j}η_{i_1 ...i_m}\\Big)dx^p\\wedge dx^j ∧ dx^{i_1} ∧ · · · ∧ dx^{i_m}.\n", "$$\n", "In the last sum if $p = j$, then $dx^p ∧ dx^j = 0,$ if $p\\not= j$, then $\\frac{∂^2 f }{ ∂ x^p ∂ x^j}$ is symmetric in $p$\n", "and $j$, but $dx^p ∧ dx^j$ is alternating in $p$ and $j$, so the terms with $p \\not= j$ pair up and cancel\n", "each other. For example\n", "$$\\frac{∂^2 \\eta_{...} }{ ∂ x^1 ∂ x^2}dx^1\\wedge dx^2\n", "+\\frac{∂^2 \\eta_{...} }{ ∂ x^2 ∂ x^1}dx^2\\wedge dx^1\\\\\n", "=\\frac{∂^2 \\eta_{...} }{ ∂ x^1 ∂ x^2}dx^1\\wedge dx^2+\n", "\\frac{∂^2 \\eta_{...} }{ ∂ x^1 ∂ x^2}(-dx^1\\wedge dx^2)=0.$$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Pullback and wedge product\n", "\n", "
\n", "\n", "\\begin{equation}\n", "ψ^∗ (ω ∧ η) = (ψ^∗ ω) ∧ (ψ^∗ η),\n", "\\label{}\\tag{16.4}\n", "\\end{equation}\n", "\n", "for $\\omega\\in\\Omega^k(N),\\ \\eta\\in\\Omega^m(N)$ and a smooth map $\\psi:M\\to N.$\n", "\n", "In fact, we have\n", "\n", "$$\\psi^*(\\omega\\wedge\\eta)(v_1,\\ldots,v_{k+m})=\n", "\\omega\\wedge\\eta(d\\psi(v_1),\\ldots,d\\psi(v_{k+m}))\\\\\n", "=\\frac{(k+m)!}{k!m!}\\mathrm{Alt}(\\omega\\otimes\\eta)(d\\psi(v_1),\\ldots,d\\psi(v_{k+m}))\\\\\n", "=\\frac{1}{k!m!}\\sum_{\\sigma\\in S_{k+m}}\\mathrm{sign}\\,\\sigma\\,\n", "\\omega(d\\psi(v_{\\sigma(1)},\\ldots,d\\psi(v_{\\sigma(k)})\\eta(d\\psi(v_{\\sigma(k+1)}),\\ldots,d\\psi(v_{\\sigma(k+m)}))\\\\\n", "=\\frac{1}{k!m!}\\sum_{\\sigma\\in S_{k+m}}\\mathrm{sign}\\,\\sigma\\,\n", "\\psi^*\\omega(v_{\\sigma(1)},\\ldots,v_{\\sigma(k)}\\psi^*\\eta(v_{\\sigma(k+1)},\\ldots,v_{\\sigma(k+m)})\\\\\n", "=\\frac{(k+m)!}{k!m!}\\mathrm{Alt}((\\psi^*\\omega)\\otimes(\\psi^*\\eta))(v_1,\\ldots,v_{k+m})\\\\\n", "=(\\psi^*(\\omega))\\wedge(\\psi^*(\\eta))(v_1,\\ldots,v_{k+m}).\n", "$$\n", "\n", "We have checked (16.4).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Pullback and exterior derivative\n", "\n", "
\n", "\n", "Using the relation between the differential of a scalar function and the pullback (cf. (15.2)) one can check that for $\\omega\\in\\Omega^k(N)$ of the special form $\\ \\omega=ω_{i_1 ...i_k}dy^{i_1}\\wedge\\ldots\\wedge dy^{i_k}\\ $ (no summation) and a smooth map $\\psi:M\\to N$\n", "\n", "$$ \n", "ψ^∗ (dω) = \n", "\\psi^*(d\\omega_{i_1...i_k}\\wedge dy^{i_1}\\wedge ...dy^{i_k})\\\\\n", "=\\psi^*(d\\omega_{i_1...i_k})\\wedge \\psi^*(dy^{i_1})...\n", "\\wedge\\psi^*(dy^{i_k})\\\\\n", "=d(ψ^∗ ω_{i_1 ...i_k} ) ∧ d(ψ^∗ y^{i_1} ) ∧ · · · ∧d(ψ^*y^{ i_k} )\\\\\n", "= d [(ψ^∗ ω_{i_1 ...i_k} ) d(ψ^∗ y^{i_1} ) ∧ · · · ∧ d(ψ^∗ y^{i_k} )]\\\\\n", "= d[ (ψ^∗ ω_{i_1 ...i_k} )ψ^∗ (dy^{i_1} ) ∧ · · · ∧ ψ^∗ (dy^{i_k} )]\\\\\n", "= d [ψ^∗ (ω_{ i_1 ...i_k} dy^{i_1} ∧ · · · ∧ dy^{i_k} )]\n", "= d(ψ^∗ ω).\n", "$$\n", "\n", "Due to linearity, we have proved\n", "\\begin{equation}\n", "ψ^∗ (dω) = d(ψ^∗ ω),\\quad\n", "\\mathrm{for}\\quad ω ∈ \\Omega^k (N ).\n", "\\label{}\\tag{16.5}\n", "\\end{equation}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 16.3**\n", "\n", "Compute the pullback of $\\ \\alpha=dx\\wedge dy\\ \\ $ under the map\n", "$\\Phi: R_{r,\\phi}\\to R^2_{x,y},$ $\\Phi(r,\\phi)=(r\\cos\\phi,r\\sin\\phi)$." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\alpha = \\mathrm{d} x\\wedge \\mathrm{d} y\\)" ], "text/latex": [ "$\\displaystyle \\alpha = \\mathrm{d} x\\wedge \\mathrm{d} y$" ], "text/plain": [ "\\alpha = dx∧dy" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(2, 'R^2') # manifold M\n", "c_xy. = M.chart() # Cartesian coordinates on M\n", "N = Manifold(2, 'R^2p') # manifold N\n", "c_rp.=N.chart() # polar coordinates on N\n", "Phi = N.diff_map(M, (r*cos(phi), r*sin(phi)), name=r'\\Phi') # N-> M\n", "alpha = M.diff_form(2,r'\\alpha') # 2-form alpha on M \n", "alpha[0,1] = 1 # only one nonzero comp. of alpha\n", "alpha.disp() # show alpha" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pullback of $\\alpha$:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle {\\Phi}^*\\alpha = r \\mathrm{d} r\\wedge \\mathrm{d} \\phi\\)" ], "text/latex": [ "$\\displaystyle {\\Phi}^*\\alpha = r \\mathrm{d} r\\wedge \\mathrm{d} \\phi$" ], "text/plain": [ "\\Phi^*(\\alpha) = r dr∧dphi" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plb = Phi.pullback(alpha) # pullback of alpha\n", "plb.display() # show pullback" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "According to the remark after formula (15.6) one can check that if we replace $ \\ x\\ $ by $\\ \\ r\\cos\\phi\\ \\ $ and $\\ \\ y\\ \\ $ by $\\ \\ r\\sin\\phi\\ \\ $ in $dx\\wedge dy\\ \\ $ and compute the differentials (w.r.t $(r,\\phi)$) of the obtained functions, then we get \n", "\n", "$$d(r\\cos\\phi)\\wedge d(r\\sin\\phi)=(\\frac{\\partial (r\\cos\\phi)}{\\partial r}dr+ \n", "\\frac{\\partial (r\\cos\\phi)}{\\partial \\phi}d\\phi)\\wedge\n", "(\\frac{\\partial (r\\sin\\phi)}{\\partial r}dr+ \n", "\\frac{\\partial (r\\sin\\phi)}{\\partial \\phi}d\\phi)\\\\\n", "=(\\cos\\phi dr-r\\sin\\phi d\\phi)\\wedge\n", "(\\sin\\phi dr+r\\cos\\phi d\\phi)=\\\\\\\\\n", "r\\cos^2\\phi dr\\wedge d\\phi -r\\sin^2\\phi d\\phi\\wedge dr\n", "=\n", "r(\\cos^2\\phi+\\sin^2\\phi)dr\\wedge d\\phi =rdr\\wedge d\\phi.$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 16.4**\n", "\n", "Compute the pullback of $\\ \\alpha=dx\\wedge dy\\wedge dz\\ \\ $ under the map $\\Phi: R^3_{r,\\phi,\\theta}\\to R^3_{x,y,z}$,\n", "$\\ \\ \\Phi(r,\\phi,\\theta)=(r\\cos\\phi\\sin\\theta,r\\sin\\phi\\sin\\theta,r\\cos\\theta).$" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\alpha = \\mathrm{d} x\\wedge \\mathrm{d} y\\wedge \\mathrm{d} z\\)" ], "text/latex": [ "$\\displaystyle \\alpha = \\mathrm{d} x\\wedge \\mathrm{d} y\\wedge \\mathrm{d} z$" ], "text/plain": [ "\\alpha = dx∧dy∧dz" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(3, 'R^3') # manifold M=R^3 (Cart. coord.)\n", "c_xyz. = M.chart() # Cartesian coordinates on M\n", "N = Manifold(3, 'R^3p') # manifold N=R^3 (spher.coord.)\n", "c_rpt.=N.chart() # spherical coordinates on N\n", "Phi = N.diff_map(M, (r*cos(phi)*sin(theta), # Phi N -> M\n", " r*sin(phi)*sin(theta),\n", " r*cos(theta)),name=r'\\Phi')\n", "alpha = M.diff_form(3,r'\\alpha') # 3-form alpha on M \n", "alpha[0,1,2] = 1 # only one nonzero comp. of alpha\n", "alpha.disp() # show alpha" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pullback of $\\alpha$ under $\\Phi$:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle {\\Phi}^*\\alpha = r^{2} \\sin\\left(\\theta\\right) \\mathrm{d} r\\wedge \\mathrm{d} \\theta\\wedge \\mathrm{d} \\phi\\)" ], "text/latex": [ "$\\displaystyle {\\Phi}^*\\alpha = r^{2} \\sin\\left(\\theta\\right) \\mathrm{d} r\\wedge \\mathrm{d} \\theta\\wedge \\mathrm{d} \\phi$" ], "text/plain": [ "\\Phi^*(\\alpha) = r^2*sin(theta) dr∧dtheta∧dphi" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plb = Phi.pullback(alpha) # pullback of alpha\n", "plb.display() # show pullback" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "**Example 16.5**\n", "\n", "Compute $\\Phi^*\\alpha\\ \\ $ for $\\Phi:R\\to R^2,\\ \\ \\Phi(t)=(\\cos(t),\\sin(t))\\ $ and $ \\ \\alpha=\n", "\\frac{-y}{x^2+y^2}dx+\\frac{x}{x^2+y^2}dy$." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\alpha = \\left( -\\frac{y}{x^{2} + y^{2}} \\right) \\mathrm{d} x + \\left( \\frac{x}{x^{2} + y^{2}} \\right) \\mathrm{d} y\\)" ], "text/latex": [ "$\\displaystyle \\alpha = \\left( -\\frac{y}{x^{2} + y^{2}} \\right) \\mathrm{d} x + \\left( \\frac{x}{x^{2} + y^{2}} \\right) \\mathrm{d} y$" ], "text/plain": [ "\\alpha = -y/(x^2 + y^2) dx + x/(x^2 + y^2) dy" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M = Manifold(2, 'R^2') # manifold M= R^2\n", "c_xy. = M.chart() # Cartesian coordinates on M\n", "N = Manifold(1, 'R^1') # manifold N=R^1\n", "c_t. = N.chart() # coordinate t\n", "Phi = N.diff_map(M, (cos(t), sin(t)), name=r'\\Phi') # Phi: N -> M\n", "alpha = M.diff_form(1,r'\\alpha') # 1-form alpha on M\n", "alpha[:] = -y/(x^2+y^2), x/(x^2+y^2) # components of alpha\n", "alpha.disp() # show alpha" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pullback $\\ \\Phi^*\\alpha\\ \\ $" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle {\\Phi}^*\\alpha = \\mathrm{d} t\\)" ], "text/latex": [ "$\\displaystyle {\\Phi}^*\\alpha = \\mathrm{d} t$" ], "text/plain": [ "\\Phi^*(\\alpha) = dt" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plb = Phi.pullback(alpha) # pullback Phi^*alpha\n", "plb.apply_map(factor) # factor all components\n", "plb.display() # show the result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 16.6**\n", "\n", "Compute the pullback of $\\ \\ \\alpha=a_0(x,y)dx+a_1(x,y)dy\\ \\ $ under the map $\\ \\psi:R^2_{u,v}\\to R^2_{x,y},$ \n", "$\\ \\psi(u,v)=(\\psi_1(u,v),\\psi_2(u,v)).$ " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\alpha = a_{0}\\left(x, y\\right) \\mathrm{d} x + a_{1}\\left(x, y\\right) \\mathrm{d} y\\)" ], "text/latex": [ "$\\displaystyle \\alpha = a_{0}\\left(x, y\\right) \\mathrm{d} x + a_{1}\\left(x, y\\right) \\mathrm{d} y$" ], "text/plain": [ "\\alpha = a0(x, y) dx + a1(x, y) dy" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(2, r'R^2_{uv}') # manifold M=R^2_uv\n", "c_uv.=M.chart() # coordinates u,v\n", "N = Manifold(2, r'R^2_{xy}') # manifold N=R^2_xy\n", "c_xy. = N.chart() # Cartesian coord. on N\n", "psi1 = M.scalar_field(function('psi1')(u,v), name=r'\\psi1') # first comp. of psi\n", "psi2 = M.scalar_field(function('psi2')(u,v), name=r'\\psi2') # second comp. of psi\n", "psi = M.diff_map(N,(psi1.expr(),psi2.expr()), name=r'\\psi') # psi: M -> N\n", "al = N.diff_form(1,name=r'\\alpha') # 1-form on N\n", "astr = ['a'+str(i) for i in range(2)] # names of components of al\n", " # component functions:\n", "af = [N.scalar_field(function(astr[i])(x,y), name=astr[i]) for i in range(2)]\n", "al[:] = af # define all components\n", "al.disp() # show al" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pullback $\\ \\ \\psi^*\\alpha$:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle {\\psi}^*\\alpha = \\left( a_{0}\\left(\\psi_{1}\\left(u, v\\right), \\psi_{2}\\left(u, v\\right)\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} + a_{1}\\left(\\psi_{1}\\left(u, v\\right), \\psi_{2}\\left(u, v\\right)\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial u} \\right) \\mathrm{d} u + \\left( a_{0}\\left(\\psi_{1}\\left(u, v\\right), \\psi_{2}\\left(u, v\\right)\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial v} + a_{1}\\left(\\psi_{1}\\left(u, v\\right), \\psi_{2}\\left(u, v\\right)\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\right) \\mathrm{d} v\\)" ], "text/latex": [ "$\\displaystyle {\\psi}^*\\alpha = \\left( a_{0}\\left(\\psi_{1}\\left(u, v\\right), \\psi_{2}\\left(u, v\\right)\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} + a_{1}\\left(\\psi_{1}\\left(u, v\\right), \\psi_{2}\\left(u, v\\right)\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial u} \\right) \\mathrm{d} u + \\left( a_{0}\\left(\\psi_{1}\\left(u, v\\right), \\psi_{2}\\left(u, v\\right)\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial v} + a_{1}\\left(\\psi_{1}\\left(u, v\\right), \\psi_{2}\\left(u, v\\right)\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\right) \\mathrm{d} v$" ], "text/plain": [ "\\psi^*(\\alpha) = (a0(psi1(u, v), psi2(u, v))*d(psi1)/du + a1(psi1(u, v), psi2(u, v))*d(psi2)/du) du + (a0(psi1(u, v), psi2(u, v))*d(psi1)/dv + a1(psi1(u, v), psi2(u, v))*d(psi2)/dv) dv" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alplb = psi.pullback(al) # pullback of al\n", "alplb.disp() # show pullback" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 16.7**\n", "\n", "For $\\ \\psi\\ \\ $ as above compute $\\ \\ \\psi^*(dx\\wedge dy)$." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\beta = \\mathrm{d} x\\wedge \\mathrm{d} y\\)" ], "text/latex": [ "$\\displaystyle \\beta = \\mathrm{d} x\\wedge \\mathrm{d} y$" ], "text/plain": [ "\\beta = dx∧dy" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# continuation\n", "beta = N.diff_form(2, r'\\beta') # 2-form beta on N\n", "beta[0,1] = 1 # only one nonzero component\n", "beta.disp() # show beta" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\ \\ \\psi^*(dx\\wedge dy)$:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle {\\psi}^*\\beta = \\left( -\\frac{\\partial\\,\\psi_{1}}{\\partial v} \\frac{\\partial\\,\\psi_{2}}{\\partial u} + \\frac{\\partial\\,\\psi_{1}}{\\partial u} \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\right) \\mathrm{d} u\\wedge \\mathrm{d} v\\)" ], "text/latex": [ "$\\displaystyle {\\psi}^*\\beta = \\left( -\\frac{\\partial\\,\\psi_{1}}{\\partial v} \\frac{\\partial\\,\\psi_{2}}{\\partial u} + \\frac{\\partial\\,\\psi_{1}}{\\partial u} \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\right) \\mathrm{d} u\\wedge \\mathrm{d} v$" ], "text/plain": [ "\\psi^*(\\beta) = (-d(psi1)/dv*d(psi2)/du + d(psi1)/du*d(psi2)/dv) du∧dv" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "betaplb = psi.pullback(beta) # pullback psi^*beta\n", "betaplb.disp() # show pullback" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the unique component of the obtained pullback is the determinant of the Jacobian matrix\n", "$\n", "\\left(\\begin{matrix}\n", "\\frac{\\partial \\psi_1}{\\partial u} & \\frac{\\partial \\psi_1}{\\partial v}\\\\\n", "\\frac{\\partial \\psi_2}{\\partial u} & \\frac{\\partial \\psi_2}{\\partial v}\n", "\\end{matrix}\n", "\\right).\n", "$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 16.8**\n", "\n", "For the map $\\psi:R^3_{u,v,w}\\to R^3_{x,y,z}$, defined by $\\ \\psi(u,v,w)=(\\psi_1(u,v,w),\\psi_2(u,v,w),\\psi_3(u,v,w))\\ \\ $ compute\n", "$\\ \\psi^*(dx\\wedge dy\\wedge dz).$" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\beta = \\mathrm{d} x\\wedge \\mathrm{d} y\\wedge \\mathrm{d} z\\)" ], "text/latex": [ "$\\displaystyle \\beta = \\mathrm{d} x\\wedge \\mathrm{d} y\\wedge \\mathrm{d} z$" ], "text/plain": [ "\\beta = dx∧dy∧dz" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(3, r'R^3_{uvw}') # manifold M=R^3_uvw\n", "c_uvw.=M.chart() # coordinates on M\n", "N = Manifold(3, r'R^3_{xyz}') # manifold N=R^3_xyz \n", "c_xy. = N.chart() # Cartesian coord on N\n", "psi1 = M.scalar_field(function('psi1')(u,v,w), name=r'\\psi1') # first component of psi\n", "psi2 = M.scalar_field(function('psi2')(u,v,w), name=r'\\psi2') # second component of psi\n", "psi3 = M.scalar_field(function('psi3')(u,v,w), name=r'\\psi3') # third component of psi\n", "psi = M.diff_map(N,(psi1.expr(),psi2.expr(),psi3.expr()) ,name=r'\\psi') # psi: M->N\n", "beta = N.diff_form(3,r'\\beta') # 3-form beta on N\n", "beta[0,1,2] = 1 # only one nonzero component of beta \n", "beta.disp() # show beta" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle {\\psi}^*\\beta = \\left( -{\\left(\\frac{\\partial\\,\\psi_{1}}{\\partial w} \\frac{\\partial\\,\\psi_{2}}{\\partial v} - \\frac{\\partial\\,\\psi_{1}}{\\partial v} \\frac{\\partial\\,\\psi_{2}}{\\partial w}\\right)} \\frac{\\partial\\,\\psi_{3}}{\\partial u} + {\\left(\\frac{\\partial\\,\\psi_{1}}{\\partial w} \\frac{\\partial\\,\\psi_{2}}{\\partial u} - \\frac{\\partial\\,\\psi_{1}}{\\partial u} \\frac{\\partial\\,\\psi_{2}}{\\partial w}\\right)} \\frac{\\partial\\,\\psi_{3}}{\\partial v} - {\\left(\\frac{\\partial\\,\\psi_{1}}{\\partial v} \\frac{\\partial\\,\\psi_{2}}{\\partial u} - \\frac{\\partial\\,\\psi_{1}}{\\partial u} \\frac{\\partial\\,\\psi_{2}}{\\partial v}\\right)} \\frac{\\partial\\,\\psi_{3}}{\\partial w} \\right) \\mathrm{d} u\\wedge \\mathrm{d} v\\wedge \\mathrm{d} w\\)" ], "text/latex": [ "$\\displaystyle {\\psi}^*\\beta = \\left( -{\\left(\\frac{\\partial\\,\\psi_{1}}{\\partial w} \\frac{\\partial\\,\\psi_{2}}{\\partial v} - \\frac{\\partial\\,\\psi_{1}}{\\partial v} \\frac{\\partial\\,\\psi_{2}}{\\partial w}\\right)} \\frac{\\partial\\,\\psi_{3}}{\\partial u} + {\\left(\\frac{\\partial\\,\\psi_{1}}{\\partial w} \\frac{\\partial\\,\\psi_{2}}{\\partial u} - \\frac{\\partial\\,\\psi_{1}}{\\partial u} \\frac{\\partial\\,\\psi_{2}}{\\partial w}\\right)} \\frac{\\partial\\,\\psi_{3}}{\\partial v} - {\\left(\\frac{\\partial\\,\\psi_{1}}{\\partial v} \\frac{\\partial\\,\\psi_{2}}{\\partial u} - \\frac{\\partial\\,\\psi_{1}}{\\partial u} \\frac{\\partial\\,\\psi_{2}}{\\partial v}\\right)} \\frac{\\partial\\,\\psi_{3}}{\\partial w} \\right) \\mathrm{d} u\\wedge \\mathrm{d} v\\wedge \\mathrm{d} w$" ], "text/plain": [ "\\psi^*(\\beta) = (-(d(psi1)/dw*d(psi2)/dv - d(psi1)/dv*d(psi2)/dw)*d(psi3)/du + (d(psi1)/dw*d(psi2)/du - d(psi1)/du*d(psi2)/dw)*d(psi3)/dv - (d(psi1)/dv*d(psi2)/du - d(psi1)/du*d(psi2)/dv)*d(psi3)/dw) du∧dv∧dw" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "betaplb=psi.pullback(beta) # pullback psi*beta\n", "betaplb.disp() # show pullback" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The unique component of the pullback is the Laplace expansion of the determinant of the Jacobian matrix\n", "$$\n", "\\left(\\begin{matrix}\n", "\\frac{\\partial \\psi_1}{\\partial u} & \\frac{\\partial \\psi_1}{\\partial v} & \\frac{\\partial \\psi_1}{\\partial w} \\\\\n", "\\frac{\\partial \\psi_2}{\\partial u} & \\frac{\\partial \\psi_2}{\\partial v} & \\frac{\\partial \\psi_2}{\\partial w} \\\\\n", "\\frac{\\partial \\psi_3}{\\partial u} & \\frac{\\partial \\psi_3}{\\partial v} & \\frac{\\partial \\psi_3}{\\partial w} \n", "\\end{matrix}\n", "\\right).\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "### Global formula for exterior differentials of 1-forms\n", "\n", "
\n", "\n", "\n", "For smooth differential 1-form $\\ \\alpha\\ $ and smooth vector fields $\\ v,w\\ $ on the manifold $M$ we have\n", "\n", "\\begin{equation}\n", "dα(v, w) = v\\,α(w) − w\\,α(v) − α ([v, w]).\n", "\\tag{16.6}\n", "\\end{equation}\n", "\n", "
\n", "\n", "Both sides of this equation are linear in the sense that if \n", "$\\alpha =\\sum f_idx^i$, then\n", "\n", "$$d(\\sum f_idx^i)(v,w)=\\sum d(f_idx^i)(v,w),\\\\\n", "v[(\\sum f_idx^i)(w)]=\\sum v[f_idx^i(w)],\\\\\n", "w[(\\sum f_idx^i)(v)]=\\sum w[f_idx^i(v)],\\\\\n", "(\\sum f_idx^i)([v,w])=\\sum(f_idx^i)([v,w]),\n", "$$\n", "\n", "therefore we only need to prove the equation for a single term \n", "$f dx^i$. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the left hand side of (16.6) we obtain\n", "\n", "$$\n", "dα(v, w) = d(f dx^i)(v, w)\n", "= (df ∧ dx^i )(v, w)\\\\\n", "= df (v)dx^i(w) − df (w)dx^i(v)\n", "= v(f)\\,w(x^i) − w(f)\\,v(x^i).\n", "$$\n", "\n", "For the first term on the right hand side we have\n", "\n", "$$\n", "v\\,α(w) = v (f dx^i) (w)\n", "= v (f dx^i(w))\\\\\n", "= v (f · w(x^i))\n", "= v(f)w(x^i) + f\\,v(w(x^i)),\n", "$$\n", "\n", "and similarly\n", "\n", "$$w\\,α(v) = w(f)v(x^i) + f\\, w(v(x^i)).$$\n", "\n", "Since $[v, w] = vw − wv$\n", "\n", "$$\n", "α ([v, w]) = (f dx^i) ([v, w])\n", "= f · [v, w](x^i)\\\\\n", "= f ·( vw − wv)(x^i)\n", "= f\\, v(w(x^i)) − f \\,w(v(x^i)).\n", "$$\n", "\n", "Combining the obtained equalities we have\n", "\n", "$$\n", "vα(w) − wα(v) − α ([v, w])\\\\\n", "= v(f)w(x^i) + f\\,v(w(x^i)\\\\\n", "− w(f)v(x^i) -f\\, w(v(x^i))\\\\\n", "− f\\, v(w(x^i)) + f \\,w(v(x^i))\\\\\n", "= v(f)w(x^i) − w(f)v(x^i)\n", "= dα(v, w).\n", "$$\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Example 16.9**\n", "\n", "Check (16.6) on selected $\\alpha, v, w$" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\mathrm{True}\\)" ], "text/latex": [ "$\\displaystyle \\mathrm{True}$" ], "text/plain": [ "True" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "dim=2 # dimension of manifold N\n", "N = Manifold(dim, 'N') # manifold N\n", "X = N.chart(' '.join(['x'+str(i)+':x^{'+str(i)+'}' for i in range(dim)])) # chart on N\n", "x0, x1 = X[:] # coordinates x^0, x^1 of chart X as the Python variables x0, x1\n", "al = N.diff_form(1, name=r'\\alpha') # 1-form alpha \n", "def astr(i): return 'a_'+str(i) # names of components\n", "af = [N.scalar_field(function(astr(i))(x0, x1), name=astr(i)) \n", " for i in range(dim)] # component functions\n", "al[:] = af # define all components\n", "v = N.vector_field(x0, x1) # vector field v\n", "w = N.vector_field(x1, x0) # vector field w\n", "L = al.exterior_derivative()(v, w) # Left hand side of (16.6)\n", "R = v(al(w)) - w(al(v)) - al(v.bracket(w)) # Right hand side of (16.6)\n", "L == R # check (16.6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What's next?\n", "\n", "Take a look at the notebook [One-parameter groups of transformations](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/17Manifold_One_Parameter.ipynb)." ] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.6", "language": "sage", "name": "sagemath" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 4 }