{ "cells": [ { "cell_type": "markdown", "id": "e7443183-7f10-4a30-9503-300ac52eb8a4", "metadata": {}, "source": [ "## 20. Integration of differential forms on singular $k$-cubes\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, "id": "ca8f8908-5376-413a-8e22-de33ed625b5f", "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", "id": "40372f27", "metadata": {}, "source": [ "**Remark**. This notebook is an attempt to present a more friendly version of Chapter 4 of:\n", "\n", "Michael Spivak. Calculus on manifolds, Addison Wesley, NY 1965,\n", "\n", "with elementary examples in SageMath.\n", "\n", "**Remark**. Readers interested in application of free software to illustrate the classical Stokes theorem should consult for example https://docs.sympy.org/latest/modules/vector/vector_integration.html\n", "
\n", "\n", "**Warning**. In the present notebook we extensively use the information on differential forms from [notebook 14](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/14Manifold_Differential_Forms.ipynb) and \n", "[notebook 16](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/16Manifold_Ext_Der.ipynb).\n", "\n", "
\n", "\n", "### Explicit description of some pullbacks\n", "\n", "Let us start from some more explicit description of pullback of $k$-forms on $k$-dimensional open sets.\n", "\n", "Consider the smooth map $\\phi:U\\to V$ between open subsets in $R^k$. Let $x^1,\\ldots,x^k$ be the coordinates on $V$ and $t^1,\\ldots,t^k$ - the coordinates on $U$. For $k$-form $\\omega(x)=f(x)dx^1\\wedge\\ldots\\wedge dx^k,\\ $ $f\\in C^\\infty(V)$ \n", "we have\n", "\n", "\\begin{equation}\n", "(\\phi^*\\omega)(t)=f(\\phi(t))\\frac{\\partial(\\phi^1,\\ldots,\\phi^k)}{\\partial(t^{1},\\ldots,t^{k})}dt^1\\wedge\\ldots\\wedge dt^k,\n", "\\tag{20.1}\n", "\\end{equation}\n", "where $\\phi=(\\phi^1,\\ldots,\\phi^k)$ and $\\ \\frac{\\partial(\\phi^1,\\ldots,\\phi^k)}{\\partial(t^{1},\\ldots,t^{k})}=\\det\\big[\\frac{\\partial\\phi^i}{\\partial t^j}\\big]$.\n", "\n", "In fact\n", "\n", "$$\\phi^*(\\omega)=f(\\phi(t))\\big(\\frac{\\partial\\phi^1}{\\partial t^{i_1}}dt^{i_1}\\big)\n", "\\wedge\\ldots\\wedge\\big(\\frac{\\partial\\phi^k}{\\partial t^{i_k}}dt^{i_k}\\big)\\\\\n", "=f(\\phi(t))\\frac{\\partial\\phi^1}{\\partial t^{i_1}}\\ldots\\frac{\\partial\\phi^k}{\\partial t^{i_k}}dt^{i_1}\\wedge \\ldots\\wedge dt^{i_k}\\\\\n", "=f(\\phi(t))\\big(\\sum_{\\sigma\\in S_k} (\\text{sign}\\,\\sigma)\n", "\\frac{\\partial\\phi^1}{\\partial t^{\\sigma(1)}}\\ldots\\frac{\\partial\\phi^k}{\\partial t^{\\sigma(k)}}\\big)dt^{1}\\wedge \\ldots\\wedge dt^{k}\\\\\n", "=f(\\phi(t))\\det\\big[\\frac{\\partial\\phi^i}{\\partial t^j}\\big]dt^{1}\\wedge \\ldots\\wedge dt^{k},\n", "$$\n", "\n", "(we have used the relations $i_1=\\sigma(1),\\ldots,i_k=\\sigma(k),\\ $ $\\ dt^{i_1}\\wedge\\ldots\\wedge dt^{i_k}=(\\text{sign}\\,\\sigma)dt^1\\wedge\\ldots\\wedge dt^k$ and the definition of determinant)." ] }, { "cell_type": "markdown", "id": "9ef79521", "metadata": {}, "source": [ "
\n", "\n", "### Singular $k$-cubes\n", "\n", "
\n", "\n", "Let\n", "$$[0,1]^k=\\underbrace{[0,1]\\times\\ldots\\times[0,1]}_{k\\mbox{-times}}$$\n", "and $U$ be an open subset of $R^k$ such that $[0,1]^k\\subset U.$\n", "\n", "Let $\\phi : U \\to V$\n", "be a $C^\\infty$ map of $U$ into an open set $V$\n", "in $R^m$ ($k$ and $m$ may be different). We will write this map simply as\n", "\\begin{equation}\n", "\\phi:[0,1]^k\\to V,\n", "\\tag{20.2}\n", "\\end{equation}\n", "\n", "(this map is a restriction of a $C^\\infty$ map $ U\\to V$). \n", "\n", "The map $\\phi:[0,1]^k\\to V$ will be\n", "called a **singular $k$-cube** in $V$. The word singular indicates that the map need not be one-to-one, though we will require that $\\phi$ be in $C^\\infty$. For $k=1,2$ the singular $k$-cubes are just parametrized curves and surfaces, respectively.\n", "\n", "
\n", "\n", "### Standard $k$-cubes\n", "\n", "
\n", "\n", "By the **standard $k$-cube** we will mean the map\n", "$ I:[0,1]^k\\to R^k$ defined by\n", "\n", "\\begin{equation}\n", "I(t)=t,\\quad t\\in[0,1]^k,\n", "\\tag{20.3}\n", "\\end{equation}\n", "\n", "so $I$ is an example of singular $k$-cube with $\\phi\\big|_{[0.1]^k}=id_{[0,1]^k}.$\n", "\n", "For standard $k$-cube $I$ we can define singular $(k-1)$-cubes $I^0_i$ and $I^1_i$\n", "(the i-th pieces of the boundary of $I$) as the maps\n", "\n", "\\begin{equation}\n", "\\begin{matrix}\n", "I^0_i:[0,1]^{k-1}\\ni t\\to x(t)\\in R^k, \\text{ where}\\\\\n", "x^1(t)=t^1,\\\\\n", "...........,\\\\\n", "x^{i-1}(t)=t^{i-1},\\\\\n", "x^i(t)=x^i=0,\\\\\n", "x^{i+1}(t)=t^i,\\\\\n", "...........,\\\\\n", "x^k(t)=t^{k-1},\\\\\n", "t=(t^1,\\ldots,t^{k-1})\\in [0,1]^{k-1},\n", "\\end{matrix}\n", "\\tag{20.4}\n", "\\end{equation}\n", "\n", "and\n", "\n", "\\begin{equation}\n", "\\begin{matrix}\n", "I^1_i:[0,1]^{k-1}\\ni t\\to x(t)\\in R^k, \\text{ where}\\\\\n", "x^1(t)=t^1,\\\\\n", "...........,\\\\\n", "x^{i-1}(t)=t^{i-1},\\\\\n", "x^i(t)=x^i=1,\\\\\n", "x^{i+1}(t)=t^i,\\\\\n", "...........,\\\\\n", "x^k(t)=t^{k-1},\\\\\n", "t=(t^1,\\ldots,t^{k-1})\\in [0,1]^{k-1}.\n", "\\end{matrix}\n", "\\tag{20.5}\n", "\\end{equation}\n", "\n", "\n", "The singular $(k-1)$-cubes $I^0_i$ and $I^1_i$ are called $(0,i)$ and $(1,i)$ faces of $I$ respectively." ] }, { "cell_type": "markdown", "id": "a24be832", "metadata": {}, "source": [ "
\n", "\n", "### Boundary of the singular $k$-cube\n", "\n", "
\n", "\n", "In the definition of the boundary of a singular $k$-cube we will use some auxiliary notions.\n", "\n", "For arbitrary family of objects $W=\\{w_i\\}_{i\\in J}$ we can construct a **vector space of formal linear combinations of elements $w_i\\in W$** as the family of functions $f:W\\to R$, such that $f(w_i) = 0$\n", "for all but finitely many $w_i$. Vector space operations on such functions are defined as usual: if $f,g$ are formal linear combinations of elements of $W$, then\n", "\n", "$$(f+g)(w_i)=f(w_i)+g(w_i)\\quad\\mbox{and }\\ \\ (qf)(w_i)=q(f(w_i)),\\quad \\mbox{for } w_i\\in W, q\\in R.$$\n", "\n", "The formal linear combination $f$ are usually written as \n", "\n", "$$\n", "f=\\sum a_iw_i,\\quad \\mbox{ where } \\ \\ a_i=f(w_i).\n", "$$\n", "\n", "If we take as $W$ the family of all singular $k$-cubes in $V$ we can define the **space of $k$-chains in $V$** as the space of formal linear combinations of singular $k$-cubes in $V$. Thus the space of $k$-chains consists of (finite) linear combinations \n", "\n", "$$ \\sum a_i\\phi_i,\\quad \\mbox{where } \\phi_i\\ \\ \\mbox{are singular}\\ \\ \\text{$k$-cubes and}\\ \\ a_i\\in R.\n", "$$" ] }, { "cell_type": "markdown", "id": "ec215d1d", "metadata": {}, "source": [ "Using the introduced notion we can define the boundary $\\partial I$ of the **standard $k$-cube $I$** as the $(k-1)$-chain\n", "\n", "\\begin{equation}\n", "\\partial I=\\sum_{i=1}^k (-1)^{i-1}(I^1_i-I^0_i).\n", "\\tag{20.6}\n", "\\end{equation}\n", "\n", "In the case of **singular $k$-cube $\\phi:[0,1]^k\\to V$** we define the \n", "$(0,i)$ and $(1,i)$ faces as\n", "\n", "\\begin{equation}\n", "\\phi^0_i=\\phi\\circ I^0_i,\\qquad \\phi^1_i=\\phi\\circ I^1_i,\n", "\\tag{20.7}\n", "\\end{equation}\n", "\n", "respectively and the boundary $\\partial \\phi$ of $\\phi$ as the $(k-1)$-chain\n", "\n", "\\begin{equation}\n", "\\partial\\phi =\\sum_{i=1}^k (-1)^{i-1}(\\phi^1_i-\\phi^0_i).\n", "\\tag{20.8}\n", "\\end{equation}" ] }, { "cell_type": "markdown", "id": "3c12b283", "metadata": {}, "source": [ "### Integrals of $k$-forms on singular $k$-cubes and chains\n", "\n", "
" ] }, { "cell_type": "markdown", "id": "c5172951", "metadata": {}, "source": [ "Let $\\omega$ be a smooth $k$-form on an open set $U\\subset R^k$ containing $[0,1]^k$.\n", "Assume that $\\omega$ is of the form\n", "\n", "\\begin{equation}\n", "\\omega=fdx^1\\wedge\\ldots\\wedge dx^k,\n", "\\tag{20.9}\n", "\\end{equation}\n", "\n", "where $f$ is a smooth function on $U$.\n", "\n", "We define first the integral of $\\omega$ over $[0,1]^k$\n", "\n", "\\begin{equation}\n", "\\int_{[0,1]^k}\\omega =\\int_{[0,1]^k}fdx^1\\wedge\\ldots\\wedge dx^k=\\int_{[0,1]^k}f(x)dx^1\\ldots dx^k=\\int_{[0,1]^k} f,\n", "\\tag{20.10}\n", "\\end{equation}\n", "\n", "where the right hand side denotes the Riemann integral over the rectangle $[0,1]^k$.\n", "\n", "Using this relation we can define the **integral of the smooth $k$-form $\\omega$ on $V$ over singular $k$-cube** $\\phi:[0,1]^k\\to V$:\n", "\n", "\\begin{equation}\n", "\\int_\\phi\\omega =\\int_{[0,1]^k}\\phi^\\star\\omega.\n", "\\tag{20.11}\n", "\\end{equation}\n", "\n", "With the help of (20.1) we can rewrite this formula: \n", "\n", "\\begin{equation}\n", "\\int_{\\phi}\\omega=\\int_{[0,1]^k}f(\\phi(t))\n", "\\frac{\\partial(\\phi^1,\\ldots,\\phi^k)}{\\partial(t^{1},\\ldots,t^{k})}dt^1\\wedge\\ldots\\wedge dt^k,\n", "\\tag{20.12}\n", "\\end{equation}\n", "\n", "where $\\phi=(\\phi^1,\\ldots,\\phi^k)$.\n", "\n", "**In the special case of standard $k$-cube $I$** given by $x^1=t^1,\\ldots,x^k=t^k$, $t\\in [0,1]^k$ we obtain\n", "\n", "\\begin{equation}\n", "\\begin{matrix}\n", "\\int_I fdx^1\\wedge\\ldots\\wedge dx^k=\n", "\\int_{[0,1]^k}I^*(fdx^1\\wedge\\ldots\\wedge dx^k)\\\\\n", "=\\int_{[0,1]^k}f(I(t))\n", "\\frac{\\partial(x^1,\\ldots,x^k)}{\\partial(t^{1},\\ldots,t^{k})}dt^1\\wedge\\ldots\\wedge dt^k\\\\\n", "=\\int_{[0,1]^k}f(t)dt^1\\ldots dt^k.\n", "\\end{matrix}\n", "\\tag{20.13}\n", "\\end{equation}\n", "\n", "Finally we define the **integral of $k$-form of $\\omega$ over $k$-chain** $c=\\sum a_i\\phi_i$:\n", "\n", "\\begin{equation}\n", "\\int_c\\omega=\\sum a_i\\int_{\\phi_i}\\omega.\n", "\\tag{20.14}\n", "\\end{equation}\n", "\n", "The last formula applied to $(k-1)$-chain $\\ \\ \\partial I=\\sum_{i=1}^k (-1)^{i-1}(I^1_i-I^0_i)\\ \\ $ and $(k-1)$-form $\\omega$ gives\n", "\n", "\\begin{equation}\n", "\\int_{\\partial I}\\omega=\\sum_{i=1}^k (-1)^{i-1}(\\int_{I^1_i}\\omega\n", "-\\int_{I^0_i}\\omega),\n", "\\tag{20.15}\n", "\\end{equation}\n", "\n", "and in the case of $(k-1)$-chain $\\ \\ \\partial \\phi=\\sum_{i=1}^k (-1)^{i-1}(\\phi^1_i-\\phi^0_i)\\ \\ $: \n", "\n", "\\begin{equation}\n", "\\int_{\\partial \\phi}\\omega=\\sum_{i=1}^k (-1)^{i-1}(\\int_{\\phi^1_i}\\omega\n", "-\\int_{\\phi^0_i}\\omega).\n", "\\tag{20.16}\n", "\\end{equation}" ] }, { "cell_type": "markdown", "id": "27a883d7", "metadata": {}, "source": [ "
\n", "\n", "\n", "The definition (20.15) of the integral of $\\omega$ on $\\partial I$ looks artificially, but we can give it a quite natural interpretation if we define the orientation of $I^0_i$ and $I^1_i$." ] }, { "cell_type": "markdown", "id": "b7ba766f", "metadata": {}, "source": [ "We recall that the transition from one frame $e_1,..., e_k$ in $R^k$ to a\n", "second frame $e_1',..., e_k'$ can be defined by the square matrix obtained from $e_j'=A^i_je_i$. The determinant of this matrix is always nonzero, and the set of all frames divides into two equivalence classes, each class containing all possible frames such that for any two of them the determinant of transition matrix is positive. Such equivalence classes are called orientation classes of frames in $R^n$.\n", "To define an orientation means to fix one of these orientation classes. Thus, **the oriented space $R^k$ is the space $R^k$ together with a fixed orientation class of frames**." ] }, { "cell_type": "markdown", "id": "26390b88", "metadata": {}, "source": [ "Let $n_i$ be the unit outward (with respect to $[0,1]^k$) normal vector to $I^1_i$ or $I^0_i$ defined in (20.4),(20,5).\n", "Assume that the space $R^𝑘$ has been oriented by $e_1,\\ldots,e_k$.\n", "We can define the **orientation of $I^1_0$ and $I^0_i$ prescribed by the unit outward normal vector to $I^1_i$ or $I^0_i$** in the following way.\n", "\n", "Compare the frame $𝑛_i,𝑒_1,...,\\widehat{e_i}\\ldots,𝑒_k$ ($e_i$ omitted) with the frame $e_1,..,,𝑒_k$, that orients the space $R^𝑘$. \n", "\n", "If these are in the same orientation class, then $I^0_i$ (or $I^1_i$)\n", "has the orientation prescribed by the unit outward normal vector to $I^0_i$ (or $I^1_i$). \n", "\n", "If these two frames are in different orientation classes, then we take the orientation of $I^0_i$ ( or $I^1_i$) opposite to that defined by $𝑛_i,𝑒_1,...,\\widehat{e_i}\\ldots,𝑒_k$ as the one prescribed by the outward unit normal vector.\n", "\n", "Defining $\\ \\int_{\\partial I}\\omega\\ \\ $ we take the sum of all $\\ \\int_{ I^0_i}\\omega\\ \\ $ and \n", "$\\ \\int_{I^1_i}\\omega,\\ \\ $ but if $\\ I^0_i\\ $ or $\\ I^1_i\\ $ have the orientation opposite to that prescribed by the outward unit normal vector we take the corresponding integrals with minus sign. " ] }, { "cell_type": "markdown", "id": "17eb80ea", "metadata": {}, "source": [ "
\n", "\n", "**Example 20.1**\n", "\n", "Consider the case $k=2$." ] }, { "cell_type": "code", "execution_count": 2, "id": "6a0b864c", "metadata": {}, "outputs": [ { "data": { "image/png": "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kqQTJ05o+/btmj9/vrp166a//OUvCgwMVGJiot59911FRETY32Pu3LmaNGmS/vznP+uJJ55wy2cD6jlDczfoOAE1uHTpktklGHb06FGzS4CbZWRkyGKxKDg4WM8++6zKy8sVFBSkNm3aKC4uTosXL1bnzp3t47du3aqBAwcqOzvb3l3q16+ffR/BCag7ghNQg8zMTKWkpGjfvn1yoCtrFx0d7dZJuidPntTbb78tSerUqZPbzgPX+/777x0+5siRI5KkoUOHGroF3KFDB508eVJlZWX24GSxWCTVr18KAG9EcIJpPvroI82cOVMhISEqKyvTrbfeqtdff12tW7c2uzT7RPLDhw8rNTVVy5cvdyhAdezYUc8995zb6svOzrYHp5qeyQfv9OKLL+qNN96QJJ09e9bwcbYvJsTFxRka//nnn6u0tNS+Qr4kHThwQJLUq1cvw+f1VXl5eerbt6+OHz9udimoh7jiwhRLly5VUlKSZs2apaysLO3cuVP5+flKSEjwqm+vdevWTR988IEOHjyoRx55xPDyBcC/unz5subOnWv/8/z58w0fa7sN16JFi1rHWCwWpaWlSZKaNGlS7ReQhQsXqk2bNnrqqaccKdunFBQUKD09XXFxcfrxxx/NLgf1FMEJHnf+/HlNnjxZDzzwgPr37y9JatCggWbNmqVDhw7ptddeM7fAGhCg4KzFixeruLjY/ucNGzYoPz/f0LGjR4+WVPt8ttLSUiUnJ9faFV23bp127typd99995rhy5cNHz5c9913n3744QezS0F9Z7Vajf4ALrFgwQKrJOuKFSuq7evZs6e1WbNm1suXL5tQmXGHDh2yPvLII9aAgACrKr9xWuVn0KBBbj3/3r177ed68MEH3XouOK+0tNTavn37an9PXnjhBcPvMWnSJGuzZs2sBw4csG+7ePGidenSpdbevXtblyxZUuNxp0+ftkZGRloXLVrk9OfwFR06dLBW/vMHVGEoD9FxgsetWbNGknT77bdX23fbbbepoKBAu3bt8nRZDqEDBUcsXry4xltDc+fONdx1mjNnjmbMmKFx48YpPj5eAwYM0AMPPKAzZ85ozZo1Gjt2bLVjrly5ogcffFCpqalKTk52+nMA4FYdTGCbpHrTTTdV29e+fXtJ0v79+z1aU13VFqC6d+9ucmXwFpcvX7ZPCP9XxcXF+p//+R/D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\n", "text/plain": [ "Graphics object consisting of 21 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "l1=polygon2d([(1.0,0.5),(1.5,0.5),(1.5,1.0),(1.0,1.0)],\n", " fill=False,color='black',xmin=0,xmax=2.5,\n", " ymin=0,ymax=1.5)\n", "e1=arrow((1.35,1),(1.1,1),color='black')\n", "t1=text('$-e_1$',(1.1,1.1),fontsize=20, color='black')\n", "n1=arrow((1.35,1),(1.35,1.2),color='black')\n", "tn1=text('$n$',(1.35,1.25),fontsize=20, color='black')\n", "I21=text('$I^1_2$',(1.2,1.3),fontsize=24, color='black')\n", "\n", "e2=arrow((1.1,0.5),(1.35,0.5),color='black')\n", "t2=text('$e_1$',(1.25,0.6),fontsize=20, color='black')\n", "n2=arrow((1.1,0.5),(1.1,0.3),color='black')\n", "tn2=text('$n$',(1.1,0.25),fontsize=20, color='black')\n", "I20=text('$I^0_2$',(1.3,0.2),fontsize=24, color='black')\n", "\n", "e3=arrow((1,0.85),(1.0,0.65),color='black')\n", "t3=text('$-e_2$',(0.85,0.65),fontsize=20, color='black')\n", "n3=arrow((1.0,0.85),(0.8,0.85),color='black')\n", "nt3=text('$n$',(0.75,0.9),fontsize=20, color='black')\n", "I11=text('$I^1_1$',(1.9,0.75),fontsize=24, color='black')\n", "\n", "e4=arrow((1.5,0.65),(1.5,0.85),color='black')\n", "t4=text('$e_2$',(1.6,0.85),fontsize=20, color='black')\n", "n4=arrow((1.5,0.65),(1.7,0.65),color='black')\n", "nt4=text('$n$',(1.75,0.65),fontsize=20, color='black')\n", "I01=text('$I^0_1$',(0.6,0.75),fontsize=24, color='black')\n", "\n", "\n", "(l1+e1+t1+n1+tn1+e2+n2+tn2+t2+e3+t3+n3+nt3+\n", " e4+t4+n4+nt4+I21+I20+I11+I01).show(axes=False)" ] }, { "cell_type": "markdown", "id": "9ceb57f2", "metadata": {}, "source": [ "If $k=2$, then the integral over the boundary of $\\ I\\ $ defined \n", "in (20.15) takes the form\n", "\n", "\\begin{equation}\n", "\\begin{matrix}\n", "\\int_{\\partial I}\\omega\n", "=\\sum_{i=1}^2(-1)^{i-1}\\big[\\int_{I^1_i}\\omega-\\int_{I^0_i}\\omega\\big] \\\\\n", "=\\int_{I^1_1}\\omega-\\int_{I^0_1}\\omega\n", "-\\int_{I^1_2}\\omega+\\int_{I^0_2}\\omega.\n", "\\end{matrix}\n", "\\tag{*}\n", "\\end{equation}\n", "\n", "The orientation of the boundary of $I$ prescribed by the unit normal outward vector implies that: \n", "\n", "on $I^0_2$ the frame $n,e_1$ is in the same orientation class as $e_1,e_2$ in $R^2$,\n", "\n", "on $I^1_1$ the frame $n,e_2$ is in the same orientation class as $e_1,e_2$ in $R^2$,\n", "\n", "on $I^1_2$ the frame $n,-e_1$ is in the same orientation class as $e_1,e_2$ in $R^2$,\n", "\n", "on $I^0_1$ the frame $n,-e_2$ is in the same orientation class as $e_1,e_2$ in $R^2$.\n", "\n", "This is in accordance with the fact that in (*) the integrals over $I^1_2$ and $I^0_1$ are taken with the minus sign.\n", "\n", "As we can see, in the case $k=2$ the formula (20.15) agrees with\n", "the orientation of boundary of $I$ prescribed by the unit outward normal vector and corresponds to going around the square\n", "counterclockwise.\n" ] }, { "cell_type": "markdown", "id": "f6ab68d9", "metadata": {}, "source": [ "
\n", "\n", "**Example 20.2**\n", "\n", "Consider the case $k=3$." ] }, { "cell_type": "code", "execution_count": 3, "id": "bc71ffdf", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAJOCAYAAAAqFJGJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB3yklEQVR4nO3de1hVdd7//9cCNidRQQVRQS01TU1LSfOUIGpmKaVWd3VPlllZd2XlPU1jt/dM49xNh2/TYSo7eEindH7ZQcU8ZSKeUCPT1NLSPICnEAVF2BzX7w9iDTtAgQ17b9jPx3Vxyf6stfZ+U5vFeu3PYRmmaQoAAAAAnOHj7gIAAAAANHwECwAAAABOI1gAAAAAcBrBAgAAAIDTCBYAAAAAnEawAAAAAOA0ggUAAAAApxEsAAAAADiNYAEAAADAaX412JdbdAONg1EPz8n5AWj4ODcAqEq1zg/0WAAAAABwGsECAAAAgNMIFgAAAACcRrAAAAAA4DSCBQAAAACnESwAAAAAOI1gAQAAAMBpBAsAAAAATiNYAAAAAHAawQIAAACA0wgWAAAAAJxGsAAAAADgNIIFAAAAAKcRLAAAAAA4jWABAAAAwGkECwAAAABOI1gAAAAAcBrBAgAAAIDTCBYAAAAAnEawAAAAAOA0P3cXAAAAAM+XkpKiWbNm6cCBA7LZbDp//rwmTJig6dOnu7s0eAh6LAAAAFClnJwc3X333YqNjVW/fv2UnJys5ORkbdiwQWvXrtXs2bPdXSI8BD0WAAAAqJTdbldcXJxSU1O1ePFiTZgwwdoWEhKi22+/XTt27LDakpOTNX/+fAUHB+v48eNq27atZsyYodatW7ujfLgYwQIAAACVeuyxx5Samqrx48c7hApJMk1TiYmJGjdunCQpNTVVs2fP1gcffCBfX18VFxcrJiZGQ4cOVWpqqkJCQtzxI8CFGAoFAACACg4dOqS5c+dKkqZNm2a1p6ena+HChRoyZIjatWun++67T5L04YcfauHChdq2bZskydfXV8OHD9f+/fu1Zs0a1/8AcDl6LAAAAFDBggULVFJSIpvNpqefflpFRUXy9fVVRESEYmJiNG/ePHXp0sXav3fv3mrevLmaNGlitZ07d06SFBwc7PL64XqGaZrV3bfaOwLwaEY9PCfnB6Dh49wAB3feeaf+9a9/KSEhQUuWLKnVc1x99dXKyMjQwYMHFRgYWLcFwpWqdX6gxwIAAAAVZGdnS5JiYmJqdfwnn3yitLQ0JSYmEiq8BHMsAAAAUEHZMKewsLAq9ykpKdGrr77q0DZnzhxNmTJF06dP15w5czRw4MB6rROeg2ABAACACu666y5J0v79+yvdbrfbNWnSJP12WP3999+vd955R9u3b9ezzz6ru+66SwUFBfVeL9yPYAEAAIAK+vfvr6lTp2rBggXas2eP1Z6bm6uFCxdq2LBhGjZsmJ566qlKjw8NDdXvf/97LVq0SH/6059cVTbciMnbgPdhgiaAynBuQKXeeecdvf/++woMDFRAQIBsNptGjx6t3/3ud2rRooW13969e+Xn56euXbtabd9995169+6tiIgInTp1yh3lo25U6/xAsAC8DxcPACrDuQG1lp2drcjISPn6+urUqVPWkrN79+5Vz5491bx5c2VlZbm3SDijWucHhkIBACzPPfecBg4cqF69emnx4sWSpMLCQr3yyisaMWKEYmNj1blzZz355JPKz893c7UAPEVAQICKiorUtWtX+fv7W+0//PCDJCk+Pt5dpcGFWG4WACBJWrp0qTIzM7VlyxY98cQTuvPOO9W2bVu98MILuvfee7V69Wr5+PgoKSlJw4YNk7+/v1588UV3lw3ATUpKSrRr1y5FRUUpPDxc06ZNU5cuXWSz2SRJxcXFeuuttxQeHq6XX37ZzdXCFRgKBXgfhjugUiNGjNCcOXPUvn17Pfjgg3r//fcVGRmppKQkdevWzdqvoKBAAQEB6tGjh8OETjR4nBtQI4sWLdKPP/4owzD01FNPKSQkRHPmzNG6detkGIbS0tJ02WWX6a9//auioqLcXS6cww3yAADVc+7cOeXl5al9+/aSpB07dkiSZs6c6RAqJCkzM1NS6dAHAN7pwoULOnDggCTJNE0lJyfrpptu0v3336/777/fzdXBXZhjAQCQJOsmV2fOnNG3336rli1batKkSRX22759uyTpqquucml9ADxHSkqKSkpKrMe7du1Sbm6uGyuCJyBYAADUrFkzXXvttZKkdevWqaSkRHFxcfLxqfhnYsmSJZKkG264wZUlAvAQFy5csD5gKFNYWKiUlBQ3VQRPQbAAADhYu3atJGn48OEVthUVFSkxMVFBQUEaM2aMq0sD4AFSUlJUWFhYoX379u30Wng5ggUAwEFZ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G2/oP/7jPxQcHKwPP/xQV1xxhVq0aKHJkycrLCxMvr6+mjp1apWBoaCgQLfddptmzpype+65x8U/BYDfqipA7NmzR9dff71atWrl4orgKZhj4cU+++yzKoOFxFyLRsyrxm+fPHlSl19+eZWrCMXFxbF0qYd78MEHNXjwYIdQsWDBgsYcMrzqdxQNy2/nVvzWVVddpXHjxrmwIrgIcyxQtYv1VpShSxONQVW9FWXKei3gmV5//XX17dvXIUTk5uZq586d7isK8GKXujbYs2cPcy28GEOhvFR1QkNZlya9Fmioqppb8VvPPfccvRYeaM2aNXrppZcUFxenjRs3Wu2nTp3SLbfc4r7CAC9V2dyK3yqba0GvhXciWHih6vRWlGGuBRqyS/VWlGGuhWe64447lJWVpY8++qjCtmeeecYNFQHerbojGZhr4b0YCuWFajLEiRWi0FBVt7eiDCtEeZ6zZ8/KNM1Kvy51124Adas6vRVlWCHKexEsvExNeivKcHJAQ1Td3ooyzLUAgKrV9FrAE+ZapKSk6J577tHAgQM1dOhQ9enTR88//7xba2rsCBZepjYhgV4LNDQ17a0oQ68FAFRUk96KMu7stcjJydHdd9+t2NhY9evXT8nJyUpOTtaGDRu0du1azZ492y11eQOChRepTW9FGXot0JDUtLeiDL0WAFBRba8B3NFrYbfbFRcXp4ULF+qjjz7So48+KpvNJkkKCQnR7bffrh07dlj7b9y4UbfccotGjRql7t2765lnntGFCxdcWnNjQrDwIs6EA3ot0FDUtreiDL0WAPBvtemtKOOOXovHHntMqampGj9+vCZMmFChnsTERPXt21dS6bXNq6++qkWLFmnVqlVasWKF/vnPfyouLk75+fkurbuxIFh4iZKSEu3du9ep5/j+++/rqBqg/ixfvrxWvRVlkpKS9Msvv9RhRQDQcDn7t3/v3r0qKSmpo2ou7tChQ5o7d64kadq0aVZ7enq6Fi5cqCFDhqhdu3a67777JEnTp0/X22+/raCgIElSx44d9Yc//EFff/215syZ45KaGxuWm/UShmGoS5cu2r9/f62O9/f3V4cOHeq4KqDuDRgwQGFhYTp79qxTxwMApA4dOsjf318FBQW1Or5Lly4yDNfcTH7BggUqKSmRzWbT008/raKiIvn6+ioiIkIxMTGaN2+eunTpYu2/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Pj4+6tixo7vLQA1wxvdg27dvd/j0r8zy5ctlt9slST///LNmzZrlECrat2+vKVOmMPTJA02ePFk+Pj4KDAxUu3bt9NZbbzls//3vf6+wsDDZbDYFBwd7/B1NG5NvvvlGMTExeuGFFzRjxgxt3769wYaK06dPq2/fvnrkkUcUEBCgFStWKDExsV5CRU5Ojg4cOGCFCsMw1LZtW7Vr147zjxcyDGO2pBJJdknHOMcB3oWPCzzUhQsXHMallnf+/HmtXLlSfn5+2rFjh9Vus9kUHx+vfv36MTbQQ82ePVuzZ892dxkoh16K2rvlllt0+PBh67HNZlN0dHStxkCjcTBNc7KkyeWb3FULANcjWHiopKQkhxVVfuu7775zeNyhQweNHTu2yhtNAaiIuRS1U1xcrPj4eLVv395qCwkJUVRUFMNbAMCL8RfAA508edKhJ+Ji/Pz8NHLkSMXExNBLAdTA+++/r48++oheihrKy8vT0aNHHUJFREQE950AABAsPI1pmlq9erVMs3q9x926ddO1115bz1UBjc+CBQvUp08f3XvvvdqyZYvDyjUNRUFBgd5//33t3bu33nspJOns2bM6fvy4dX46f/68evbsqaZNm9bbawIAGg6ChYfZt2+fw5jlS9mzZ4+uueYaXX755fVXFNBI7dixo9q9g54sPj5eK1asqLdeipKSEp04cUJnz5612jIyMvS///u/2rhxY728JgCg4SFYeJCioiKtWbOmxsctW7ZMDz/8MGvFAzXw2GOPaeTIke4uwykffPCBPv30U7300kv1FioKCgp09OhRayU6SWrRooXmz5+v06dP18trAgAaJoKFB0lJSXG4uV11ZWdna+3atbrpppvqviigkerdu7duvvlmd5fhlE2bNtXr8587d07p6enWXbQNw1C7du0UGhpqtQEAUIZFxj3E+fPnnRpSkJqaWqMhVABQFdM0derUKR09etQKEP7+/urUqZNCQ0PdWxwAwGMRLDzE6tWrVVhY6NRz7N27t46qQUOyf/9+6/t9+/a5sRI0BkVFRTp8+LAyMjKstmbNmqlTp04KDAx0Y2XwVpzjgIaDYOEBfvrpJ6dDQfPmzXXVVVfVUUXwdO+++66uu+46tW/fXqNGjbLau3fvrssvv1zXXXedli1b5sYK0RDl5ubqwIEDunDhgtUWGRmp6Oho+fr6urEyeBvO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XnutJOnYsWM6fPhwndaKxiM/P99hPk51huAZhqFPP/1U2dnZuv322x22HThwQOfOnZMkJSQk1G2xAIAGgWABuFFtLu7sdrtM09Tu3bu1YcOGCtsDAwOt7zMzM+umUDQKpmkqPz9fx48f17Rp0xzmSRiGoaysrFr3cs2dO1eSNGLEiAqhAwDgHQgWgIs5e3H3yCOPqFevXoqPj9eIESMqbD9w4ID1XJdddlnd/wBokCZPniwfHx8FBgaqXbt2euuttxy2//73v1dYWJhsNpuCg4Ot3ofqSExM1CuvvKI77rhDS5YsYblZAPBShmma1d232jvCs6WkpGjWrFk6cOCAbDabzp8/rwkTJmj69OnuLq3Rmzx5subMmVOtfYOCgnTy5Ek1a9as2s9vmqa6deumH3/8USNHjtTq1asr260+rvo4P3iZzz//XK+//rqysrL0/fff6/HHH9df//pXhx4zNDicGwBUpVrnB4KFF8nJydFDDz2kTz75RK+88ooeeugh2Ww25eTkaOzYsbrrrrs0efJkd5cJJ3z22WcaP368AgICtG3btqputMfFA+rUL7/8ojvvvFP79u3Tu+++W+nCAmgQODcAqArBAv9mt9s1ZMgQpaamavHixZowYYLD9nfeeUffffed3n77bUmlE4rnz5+v4OBgHT9+XG3bttWMGTPUunVrd5SPajh79qx69+6tY8eOaf78+ZWu2vMrLh5Q506ePKno6GgVFxfr888/ZwJ3w8S5AUBVqnV+YI6Fl3jssceUmpqq8ePHVwgVpmkqMTFRffv2lSSlpqZq9uzZev/99/Xmm29q8eLF2rx5s4YOHeowHwCewzRN3X///Tpx4oQ++OCDi4UKoF5ERkbq+uuvl2maeuihh5Sfn+/ukgAALkaw8AKHDh2yVmyZNm2a1Z6enq6FCxdqyJAhateune677z5J0ocffqiFCxdq27ZtkiRfX18NHz5c+/fv15o1a1z/A+CS/ud//kdr1qzRsmXL9Lvf/c7d5cBLXXnllZKkU6dOaePGjW6uBgDgan7uLgD1b8GCBSopKZHNZtPTTz+toqIi+fr6KiIiQjExMZo3b566dOli7d+7d281b95cTZo0sdrKVogJDg52ef24uLffflvvv/++kpOTrV4noD68+eabmj59umJjY/Xpp5/KZrM5bG/atKn1fVZWlourAwC4G8HCC+zbt0+SNHr0aC1ZsuSS+993331W70WZbdu2qW3btoqNja2HClFbn3/+uV588UVt2LBB3bp1c9g2Z84cDR8+XB06dHBTdWhs3nnnHZ0/f16JiYnas2ePrrnmGoftJ0+etL4v670AAHgPhkJ5gezsbElSTExMrY7/5JNPlJaWpsWLF7OUpAfZtGmTnn32Wa1fv75CqJBKb1gWGhrq+sLQaHXt2lWGYWjEiBHq0aNHhe2bN2+WVHqjx8q2AwAaN3osvECXLl20cuVKhYWFVblPSUmJXn/9dT355JNW25w5c/T1119r3bp1mjNnjgYOHOiKclEN33//vSZNmqRZs2YpPz/f6pUqc/bsWZ08eVLNmzd3U4VojP70pz9p165d+vvf/y5/f3+HbevWrdNPP/2k1q1ba968eW6qEADgTiw36wW2bdum6667To899pjeeOONCtvtdrumTJmiXr166amnnqqwPSsrS4MGDVLv3r31wQcfVLiggGsdO3ZMAwYMUFpa2kX3u+GGG7Rq1arKNrGkJGptx44dmjp1qi6//HINHz5crVu31k8//aQ///nPiomJ0bvvvqv27du7u0zUDucGAFVhuVmU6t+/v6ZOnaoFCxZoz549Vntubq4WLlyoYcOGadiwYZWGCkkKDQ3V73//ey1atEh/+tOfXFU2qvDcc89dMlRIYigK6kWfPn20ceNGPf3007Lb7frmm28UEBCgzZs3a+XKlYQKAPBi9Fh4kXfeeUfvv/++AgMDFRAQIJvNptGjR+t3v/udWrRoYe23d+9e+fn5qWvXrlbbd999p969eysiIkKnTp1yR/moO3wqCaAynBsAVIU7b6PmsrOzFRkZKV9fX506dcpacnbv3r3q2bOnmjdvzjKSDR8XDwAqw7kBQFUYCoWaCwgIUFFRkbp27eowl+KHH36QJMXHx7urNAAAAHgwVoWCTNPUokWLdPz4cY0bN07Tpk1Tly5drJtfFRcX66233lJ4eLhefvllN1cLAAAAT8RQKOj777/X4sWLJUkhISF66qmnNHfuXK1bt06GYSgtLU2XXXaZ/vrXvyoqKsrN1aIOMNwBQGU4NwCoCnMscGmmaer999/XiRMnrLb//M//VKdOndxYFeoZFw8AKsO5AUBVmGOBSzt06JBDqJCk5ORk1SBwAgAAAAQLb2aappKTkyu0p6Wl6eeff3ZDRQAAAGioCBZe7NChQzp69Gil2+i1AAAAQE0QLLxUVb0VZei1AAAAQE0QLLzUxXorytBrAQAAgOoiWHihS/VWlKHXAgAAANVFsPBC1emtKEOvBQAAAKqDYOFlqttbUYZeCwAAAFQHwcLL1KS3ogy9FgAAALgUgoUXqWlvRRl6LQAAAHApBAsvUpveijL0WgAAAOBiCBZepDa9FWXS0tJ06NChOqwGAAAAjQnBwkuUlJQoLS3NqeeobW8HAAAAGj8/dxcA1/Dx8dHw4cP17bffqqSkxGFbSUmJsrKyJEn+/v4KCQmpcHzz5s3Vu3dvV5QKAACABsiowbh5Btg3UmfOnNE//vEPSdJVV12lcePGubki1DOjHp6T8wPQ8HFuAFCVap0fGAoFAAAAwGkECwAAAABOI1gAAAAAcBrBAgAAAIDTCBYAAAAAnEawAAAAAOA0ggUAAAAApxEsAAAAADiNYAEAAADAaQQLAAAAAE4jWAAAAABwGsECAAAAgNMIFgAAAACcRrAAAAAA4DSCBQAAAACnESwAAAAAOI1gAQAAAMBpBAsAAAAATiNYoN6ZpqnvvvtOW7duVW5urrvLAeBBCgsLlZKSou+++07FxcXuLgcA4AQ/dxeAxu/48eP6/PPPJUlJSUnq16+fBgwYoODgYDdXBsDdtm/frrVr10oqPT8MGTJEvXv3lq+vr5srAwDUFMEC9S47O9v6vqCgQJs2bdL27dsJGAAczg9ZWVlKTEzUxo0bCRgA0AARLOAWBAwAVSFgAEDDRLCAW9U0YKSkpGjWrFk6cOCAbDabzp8/rwkTJmj69OkurBqAK9Q0YHB+AAD3YvI2PEJZwHj99df11VdfVZjknZOTo7vvvluxsbHq16+fkpOTlZycrA0bNmjt2rWaPXu2myoHUN/KAsabb76pHTt2VJjkzfkBADwDwQIepbKAYbfbFRcXp4ULF+qjjz7So48+KpvNJkkKCQnR7bffrh07dlR4rsOHD2v8+PGu/hEA1JPKAgbnBwDwHAyFgkzTtL4/cuSIlixZUqfPn5WVVeNjygLGli1btH79eqWmpmr8+PGaMGGCw36maSoxMVHjxo1zaP/yyy81efJkXXbZZc6UDng9u92uDz74QHa7Xe3bt5ePT91+HpWenl7jY8oCxurVq7VlyxbODwDgIQgWXu7s2bP67LPPrMfnzp3Trl273FiRo8zMTCUlJUmSpk2bZrWnp6drw4YNevvtt9W9e3fdd999kqTU1FTNmDFD7du3V2BgoFtqBhqLn3/+WR9//LHy8/MlSbt373ZzRY5OnTqlL774QhLnBwDwBEb5T6svodo7wvOZpqnt27frq6++UmFhobvLqdL69eu1fv162Ww29e/fX0VFRfL19VVERIRiYmJ02223qUuXLpUeGxsbaz0HHBj18JycHxqR/Px8ffnll/rmm2/cXcpFcX6oc5wbAFSlWucHeiy80JkzZ7Rs2TIdOXLEamvevLkGDx5cL0MDDhw4oFWrVtX4OD8/P2uS5ujRo+t8iBaAig4ePKjExESH+0uUiYuLU48ePer09ZKTk2vVExISEmINy+L8AACegWDhRUpKSrRt2zatW7dORUVFVntMTIyGDx+ugICAenndU6dO1Wh/m82ma6+9VgMHDtTmzZslldYIoP7Y7XatWbNG3377rdVms9nUrVs368I/JCRELVu2rNPXremQpGbNmmnw4MG65ppr9NVXX0ni/AAAnoJg4SVOnz6tZcuWKS0tzWoLDQ3V2LFjPWYCY/lA0aRJE0lSly5dtHLlSoWFhVV5XElJiV5//XU9+eSTrioVaFR++uknLV++XOfOnbPaLrvsMo0ZM0aHDh3yiLkV5QOFn1/pny7ODwDgWQgWjVxJSYlSUlK0fv16h16Kfv36KT4+Xv7+/m6srlRlgaLMXXfdpTfeeEP79++v9Fi73a4pU6aoV69erigVaFTy8vK0evVqhwUb/P39NXLkSPXp00eGYejQoUNurLDyQFGG8wMAeBaCRSOWkZGhpUuX6tixY1ZbWFiYEhIS1KFDBzdWVupigaJM//79NXXqVH3wwQd68MEH1bNnT0lSbm6ulixZojfffFNTpkzRPffc48rSgQZv//79Wr58uXJycqy2yy+/XGPGjFFoaKj7CvvVxQJFGc4PAOBZCBaNUElJiTZv3qzk5GSHO9Red911GjZsmHXzKFf57br31QkU5b322mvq1q2bJk6cqMDAQAUEBMhms2n06NFavny5WrRoUV+lA41Obm6uVq1a5TC8KSAgQCNHjtQ111wjw6iPhYGq9tvXq06gKI/zAwB4DoJFI/PLL79o6dKlOn78uNXWsmVLJSQkKDo62i01dejQQWFhYbpw4YJiYmKqHSjKmzJliqZMmVJPFQLeYd++fVq+fLkuXLhgtXXu3FljxoxRs2bN3FJT9+7dtXPnTgUFBWnQoEHVDhTlcX4AAM9AsGgkiouLrV6KkpISSaWfBA4YMECxsbEu76UoLygoSI8++qgMw3D5p6EASnspVq5cqT179lhtgYGBuuGGG9S7d2+3/l526NBBTz/9tHx9fd1WAwCgbhAsGoGTJ09q6dKlOnnypNXWqlUrJSQkKCoqyo2V/dtvh0O5gt1ut0IW4K2+//57ffHFF8rNzbXarrjiCt18881q2rSpGyv7N3eECs4PAFD3CBYeJCsrS2vWrFHr1q11/fXXX/JTxOLiYm3cuFEbN2506KUYOHCgYmNjazycoDE4cuSIHnjgAR0+fFg//fSTJKlTp07q1KmT3n33XY9ZWheoqZ9//lkpKSnq27evunXrdsn9L1y4oBUrVuj777+32gIDA3XjjTfqqquu8sreQ84PAFC/vO/K00OZpqnPPvtMaWlp+uGHH9S0aVP16dOnyv1PnDihpUuXOtx8LiIiQgkJCWrbtq0rSvZIHTp00Jo1a9xdBlCnLly4oI8//lj5+fk6dOiQHnzwQUVERFS6r2ma2rt3r1asWKG8vDyrvVu3brrpppsUEhLiqrI9DucHAKhfBAsPsXfvXoeb161Zs0adO3euMKGyqKhIGzZs0KZNm2SapqTSXorBgwfr+uuv98peCqCxS0pKUn5+vqTSnsply5Zp0qRJFYYY5uTk6IsvvtC+ffustqCgII0ePVo9evTwyl4KAIDrcBXqAQoLC/Xll186tOXn5ysxMVF33XWXdTFw7NgxLV26VBkZGdZ+rVu3VkJCgtq0aePSmgG4xsmTJ7Vjxw6HtmPHjiklJUWDBg2SVNpLsXv3bq1cuVJ2u93ar3v37ho9enSNV2EDAKA2CBYeYMuWLTp37lyF9gMHDmjXrl3q2bOn1q9fry1btli9FD4+PhoyZIiGDBnCaipAI2WaplavXm393peXlJSkrl27KiAgQMuXL9ePP/5obQsODrZ6KQAAcBWChZtlZ2dr06ZNVW5fuXKlNmzYoLNnz1ptkZGRSkhIUGRkpCtKBOAmP/zwgw4fPlzptuLiYi1cuFC5ubnWMClJ6tmzp0aNGkUvBQDA5QgWbvbVV1+pqKioyu0FBQUqKCiQVNpLMXToUA0aNIheCqCRKyoqqjBE8rfKf+DQpEkT3XTTTbryyivruzQAACpFsHCjtLQ07d69u1r7hoaG6s4776xyJRgAjUtKSoqysrKqtW/Xrl01duxYBQcH129RAABchOvvWgZJpWOnV61aVe397XY7Fw2Alzh//rw2btxY7f3z8vIUFBRUjxUBAHBpBAs32bVrl44fP17t/e12u7744otKJ3ECaFy++uorFRYWVnv/o0ePavv27U69pmma1tDL8l/lh2oWFRVVug/nJQCAJBk1+IPAX446kp+frzfffFM5OTk1Pnb8+PHq2bNnPVQFL1IfNzPg/FBHjh07ptmzZ9f4OJvNpilTpqhFixY1PtZut2vu3LkOS1nXRHh4uCZNmqTAwMBaHQ+PwbkBQFWqdX6gx8INNm7cWKtQIUkrVqyo9bEAPFtNh0iWV1hYqGXLltWq9+DkyZO1DhWSlJGRoZMnT9b6eABA40CwcLGzZ89q69attT4+Ly9PSUlJdVgRAE+xe/dupaen1/r4I0eOaO/evTU+LioqSk2bNq316zZt2lRRUVG1Ph4A0DgQLFzs888/V3FxsVPPUdnN9AA0bPn5+VqxYoXTz5OdnV3jY/z8/DR48OBav+bgwYPl58cigwDg7fhL4EI//vij0tLSanxcYGCgmjdvrtDQULVo0UL9+vWrh+oAuNMXX3zhcKO76goJCbHOD5GRkbr22mtr9fp9+vTRpk2bdP78+Rod17RpU/Xp06dWrwkAaFwIFi5U1Y3wmjRpotDQUDVv3ty6QCh7HBoaqoCAABdXCsDVKjs/GIahZs2aVTg/lP+3rnoKynotVq5cWaPj6K0AAJThr4ELde/eXTfffLMyMzN1+eWXKywsTM2aNZPNZnN3aQDcJCUlRbNmzdJPP/2k3Nxc5eXl6ZZbbtGzzz6rpk2bysfHdSNWa9prQW8FAKA85lg44bnnntPAgQPVq1cvLV68WFLpyiyvvPKKRowYodjYWHXu3FlPPvmkNcShb9++GjlypDp37qyWLVsSKgAvlZOTo7vvvluxsbHq16+fNmzYoF27dmnHjh1KTU3V4sWLXRoqpJrPtaC3AgBQHn8Ramnp0qXKzMzUli1b9MQTT+jOO+9U27Zt9cILL+jee+/V6tWr5ePjo6SkJA0bNkz+/v568cUX3V02AA9gt9sVFxdnBYgJEyZY20JCQnT77bdrx44dDsds3LhRr7zyiux2u44ePaqxY8dqxowZatKkSZ3WVt1eC3orAAC/RY9FLb355pv67//+b0lSbm6uiouLNWHCBL388ssaP3689UnjoEGDJJVOzAQASXrssceUmpqq8ePHO4QKqfReFomJierbt6/VtmfPHr366qtatGiRVq1apRUrVuif//yn4uLiajXh+2Kq22tBbwUA4Lf4q1AL586dU15entq3by9J1ieLM2fOVLdu3Rz2zczMlCQmYAMN1D/+8Q/Nnz+/1sfbbDZ9/PHHio6OliQdOnRIc+fOlSRNmzbN2i89PV0bNmzQ22+/re7du+u+++6ztk2fPl3vvfeegoKCJEkdO3bUH/7wB02dOlVz5szRI488Uuv6KnOpXgt6KwAAlTFqcJfWmt/OtZE6d+6c9u/fr2uvvVZnzpxReHi4wsLC9Msvv1QYE7106VLdcsstmjhxoj744AP3FAw4MurhOTk/VNNzzz2nP//5z7LZbOrfv7+Kiork6+uriIgIxcTE6LbbblOXLl0cjgkJCVGHDh20Y8cO60OKXbt26eqrr9b48eP1ySef1Hmd27dvr3KFqBtvvJFlrxsnzg0AqlKt8wM9FrXQrFkza634devWqaSkRHFxcZVOtFyyZIkk6YYbbnBliQA81L59+yRJo0ePts4Pl9KhQwcdO3ZMhYWFVrAoKSmRJOXl5dVLnVX1WtBbAQCoCnMsnLR27VpJ0vDhwytsKyoqUmJiooKCgjRmzBhXlwbAA5XdGTsmJqbax2zdulU//fSTQkJCrLbdu3dLUr31HFQ114K5FQCAqhAsnFQWLOLj4ytsW7lypTIzMzV27FjrgiApKcml9QHwLGXDnMLCwqrcp6SkRK+++qr1uGnTpgoPD3fYZ/bs2YqIiNDjjz9eP4WqtNciMDDQehwYGEhvBQCgSgQLJxw5ckQHDx5Uhw4d1Llz5wrbyyZ8Tpw4UZKUlZWlv/zlLy6tEYBnueuuuyRJ+/fvr3S73W7XpEmTdLH5bytWrNDmzZv13nvvXTSgOMvPz09XXXWV9fiqq66itwIAUCWChRO+/PJLSZX3VkilvRPh4eEaOXKkJGnWrFm69957XVUeAA/Uv39/TZ06VQsWLNCePXus9tzcXC1cuFDDhg3TsGHD9NRTT1V6fEZGhh5++GG9//77SkhIqPd6R40apR49eqhHjx4aNWpUvb8eAKDh4qMnJ3z11VeSKp9fIUlt2rRRQECAfH19tWvXLq1fv16rVq1yZYkAPNBrr72mbt26aeLEiQoMDFRAQIBsNptGjx6t5cuXq0WLFpUeV1BQoNtuu00zZ87UPffc45JafXx8KtxrAwCAyrDcrBMmTZqkXbt2KTk52WFSZZkdO3bogQceUGBgoCIjI/X222+rdevWbqgUcMCSkg3Ugw8+qMGDBzuEigULFtRpyHjuuee0evVq5eTkaMaMGbrttttUWFioN954Q6tWrVJhYaHS09M1ZswYvfDCC9yjp3Hh3ACgKiw3W9/KbnJVlT59+uibb75xUTUAGrPXX39dffv2dQgRubm52rlzZ50Fi6VLlyozM1NbtmzRE088oTvvvFNt27bVCy+8oHvvvVerV6+Wj4+PkpKSNGzYMPn7++vFF1+sk9cGADR89FgA3odPJRuYNWvW6L777lNcXJxD+6lTp3TLLbfov/7rv+rkdUaMGKE5c+aoffv2evDBB/X+++8rMjJSSUlJ6tatm7VfQUGBAgIC1KNHD4d5ImjwODcAqAo9FgDQGNxxxx3KysrSRx99VGHbM888Uyevce7cOeXl5al9+/aSSodyStLMmTMdQoUkZWZmShLDoAAADggWAODhzp4965LXKbt3xpkzZ/Ttt9+qZcuWmjRpUoX9tm/fLkkOS9ECAMByswAANWvWTNdee60kad26dSopKVFcXJx8fCr+mViyZIkk6YYbbnBliQAAD0ewAAA4WLt2raTKl9IuKipSYmKigoKCNGbMGFeXBgDwYAQLAICDsmBR2c0/V65cqczMTI0dO9ZaZjspKcml9QEAPBPBAgBgOXLkiA4ePKgOHTqoc+fOFbbPnz9fkjRx4kRJUlZWlv7yl7+4tEYAgGciWAAALF9++aWkynsrpNLeifDwcI0cOVKSNGvWLN17772uKg8A4MFYFQoAYPnqq68kVT6/QpLatGmjgIAA+fr6ateuXVq/fr1WrVrlyhIBAB6KYAEAsAQFBalPnz5VTsxesGCBHnjgAQ0aNEiRkZFasGCBDKM+7qsGAGhouPM24H24uy6AynBuAFCVap0fmGMBAAAAwGkECwAAAABOI1gAAAAAcBrBAgAAAIDTCBYAAAAAnEawAAAAAOA0ggUAAAAApxEsAAAAADiNYAEAAADAaQQLAAAAAE4jWAAAAABwGsECAAAAgNMIFgAAAACcRrAAAAAA4DSCBQAAAACnESwAAAAAOI1gAQAAAMBpBAsAAAAATiNYAAAAAHAawQIAAACA0wgWAAAAAJxGsAAAAADgNIIFAAAAAKcRLAAAAAA4jWABAAAAwGkECwAAAABOI1gAAAAAcBrBAgAAAIDTCBYAAAAAnGaYpunuGgAAAAA0cPRYAAAAAHAawQIAAACA0wgWAAAAAJxGsAAAAADgNIIFAAAAAKcRLAAAAAA4jWABAAAAwGkECwAAAABOI1gAAAAAcNr/D0s/Ews41rhQAAAAAElFTkSuQmCC\n", "text/plain": [ "Graphics Array of size 3 x 3" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x1=arrow((0.5,0.2),(1.8,0.2),color='black')\n", "x2=arrow((0.5,0.2),(1.6,1.05),color='lightgrey')\n", "x3=arrow((0.5,0.2),(0.5,1.4),color='black')\n", "t1=text('$x_1$',(2.1,0.2),fontsize=20, color='black')\n", "t2=text('$x_2$',(1.5,1.4),fontsize=20, color='black')\n", "t3=text('$x_3$',(0.4,1.7),fontsize=20, color='black')\n", "#(x1+x2+x3).show(axes=False)\n", "\n", "l1=polygon2d([(0.5,0.2),(0.5,0.8),(1.0,0.8),(1,0.2)],\n", " fill=False,color='black')\n", "l2=polygon2d([(0.5,0.8),(0.8,1.),(1.3,1.),(1.0,0.8)],\n", " fill=False,color='black')\n", "l3=polygon2d([(1.0,0.2),(1.0,0.8),(1.3,1),(1.3,0.5)],\n", " fill=False,color='black')\n", "\n", "p11=x1+t1+x2+t2+x3+t3+l1+l2+l3\n", "\n", "e2=arrow((0,0),(-0.6,-0.6),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "t2=text('$-e_2$',(-0.75,-0.75),fontsize=20, color='black')\n", "e3=arrow((0,0),(0,1.2),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "t3=text('$e_3$',(0,1.4),fontsize=20, color='black')\n", "n=arrow((0,0),(-0.7,0),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "tn=text('$n$',(-0.8,0.),fontsize=20, color='black')\n", "left=text(\"$I^0_1$\",(1.8,0),fontsize=28, color='black')\n", "p10=e2+t2+e3+t3+n+tn+left\n", "\n", "e2=arrow((0,0),(0.6,0.6),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "t2=text('$e_2$',(0.75,0.75),fontsize=20, color='black')\n", "e3=arrow((0,0),(0,1.2),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "t3=text('$e_3$',(0,1.4),fontsize=20, color='black')\n", "n=arrow((0,0),(0.7,0),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "tn=text('$n$',(0.8,0.),fontsize=20, color='black')\n", "right=text(\"$I^1_1$\",(-1.9,0),fontsize=28, color='black')\n", "p12=e2+t2+e3+t3+n+tn+right\n", "\n", "e1=arrow((0,0),(0.7,0.0),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "t1=text('$e_1$',(0.8,0.0),fontsize=20, color='black')\n", "e2=arrow((0,0),(0.7,0.7),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "t2=text('$e_2$',(0.8,0.8),fontsize=20, color='black')\n", "n=arrow((0,0),(0,1),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "tn=text('$n$',(0.,1.1),fontsize=20, color='black')\n", "ttop=text(\"$I^1_3$\",(0,-1.9),fontsize=28, color='black')\n", "p01=e1+t1+e2+t2+n+tn+ttop\n", "\n", "e1=arrow((0,0),(0.7,0.0),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "t1=text('$e_1$',(0.8,0.0),fontsize=20, color='black')\n", "e2=arrow((0,0),(-0.7,-0.7),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "t2=text('$-e_2$',(-0.8,-0.8),fontsize=20, color='black')\n", "n=arrow((0,0),(0,-1),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "tn=text('$n$',(0.,-1.1),fontsize=20, color='black')\n", "bottom=text(\"$I^0_3$\",(0,1.8),fontsize=28, color='black')\n", "p21=e1+t1+e2+t2+n+tn+bottom\n", "\n", "e1=arrow((0,0),(-0.7,0.0),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "t1=text('$-e_1$',(-1,0.0),fontsize=20, color='black')\n", "e3=arrow((0,0),(0,1.2),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "t3=text('$e_3$',(0,1.4),fontsize=20, color='black')\n", "n=arrow((0,0),(0.7,0.7),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "tn=text('$n$',(0.8,0.8),fontsize=20, color='black')\n", "back=text(\"$I^1_2$\",(-1.8,-1.8),fontsize=28, color='black')\n", "p02=e1+t1+e3+t3+n+tn+back\n", "\n", "e1=arrow((0,0),(0.7,0.0),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "t1=text('$e_1$',(0.8,0.0),fontsize=20, color='black')\n", "e3=arrow((0,0),(0,1.2),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "t3=text('$e_3$',(0,1.4),fontsize=20, color='black')\n", "n=arrow((0,0),(-0.7,-0.7),color='grey',xmin=-2,ymin=-2,xmax=2,ymax=2)\n", "tn=text('$n$',(-0.8,-0.8),fontsize=20, color='black')\n", "front=text(\"$I^0_2$\",(1.8,1.8),fontsize=28, color='black')\n", "p20=e1+t1+e3+t3+n+tn+front\n", "\n", "graphics_array([[text(\"\",(1,1)),p01,p02],\n", " [p10,p11,p12],\n", " [p20,p21,text(\"\",(1,1))]]).show(axes=False,\n", " figsize=(8,6))" ] }, { "cell_type": "markdown", "id": "701eb065", "metadata": {}, "source": [ "If $k=3$, then the integral over the boundary of $\\ I\\ $ defined \n", "in (20.15) takes the form\n", "\n", "\\begin{equation}\n", "\\begin{matrix}\n", "\\int_{\\partial I}\\omega\n", "=\\sum_{i=1}^3(-1)^{i-1}\\big[\\int_{I^1_i}\\omega-\\int_{I^0_i}\\omega\\big] \\\\\n", "=\\int_{I^1_1}\\omega-\\int_{I^0_1}\\omega\n", "-\\int_{I^1_2}\\omega+\\int_{I^0_2}\\omega\n", "+\\int_{I^1_3}\\omega-\\int_{I^0_3}\\omega.\n", "\\end{matrix}\n", "\\tag{**}\n", "\\end{equation}\n", "\n", "The orientation of the boundary of $I$ prescribed by the unit outward normal vector implies that: \n", "\n", "on $I^1_1$ the frame $n,e_2,e3$ is in the same orientation class as $e_1,e_2,e_3$ in $R^3$,\n", "\n", "on $I^0_1$ the frame $n,-e_2,e_3$ is in the same orientation class as $e_1,e_2,e_3$ in $R^3$,\n", "\n", "on $I^1_2$ the frame $n,-e_1,e_3$ is in the same orientation class as $e_1,e_2,e_3$ in $R^3$,\n", "\n", "on $I^0_2$ the frame $n,e_1,e_3$ is in the same orientation class as $e_1,e_2,e_3$ in $R^3$,\n", "\n", "on $I^1_3$ the frame $n,e_1,e_2$ is in the same orientation class as $e_1,e_2,e_3$ in $R^3$,\n", "\n", "on $I^0_3$ the frame $n,e_1,-e_2$ is in the same orientation class as $e_1,e_2,e_3$ in $R^3$.\n", "\n", "This is in accordance with the fact that in (**) the integrals over $I^0_1,I^1_2,I^0_3$ are taken with the minus sign.\n", "\n", "As we can see, in the case $k=3$ the formula (20.15) agrees with\n", "the orientation of boundary of $I$ prescribed by the unit outward normal vector.\n" ] }, { "cell_type": "markdown", "id": "98db0612", "metadata": {}, "source": [ "
\n", "\n", "### Integrals of $(k-1)$-forms over $I^0_i$ and $I^1_i$\n", "\n", "
\n", "\n", "\n", "General smooth $(k-1)$-form on an open subset $U\\subset R^k$ containing $[0,1]^k$ is of the form\n", "\n", "\\begin{equation}\n", "\\omega=\\sum_{j=1}^k\\omega_j(x^1,\\ldots,x^k)dx^1\\wedge\\ldots \\widehat{dx^j}\n", "\\wedge\\ldots dx^k,\n", "\\tag{20.17}\n", "\\end{equation}\n", "($dx^j$ is omitted). \n", "\n", "Consider the single summand $\\ \\omega_j\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^j}\\wedge\\ldots\\wedge dx^k$.\n", "\n", "Since the map $I^0_i$ is\n", "given by (20.4)\n", "and $x^i=0$ is constant, for $i\\neq j$ we have\n", "\n", "$$\n", "\\int_{I^0_i}\\omega_j\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^j}\\wedge\\ldots\\wedge dx^k\\\\\n", "=\\int_{[0,1]^{k-1}}(I^0_i)^*(\\omega_j\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^j}\\wedge\\ldots\\wedge dx^k)\\\\\n", "=\\int_{[0,1]^{k-1}}\\omega_j(I^0_i(t))\n", "\\frac{\\partial(x^1,\\ldots 0\\ldots\\widehat{x^j}\\ldots,x^k)}{\\partial(t^{1},\\ldots,t^{k-1})}\n", "dt^{1}\\wedge\\ldots\\wedge dt^{k-1}=0\n", "$$\n", "\n", "and analogously for $I^1_i$ , so if $i\\neq j$\n", "\n", "\\begin{equation}\n", "\\begin{matrix}\n", "\\int_{I^0_i}\\omega_j\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^j}\\wedge\\ldots\\wedge dx^k=0,\\\\\n", "\\int_{I^1_i}\\omega_j\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^j}\\wedge\\ldots\\wedge dx^k=0.\n", "\\end{matrix}\n", "\\tag{20.18}\n", "\\end{equation}\n", "\n", "If $i=j$ we have\n", "\n", "$$\\int_{I^0_i}\\omega_i\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^i}\\wedge\\ldots\\wedge dx^k\\\\\n", "=\\int_{[0,1]^{k-1}}(I^0_i)^*(\\omega_i\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^i}\\wedge\\ldots\\wedge dx^k)\\\\\n", "=\\int_{[0,1]^{k-1}}\\omega_i(I^0_i(t))\n", "\\frac{\\partial(x^1,\\ldots\\widehat{x^i}\\ldots,x^k)}{\\partial(t^{1},\\ldots,t^{k-1})}\n", "dt^{1}\\wedge\\ldots\\wedge dt^{k-1}\\\\\n", "=\\int_{[0,1]^{k-1}}\\omega_i(I^0_i(t))\n", "dt^{1}\\ldots dt^{k-1}\\\\\n", "=\\int_{[0,1]^{k-1}}\\omega_i\\big|_{x^i=0}\n", "dx^{1}\\ldots\\widehat{dx^i}\\ldots dx^{k}\\\\\n", "=\\int_{[0,1]^{k}}\\omega_i\\big|_{x^i=0}\n", "dx^{1}\\ldots\\ldots dx^{k}.\n", "$$\n", "\n", "The last equality follows from the fact, that if a function $g$ is constant with respect to $x^i$, then $g=\\int_0^1 gdx^i$.\n", "\n", "\n", "Analogously we can compute the integral over $I^1_i$, so\n", "\n", "\\begin{equation}\n", "\\begin{matrix}\n", "\\int_{I^0_i}\\omega_i\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^i}\\wedge\\ldots\\wedge dx^k\\\\\n", "=\\int_{[0,1]^{k}}\\omega_i\\big|_{x^i=0}\n", "dx^{1}\\ldots dx^{k},\n", "\\end{matrix}\n", "\\tag{20.19}\n", "\\end{equation}\n", "and\n", "\\begin{equation}\n", "\\begin{matrix}\n", "\\int_{I^1_i}\\omega_i\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^i}\\wedge\\ldots\\wedge dx^k\\\\\n", "=\\int_{[0,1]^{k}}\\omega_i\\big|_{x^i=1}\n", "dx^{1}\\ldots dx^{k}.\n", "\\end{matrix}\n", "\\tag{20.20}\n", "\\end{equation}" ] }, { "cell_type": "markdown", "id": "8c7579ee", "metadata": {}, "source": [ "
\n", "\n", "### Stokes theorem on the standard $k$-cube\n", "\n", "
\n", "\n", "Consider a smooth $(k-1)$-form (20.17) on an open subset $V\\subset R^k$ containing $[0,1]^k$ and\n", " let $I$ be the standard $k$-cube defined in (20.3).\n", "Let us compute $\\ \\int_I d\\omega.$\n", "\n", "By linearity we can compute each summand\n", "\n", "$$\\int_I d(\\omega_idx^1\\wedge\\ldots \\widehat{dx^i}\\wedge\\ldots dx^k)$$\n", "\n", "separately. Let us focus on $i=1$ first. We have\n", "\n", "$$\\int_I d(\\omega_1 \\widehat{dx^1}\\wedge dx^2\\wedge\\ldots\\wedge dx^k)\\\\\n", "=\\int_{[0,1]^k}I^*( d(\\omega_1 dx^2\\wedge\\ldots\\wedge dx^k))\\\\\n", "=\\int_{[0,1]^k} d(I^*(\\omega_1 dx^2\\wedge\\ldots\\wedge dx^k))\\\\\n", "=\\int_{[0,1]^k}\\frac{\\partial \\omega_1}{\\partial t^1}dt^1\\wedge\\ldots\\wedge dt^k\\\\\n", "=\n", "\\int_{t^k=0}^{1}\\ldots\\int_{t^1=0}^{1}\n", "\\frac{\\partial \\omega_1}{\\partial t^1}dt^1\\ldots dt^k\\\\\n", "=\\int_{t^k=0}^{1}\\ldots\\int_{t^2=0}^{1}\n", "\\big[\\omega_1(t)\\big|_{t^1=1}-\\omega_1(t)\\big|_{t^1=0}\\big]dt^2\\ldots dt^k. \n", "$$\n", "\n", "Since the integrand $g=\\omega_1(t)\\big|_{t^1=1}-\\omega_1(t)\\big|_{t^1=0}$ does not depend on $t^1$ it is equal to its integral $\\int^1_0g\\;dt^1$, so\n", "\n", "$$\\int_I d(\\omega_1 \\widehat{dx^1}\\wedge dx^2\\wedge\\ldots\\wedge dx^k)\\\\\n", "=\\int_{[0,1]^k}\\big[\\omega_1(t)\\big|_{t^1=1}-\\omega_1(t)\\big|_{t^1=0}\\big]dt^1\\ldots dt^k\\\\\n", "=\\int_{[0,1]^k}\\big[\\omega_1\\big|_{x^1=1}-\\omega_1\\big|_{x^1=0}\\big]dx^1\\ldots dx^k\\\\\n", "=\\int_{I_1^1}\\omega_1\\widehat{dx^1}\\wedge dx^2\\wedge\\ldots\\wedge dx^k\n", "-\\int_{I_1^0}\\omega_1\\widehat{dx^1}\\wedge dx^2\\wedge\\ldots\\wedge dx^k.\n", "$$\n", "\n", "In the last equality we have used (20.19) and (20.20) for $i=1$." ] }, { "cell_type": "markdown", "id": "814ba087", "metadata": {}, "source": [ "\n", "\n", "For $i=2$ we have\n", "\n", "$$\\int_I d(\\omega_2 dx^1\\wedge\\widehat{dx^2}\\wedge dx^3\\ldots\\wedge dx^k)\\\\\n", "=\\int_{[0,1]^k}I^*( d(\\omega_2 dx^1\\wedge dx^3\\ldots\\wedge dx^k))\\\\\n", "=\\int_{[0,1]^k} d(I^*(\\omega_2 dx^1\\wedge dx^3\\ldots\\wedge dx^k))\\\\\n", "=\\int_{[0,1]^k}\\frac{\\partial \\omega_2}{\\partial t^2}dt^2\\wedge dt^1\\wedge dt^3\\ldots\\wedge dt^k\\\\\n", "=(-1)\\int_{[0,1]^k}\\frac{\\partial \\omega_2}{\\partial t^2}dt^1\\wedge dt^2\\wedge dt^3\\ldots\\wedge dt^k\\\\\n", "=(-1)\\int_{t^k=0}^{1}\\ldots\\int_{t^2=0}^1\\int_{t^1=0}^{1}\n", "\\frac{\\partial \\omega_2}{\\partial t^2}dt^1\\ldots dt^k\\\\\n", "=(-1)\\int_{t^k=0}^{1}\\ldots\\int_{t^3=0}^1\\int_{t^1=0}^1\\int_{t^2=0}^{1}\n", "\\frac{\\partial \\omega_2}{\\partial t^2}dt^2dt^1 dt^3\\ldots dt^k\\\\\n", "=(-1)\\int_{t^k=0}^{1}\\ldots\\widehat{\\int_{t^2=0}^1}\\int_{t^1=0}^{1}\n", "\\big[\\omega_2(t)\\big|_{t^2=1}-\\omega_2(t)\\big|_{t^2=0}\\big]dt^1\\ldots\\widehat{dt^2}\\ldots dt^k. \n", "$$\n", "\n", "Since the integrand $g=\\omega_2(t)\\big|_{t^2=1}-\\omega_2(t)\\big|_{t^2=0}$ does not depend on $t^2$ it is equal to its integral $\\int^1_0g\\;dt^2$, so\n", "\n", "$$\\int_I d(\\omega_2 dx^1\\wedge dx^3\\wedge\\ldots\\wedge dx^k)\\\\\n", "=(-1)\\int_{[0,1]^k}\\big[\\omega_2(t)\\big|_{t^2=1}-\\omega_2(t)\\big|_{t^2=0}\\big]dt^1\\ldots dt^k\\\\\n", "=(-1)\\int_{[0,1]^k}\\big[\\omega_2\\big|_{x^2=1}-\\omega_2\\big|_{x^2=0}\\big]dx^1\\ldots dx^k\\\\\n", "=(-1)\\big[\\int_{I_2^1}\\omega_2dx^1\\wedge\\widehat{dx^2}\\wedge\\ldots\\wedge dx^k\n", "-\\int_{I_2^0}\\omega_2dx^1\\wedge\\widehat{dx^2}\\wedge\\ldots\\wedge dx^k\\big].\n", "$$\n", "\n", "In the last equality we have used (20.19) and (20.20) for $i=2$." ] }, { "cell_type": "markdown", "id": "f9fa117b", "metadata": {}, "source": [ "Now we are ready to consider the complete $(k-1)$ form (20.17). First compute the exterior differential\n", "\n", "$$d\\omega=\\sum_{i=1}^k\\frac{\\partial \\omega_i}{\\partial x^i}\n", "dx^i\\wedge dx^1\\wedge\\ldots \\widehat{dx^i}\\wedge\\ldots\\wedge dx^k\\\\\n", "=\\sum_{i=1}^k (-1)^{i-1}\\frac{\\partial \\omega_i}{\\partial x^i}\n", "dx^1\\wedge\\ldots \\wedge dx^i\\wedge\\ldots\\wedge dx^k\\\\\n", "=\\big(\\sum_{i=1}^k (-1)^{i-1}\\frac{\\partial \\omega_i}{\\partial x^i}\\big)\n", "dx^1\\wedge\\ldots \\wedge dx^i\\wedge\\ldots\\wedge dx^k,\n", "$$\n", "\n", "and next the integral\n" ] }, { "cell_type": "markdown", "id": "ebdf63aa", "metadata": {}, "source": [ "$$\\int_{I}d\\omega=\\sum_{i=1}^k(-1)^{i-1}\\int_{I}\n", "\\frac{\\partial \\omega_i}{\\partial x^i}\n", "dx^1\\wedge\\ldots \\wedge dx^i\\wedge\\ldots\\wedge dx^k\\\\\n", "=\\sum_{i=1}^k(-1)^{i-1}\\int_{t^k=0}^{1}\n", "\\ldots\\widehat{\\int_{t^i=0}^{1}}\\ldots\\int_{t^1=0}^{1}\\int_{t^i=0}^{1}\n", "\\frac{\\partial \\omega_i}{\\partial t^i}\n", "dt^idt^1\\ldots \\widehat{dt^i}\\ldots dt^k\\\\\n", "=\\sum_{i=1}^k(-1)^{i-1}\\int_{t^k=0}^{1}\n", "\\ldots\\widehat{\\int_{t^i=0}^{1}}\\ldots\\int_{t^1=0}^{1}\n", "[\\omega_i\\big|_{x^i=1}-\\omega_i\\big|_{x^i=0}]dt^1\\ldots \\widehat{dt^i}\\ldots dt^k\\\\\n", "=\\sum_{i=1}^k(-1)^{i-1}\\int_{[0,1]^k}\n", "\\big[\\omega_i\\big|_{x^i=1}-\\omega_i\\big|_{x^i=0}\\big]dx^1\\ldots \\ldots dx^k\\\\\n", "=\\sum_{i=1}^k(-1)^{i-1}\\big[\\int_{I^1_i}\\omega_i\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^i}\\wedge\\ldots\\wedge dx^k\\\\\n", "-\\int_{I^0_i}\\omega_i\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^i}\\wedge\\ldots\\wedge dx^k\\big].\n", "$$" ] }, { "cell_type": "markdown", "id": "ccf307c9", "metadata": {}, "source": [ "As a consequence of (20.18)-(20.20) we obtain\n", "\n", "$$\n", "\\int_{I^0_i}\\omega_i\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^i}\\wedge\\ldots\\wedge dx^k\n", "=\\int_{I^0_i}\\omega,\\\\\n", "\\int_{I^1_i}\\omega_i\n", "dx^1\\wedge\\ldots \\wedge \\widehat{dx^i}\\wedge\\ldots\\wedge dx^k\n", "=\\int_{I^1_i}\\omega.\n", "$$\n", "\n", "Thus we have checked that\n", "\n", "\\begin{equation}\n", "\\int_{I}d\\omega=\n", "\\sum_{i=1}^k(-1)^{i-1}\\big[\\int_{I^1_i}\\omega-\\int_{I^0_i}\\omega\\big].\n", "\\tag{20.21}\n", "\\end{equation}" ] }, { "cell_type": "markdown", "id": "249b7fe2", "metadata": {}, "source": [ "Recall, that in (20.15) we defined the boundary integral of $\\omega$ as\n", "$\n", "\\int_{\\partial I}\\omega=\\sum_{i=1}^k(-1)^{i-1}\\big[\\int_{I^1_i}\\omega-\\int_{I^0_i}\\omega\\big],\n", "$\n", "so we get:\n", "\n", "
\n", "\n", "### Formulation of Stokes theorem on the standard $k$-cube.\n", "\n", "
\n", "\n", "If $\\ \\omega\\ $ is a smooth $(k-1)$-form (20.17) on an open set $U\\subset R^k$ containing $[0,1]^k$,$\\ \\ I$ is the standard $k$-cube defined in (20.3)\n", "and if the boundary integral $\\ \\int_{\\partial I}\\omega\\ $ is defined by (20.15), then\n", "\n", "\\begin{equation}\n", "\\int_{I}d\\omega=\\int_{\\partial I}\\omega.\n", "\\tag{20.22}\n", "\\end{equation}" ] }, { "cell_type": "markdown", "id": "865bf075", "metadata": {}, "source": [ "
\n", "\n", "**Example 20.3**\n", "\n", "Using Stokes theorem compute the integral\n", "$\\ \\int_{\\partial I} xy^2zdx\\wedge dy,\\ $ where $\\partial I$ denotes the boundary of the unit cube\n", "$[0,1]\\times[0,1]\\times[0,1]$, oriented by the outward unit normal.\n", "\n", "
\n", "\n", "Using Stokes theorem we can replace the integral by $\\int_I da,\\ $ where $a=xy^2zdx\\wedge dy,$\n", "\n", "so we start from definition of 2-form $a$ and computing its exterior derivative $da$." ] }, { "cell_type": "code", "execution_count": 4, "id": "adeb7c04", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle x y^{2} \\mathrm{d} x\\wedge \\mathrm{d} y\\wedge \\mathrm{d} z\\)" ], "text/latex": [ "$\\displaystyle x y^{2} \\mathrm{d} x\\wedge \\mathrm{d} y\\wedge \\mathrm{d} z$" ], "text/plain": [ "x*y^2 dx∧dy∧dz" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(3, 'R^3') # manifold M=R^3\n", "c_xyz. = M.chart() # Cartesian coordinates\n", "a=M.diff_form(2,name='a') # 2-form a\n", "E=c_xyz.coframe() # coframe (dx,dy,dz)\n", "dx,dy,dz=E[:] # define dx,dy,dz\n", "a=x*y^2*z*dx.wedge(dy) # define 2-form a\n", "da=a.exterior_derivative() # exterior derivative of a\n", "da.disp() # show da" ] }, { "cell_type": "markdown", "id": "f0bf7090", "metadata": {}, "source": [ "Computing $\\int_I da,\\ $ we use (20.13) and the iterated integral\n", "$\\int_0^1\\int_0^1\\int_0^1 xy^2dzdydx.$" ] }, { "cell_type": "code", "execution_count": 5, "id": "21daa269", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\frac{1}{6}\\)" ], "text/latex": [ "$\\displaystyle \\frac{1}{6}$" ], "text/plain": [ "1/6" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(integrate(integrate(x*y^2,(z,0,1)),(y,0,1)),(x,0,1))" ] }, { "cell_type": "markdown", "id": "6d1f0e8f", "metadata": {}, "source": [ "
\n", "\n", "### Formulation of Stokes theorem on singular $k$-cubes\n", "\n", "
\n", "\n", "Assume that $V$ is an open subset of $R^k$, let\n", "$\\omega$ be a smooth $(k-1)$-form on $V$ and $\\phi:I\\to V$ \n", "be singular $k$-cube.\n", "Recall that in (20.16) we defined the boundary integral of $\\omega$ over $\\partial \\phi$ as\n", "$\\ \\ \\int_{\\partial\\phi}\\omega=\n", "\\sum_{i=1}^k(-1)^{i-1}\\big[\\int_{\\phi^1_i}\\omega-\\int_{\\phi^0_i}\\omega\\big]$.\n", "\n", "\n", "The Stokes theorem on singular $k$-cubes reads as follows\n", "\n", "\\begin{equation}\n", "\\int_{\\phi} d\\omega=\n", "\\int_{\\partial\\phi}\\omega.\n", "\\tag{20.23}\n", "\\end{equation}" ] }, { "cell_type": "markdown", "id": "59b5842c", "metadata": {}, "source": [ "
\n", "\n", "\n", "Before the proof we check that for arbitrary singular $k$-cube $\\phi:I\\to V$ and $(k-1)$-form on $V$ the following relation holds true\n", "\n", "\\begin{equation}\n", "\\int_{\\partial\\phi}\\omega=\\int _{\\partial I}\\phi^*\\omega.\n", "\\tag{20.24}\n", "\\end{equation}\n", "\n", "Let us compute both sides separately.\n", "\n", "$$\\int_{\\partial\\phi}\\omega=\\sum_{i=1}^k(-1)^{i-1}\\big(\\int_{\\phi^1_i}\\omega\n", "-\\int_{\\phi^0_i}\\omega\\big)\\\\\n", "=\n", "\\sum_{i=1}^k(-1)^{i-1}\\big(\\int_{[0,1]^{k-1}}(\\phi^1_i)^*\\omega\n", "-\\int_{[0,1]^{k-1}}(\\phi^0_i)^*\\omega\\big).\n", "$$\n", "\n", "From the properties of pullback we know, that $\\phi^1_i=\\phi\\circ I^1_i$ implies $(\\phi^1_i)^*=(I^1_i)^*\\circ\\phi^*$ and analogously $(\\phi^0_i)^*=(I^0_i)^*\\circ\\phi^*$. Thus\n", "\n", "$$\\int_{\\partial\\phi}\\omega=\n", "\\sum_{i=1}^k(-1)^{i-1}\\big(\\int_{[0,1]^{k-1}}(I^1_i)^*\\circ\\phi^*\\omega\n", "-\\int_{[0,1]^{k-1}}(I^0_i)^*\\circ\\phi^*\\omega\\big).\n", "$$\n", "\n", "On the other hand from (20.15)\n", "\n", "$$\n", "\\int_{\\partial I}\\phi^*\\omega=\\sum_{i=1}^k (-1)^{i-1}\\big(\\int_{I^1_i}\\phi^*\\omega\n", "-\\int_{I^0_i}\\phi^*\\omega\\big)\\\\\n", "=\\sum_{i=1}^k (-1)^{i-1}\\big(\\int_{[0,1]^{k-1}}(I^1_i)^*\\circ\\phi^*\\omega\n", "-\\int_{[0,1]^{k-1}}(I^0_i)^*\\circ\\phi^*\\omega\\big),\n", "$$\n", "\n", "so both sides of (20.24) are equal.\n", "\n", "\n", "\n", "The formula (20.23) is a consequence of (20.22) and (20.24), since\n", "\n", "\n", "$$\\int_{\\phi} d\\omega=\\int_I\\phi^*d\\omega\n", "=\\int_Id(\\phi^*\\omega)=\\int_{\\partial I}\\phi^*\\omega=\\int_{\\partial\\phi}\\omega.\n", "$$\n" ] }, { "cell_type": "markdown", "id": "bcc64485", "metadata": {}, "source": [ "
\n", "\n", "### Extending the integration domains\n", "\n", "
" ] }, { "cell_type": "markdown", "id": "e7d47f5c", "metadata": {}, "source": [ "Assume that $f,g$ are smooth functions on $[a,b],$ $\\ f\\leq g\\ $and define the set\n", "\n", "\\begin{equation}\n", "D =\n", "\\{(u, v) ∈ R^2 : a ≤ u ≤ b, f (u) ≤ v ≤ g(u)\\}.\n", "\\tag{20.25}\n", "\\end{equation} \n", "\n", " Consider the mapping\n", "\n", "$$\n", "ψ: [0,1]^2\\ni\n", "(s, t) \\to \\big((1-s)a+sb,(1-t)f(1-s)a+sb)+tg((1-s)a+sb)\\big)\\in D\\subset R^2.\n", "$$\n", "\n", "One can prove that\n", "\n", "$ ψ : [0,1]^2 → D$ is one-to-one and $\\psi(I^2)=D$.\n", "\n", "\n", "\n", "If $\\phi:D\\to R^2$ is a smooth map, then $φ ◦ ψ : [0,1]^2 → \\phi(D)\\subset R^2$ is a singular 2-cube, so for 1-forms on some neighborhood of $\\phi(D)$ Stokes formula takes the form\n", "\n", "$$\\int_{\\phi\\circ\\psi}d\\omega=\n", "\\int_{\\partial(\\phi\\circ\\psi)}\\omega.$$\n", "\n", "If we define $\\ \\ \\int_{\\phi_D}d\\omega=\\int_{\\phi\\circ\\psi}d\\omega\\ \\ $\n", "and $\\ \\ \\int_{\\partial \\phi_D}\\omega=\\int_{\\partial(\\phi\\circ\\psi)}\\omega,\\ \\ $ then\n", "\n", "$$\\int_{\\phi_D}d\\omega=\\int_{\\phi\\circ\\psi}d\\omega=\n", "\\int_{\\partial(\\phi\\circ\\psi)}\\omega=\\int_{\\partial \\phi_D}\\omega,\n", "$$\n", "\n", "so we can use Stokes theorem for domains of type (20.25).\n", "\n", "\n", "Thus Stokes theorem can be applied to domains whose parameterizations can be reparameterized into unit cubes.\n", "\n", "**Remark.** In practice, computing integrals $\\int_{\\phi_D} \\omega$ for $\\omega$ of the form \n", "$\\omega=hdx^1\\wedge dx^2$ on $\\phi(D)$ we do not use reparametrizations but the formula\n", "$$\\int_{\\phi_D}\\omega=\\int_a^b\\int_{f(u)}^{g(u)}h(\\phi(u,v))\\frac{\\partial(\\phi^1,\\phi^2)}{\\partial(u,v)}dudv.$$" ] }, { "cell_type": "markdown", "id": "125f6370", "metadata": {}, "source": [ "One can prove that Stokes theorem can be applied to analogous domains in higher dimensions, for example\n", "\n", "$$D =\n", "\\{(u_1,u_2,u_3 ) ∈ R^3\n", ": a_1 ≤ u_1 ≤ b_1, c(u_1)\\leq u_2\\leq d(u_1), f (u_1,u_2) ≤ u_3 ≤ g(u_1,u_2)\\},\n", "$$\n", "\n", "for some smooth functions $c,d,f,g$." ] }, { "cell_type": "markdown", "id": "d4eadbbf", "metadata": {}, "source": [ "
\n", "\n", "**Example 20.4**\n", "\n", "Compute $\\ \\int_{S^2}xdy\\wedge dz+ydz\\wedge dx+zdx\\wedge dy,$\n", "where $S^2$ denotes the 2-dimensional unit sphere, which can be considered as the (reparametrized version of) singular 2-cube $\\phi:[0,\\pi]\\times[0,2\\pi]\\to R^3$\n", "\n", "$$(\\theta,\\phi)\\to (\\sin(\\theta)\\cos(\\phi), \\sin(\\theta)\\sin(\\phi),\\cos(\\theta)).$$\n", "\n", "
\n", "\n", "We define the 2-form $a$ first." ] }, { "cell_type": "code", "execution_count": 6, "id": "10f0857e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle z \\mathrm{d} x\\wedge \\mathrm{d} y -y \\mathrm{d} x\\wedge \\mathrm{d} z + x \\mathrm{d} y\\wedge \\mathrm{d} z\\)" ], "text/latex": [ "$\\displaystyle z \\mathrm{d} x\\wedge \\mathrm{d} y -y \\mathrm{d} x\\wedge \\mathrm{d} z + x \\mathrm{d} y\\wedge \\mathrm{d} z$" ], "text/plain": [ "z dx∧dy - y dx∧dz + x dy∧dz" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(3, 'R^3') # manifold M=R^3\n", "c_xyz. = M.chart() # Cartesian coordinates\n", "N = Manifold(2, 'N') # manifold N=S^2\n", "c_sph.=N.chart() # spherical coordinates\n", "# embedding S^2->R^3 defines the singular 2-cube phi\n", "Phi = N.diff_map(M, (sin(theta)*cos(phi), sin(theta)*sin(phi),cos(theta)),\n", " name='ph',latex_name=r'\\Phi')\n", "a=M.diff_form(2,name='a') # 2-form on N a\n", "E=c_xyz.coframe() # coframe (dx,dy,dz)\n", "dx,dy,dz=E[:] # define dx,dy,dz\n", "a=x*dy.wedge(dz)+y*dz.wedge(dx)+z*dx.wedge(dy) # define a\n", "a.disp() # show a" ] }, { "cell_type": "markdown", "id": "dc73ed0e", "metadata": {}, "source": [ "To use (reparametrized version of) (20.11) we need the pullback $\\Phi^*a$." ] }, { "cell_type": "code", "execution_count": 7, "id": "7ccabef3", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\sin\\left(\\theta\\right) \\mathrm{d} \\theta\\wedge \\mathrm{d} \\phi\\)" ], "text/latex": [ "$\\displaystyle \\sin\\left(\\theta\\right) \\mathrm{d} \\theta\\wedge \\mathrm{d} \\phi$" ], "text/plain": [ "sin(theta) dtheta∧dphi" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phi.pullback(a).disp()" ] }, { "cell_type": "markdown", "id": "2b542caf", "metadata": {}, "source": [ "To obtain the final result we use the iterated integral\n", "$\\int_0^{2\\pi}\\int_0^\\pi \\sin\\theta\\; d\\theta d\\phi$." ] }, { "cell_type": "code", "execution_count": 8, "id": "b141cccc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle 4 \\, \\pi\\)" ], "text/latex": [ "$\\displaystyle 4 \\, \\pi$" ], "text/plain": [ "4*pi" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(integrate(sin(theta), (theta,0,pi)), (phi,0,2*pi))" ] }, { "cell_type": "markdown", "id": "65a9bfbb", "metadata": {}, "source": [ "
\n", "\n", "**Example 20.5**\n", "\n", "Compute $\\ \\int_S \\frac{1}{3}zdx\\wedge dy\\ $ where $S$ is the part of the elliptic cone \n", "$\\ \\frac{x^2}{6}+\\frac{y^2}{9}= z^2,\\ $ bounded by the planes $z=-1,z=1$, which may be considered as (reparametrized version of) the singular 2-cube $\\psi:[-1,1]\\times[0,2\\pi]\\to R^3$\n", "\n", "$$(Z,\\phi)\\to (2Z\\cos(\\phi), 3Z\\sin(\\phi),Z).\n", "$$\n", "\n", "
\n", "\n", "Let us define 2-form $a$ and its pullback under $\\psi$." ] }, { "cell_type": "code", "execution_count": 9, "id": "6f5995c1", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle -2 \\, Z^{2} \\mathrm{d} \\phi\\wedge \\mathrm{d} Z\\)" ], "text/latex": [ "$\\displaystyle -2 \\, Z^{2} \\mathrm{d} \\phi\\wedge \\mathrm{d} Z$" ], "text/plain": [ "-2*Z^2 dphi∧dZ" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(3, 'R^3') # manifold M=R^3\n", "c_xyz. = M.chart() # Cartesian coordinates\n", "N = Manifold(2, 'N') # manifold N=S^2\n", "c_sph.=N.chart() # spher. coordinates\n", "E=c_xyz.coframe() # coframe (dx,dy,dz)\n", "dx,dy,dz=E[:] # define dx,dy,dz\n", "a=1/3*z*dx.wedge(dy) # 2-form a\n", "# psi defines the singular 2-cube\n", "psi = N.diff_map(M, (2*Z*cos(phi), 3*Z*sin(phi),Z),\n", " name='psi',latex_name=r'\\psi')\n", "psi.pullback(a).disp() # pullback psi^*a" ] }, { "cell_type": "markdown", "id": "064017c3", "metadata": {}, "source": [ "We use (reparametrized version of) (20.11) and replace the double integral by the iterated integral $\\int_0^{2\\pi}\\int_{-1}^1(-2Z^2)\\;dZd\\phi.$" ] }, { "cell_type": "code", "execution_count": 10, "id": "f7db10c5", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle -\\frac{8}{3} \\, \\pi\\)" ], "text/latex": [ "$\\displaystyle -\\frac{8}{3} \\, \\pi$" ], "text/plain": [ "-8/3*pi" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(integrate(-2*Z^2,(Z,-1,1)),(phi,0,2*pi))" ] }, { "cell_type": "markdown", "id": "6a6e5cec", "metadata": {}, "source": [ "
\n", "\n", "**Example 20.6**\n", "\n", "Compute the integral $\\int_S xdy\\wedge dz +zdz\\wedge dx$, where $S$ is the sphere\n", "$x^2+y^2+z^2=9.$\n", "\n", "
\n", "\n", "First we define the 2-form $a$," ] }, { "cell_type": "code", "execution_count": 11, "id": "167b60de", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle -z \\mathrm{d} x\\wedge \\mathrm{d} z + x \\mathrm{d} y\\wedge \\mathrm{d} z\\)" ], "text/latex": [ "$\\displaystyle -z \\mathrm{d} x\\wedge \\mathrm{d} z + x \\mathrm{d} y\\wedge \\mathrm{d} z$" ], "text/plain": [ "-z dx∧dz + x dy∧dz" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E.=EuclideanSpace(3,\"E\") # Euclidean space E^3\n", "cart=E.cartesian_coordinates() # Cartesian coordinates\n", "spher. = E.spherical_coordinates() # spherical coordinates\n", "Phi=E.coord_change(spher, cart) # transition spher -> cart \n", "a=E.diff_form(2,name='a') # 2-form a\n", "cf=c_xyz.coframe() # coframe (dx,dy,dz)\n", "dx,dy,dz=cf[:] # define dx,dy,dz\n", "a=x*dy.wedge(dz)+z*dz.wedge(dx) # define 2-form a\n", "a.disp() # show a" ] }, { "cell_type": "markdown", "id": "124ab73e", "metadata": {}, "source": [ "and its exterior differential:" ] }, { "cell_type": "code", "execution_count": 12, "id": "a5c16788", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\mathrm{d} x\\wedge \\mathrm{d} y\\wedge \\mathrm{d} z\\)" ], "text/latex": [ "$\\displaystyle \\mathrm{d} x\\wedge \\mathrm{d} y\\wedge \\mathrm{d} z$" ], "text/plain": [ "dx∧dy∧dz" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "da=a.exterior_derivative()\n", "da.disp()" ] }, { "cell_type": "markdown", "id": "919e9a62", "metadata": {}, "source": [ "Using spherical coordinates $(\\theta,\\phi)$, the sphere can be considered as reparametrized singular $2$-cube\n", "$\\ \\ [0,\\pi]\\times[0,2\\pi]\\to R^3$." ] }, { "cell_type": "code", "execution_count": 13, "id": "756fd54f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left\\{\\begin{array}{lcl} x_{1} & = & r \\cos\\left({\\phi}\\right) \\sin\\left({\\theta}\\right) \\\\ x_{2} & = & r \\sin\\left({\\phi}\\right) \\sin\\left({\\theta}\\right) \\\\ x_{3} & = & r \\cos\\left({\\theta}\\right) \\end{array}\\right.\\)" ], "text/latex": [ "$\\displaystyle \\left\\{\\begin{array}{lcl} x_{1} & = & r \\cos\\left({\\phi}\\right) \\sin\\left({\\theta}\\right) \\\\ x_{2} & = & r \\sin\\left({\\phi}\\right) \\sin\\left({\\theta}\\right) \\\\ x_{3} & = & r \\cos\\left({\\theta}\\right) \\end{array}\\right.$" ], "text/plain": [ "x1 = r*cos(ph)*sin(th)\n", "x2 = r*sin(ph)*sin(th)\n", "x3 = r*cos(th)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phi.disp()" ] }, { "cell_type": "code", "execution_count": 14, "id": "e22df778", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle r^{2} \\sin\\left({\\theta}\\right)\\)" ], "text/latex": [ "$\\displaystyle r^{2} \\sin\\left({\\theta}\\right)$" ], "text/plain": [ "r^2*sin(th)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jac=Phi.jacobian_det();jac" ] }, { "cell_type": "markdown", "id": "7b765061", "metadata": {}, "source": [ "So if we apply (reparametrized version of) (20.12), and the relation $\\int_0^{2\\pi}d\\phi=2\\pi$, we obtain the following form of the iterated integral: \n", "$2\\pi(\\int_0^3r^2\\;dr)\n", "\\int_0^\\pi\\sin(\\theta)\\;d\\theta.$" ] }, { "cell_type": "code", "execution_count": 15, "id": "12aa740c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle 36 \\, \\pi\\)" ], "text/latex": [ "$\\displaystyle 36 \\, \\pi$" ], "text/plain": [ "36*pi" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2*pi*integrate(r^2,(r,0,3))*integrate(sin(th),(th,0,pi))" ] }, { "cell_type": "markdown", "id": "20511954", "metadata": {}, "source": [ "
\n", "\n", "**Example 20.7**\n", "\n", "Using Stokes theorem, compute the integral $\\int_Sxdy\\wedge dz+ydz\\wedge dx + zdx\\wedge dy$ over the unit sphere\n", "$x^2+y^2+z^2=1$. (In Example 20.4 we computed the integral using (20.11)).\n", "\n", "
\n", "\n", "As in the previous example we start from defining the 2-form $a$ and its exterior derivative." ] }, { "cell_type": "code", "execution_count": 16, "id": "3569da31", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle 3 \\mathrm{d} x\\wedge \\mathrm{d} y\\wedge \\mathrm{d} z\\)" ], "text/latex": [ "$\\displaystyle 3 \\mathrm{d} x\\wedge \\mathrm{d} y\\wedge \\mathrm{d} z$" ], "text/plain": [ "3 dx∧dy∧dz" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(3, 'R^3') # manifold M=R^3\n", "c_xyz. = M.chart() # Cartesian coordinates\n", "N = Manifold(2, 'N') # manifold N=S^2\n", "c_sph.=N.chart() # spherical coordinates\n", " # embedding S^2->R^3\n", "psi = N.diff_map(M, (sin(theta)*cos(phi), sin(theta)*sin(phi),cos(theta)),\n", " name='psi',latex_name=r'\\psi')\n", "a=M.diff_form(2,name='a')\n", "E=c_xyz.coframe() # coframe (dx,dy,dz)\n", "dx,dy,dz=E[:] # define dx,dy,dz\n", "a=x*dy.wedge(dz)+y*dz.wedge(dx)+z*dx.wedge(dy) # a\n", "da=a.exterior_derivative() # da\n", "da.disp()" ] }, { "cell_type": "markdown", "id": "c1a3d2d1", "metadata": {}, "source": [ "We can use the value of Jacobian from previous example," ] }, { "cell_type": "code", "execution_count": 17, "id": "f123bbba", "metadata": {}, "outputs": [], "source": [ "# from previous example\n", "jac=r^2*sin(theta)" ] }, { "cell_type": "markdown", "id": "7f2ca803", "metadata": {}, "source": [ "and obtain the following iterated integral: \n", "$\\int_0^1\\int_0^\\pi\\int^{2\\pi}3\\text{jac}\\;d\\phi d\\theta dr.$" ] }, { "cell_type": "code", "execution_count": 18, "id": "ff676509", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle 4 \\, \\pi\\)" ], "text/latex": [ "$\\displaystyle 4 \\, \\pi$" ], "text/plain": [ "4*pi" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(integrate(integrate(3*jac,(phi,0,2*pi)),(theta,0,pi)),(r,0,1))" ] }, { "cell_type": "markdown", "id": "43b0b321", "metadata": {}, "source": [ "
\n", "\n", "**Example 20.8**\n", "\n", "Compute the integral $ \\int_{\\partial S} xdx+xdy+ydz$, where $\\partial S$ is the boundary of hemisphere $x^2+y^2+z^2=r^2,\\quad z\\geq 0$.\n", "\n", "
\n", "\n", "Define the 1-form $a$ and 2-form $da$." ] }, { "cell_type": "code", "execution_count": 19, "id": "168acf28", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\mathrm{d} x\\wedge \\mathrm{d} y+\\mathrm{d} y\\wedge \\mathrm{d} z\\)" ], "text/latex": [ "$\\displaystyle \\mathrm{d} x\\wedge \\mathrm{d} y+\\mathrm{d} y\\wedge \\mathrm{d} z$" ], "text/plain": [ "dx∧dy + dy∧dz" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(3, 'R^3') # manifold M=R^3\n", "c_xyz. = M.chart() # Cartesian coordinates\n", "a=M.diff_form(2,name='a')\n", "E=c_xyz.coframe() # coframe (dx,dy,dz)\n", "dx,dy,dz=E[:] # define dx,dy,dz\n", "a=x*dx+x*dy+y*dz # a\n", "da=a.exterior_derivative() # da\n", "da.disp()" ] }, { "cell_type": "markdown", "id": "2f131683", "metadata": {}, "source": [ "Let us compute both sides of Stokes formula. Note that using spherical coordinates we can define the hemisphere as the (reparametrized) singular 2-cube\n", "\n", "$$\\Phi:[0,\\frac{\\pi}{2}]\\times[0,2\\pi]\\ni(\\theta,\\phi)\\to \n", "(r\\sin(\\theta)\\cos(\\phi), r\\sin(\\theta)\\sin(\\phi),r\\cos(\\theta)).\n", "$$\n", "\n", "The corresponding parts of $\\partial\\Phi$ can be defined as follows:\n", "\n", "$\\Phi^0_1$ corresponds to $\\ \\ \\theta=0,\\phi\\in[0,2\\pi],\\ \\ $ so\n", "$\\ \\ \\Phi^0_1: \\phi\\to (0,0,1)$,\n", "\n", "$\\Phi^1_1$ corresponds to $\\ \\ \\theta=\\frac{\\pi}{2},\\phi\\in[0,2\\pi], \\ \\ $ so $\\Phi^1_1: \\phi\\to (r\\cos\\phi,r\\sin\\phi,0)$,\n", "\n", "$\\Phi^0_2$ corresponds to $\\ \\ \\theta\\in[0,\\frac{\\pi}{2}],\\phi=0, \\ \\ $ so $\\Phi^0_2: \\theta\\to (r\\sin\\theta,0,r\\cos\\theta)$,\n", "\n", "$\\Phi^1_2$ corresponds to $\\ \\ \\theta\\in[0,\\frac{\\pi}{2}],\\phi=2/pi, \\ \\ $ so $\\Phi^1_2: \\theta\\to (r\\sin\\theta,0,r\\cos\\theta)$.\n", "\n", "Since by (20.16) $\\int_{\\partial\\Phi}=\\int_{\\Phi^1_1}-\\int_{\\Phi^0_1} -\\int_{\\Phi^1_2}+\\int_{\\Phi^0_2}$, the integral $\\int_{\\phi^0_1} a$ is zero and last two integrals cancel each other, the boundary integral reduces to $\\int_{\\Phi^1_1}a$. \n" ] }, { "cell_type": "markdown", "id": "1a53c2a7", "metadata": {}, "source": [ "Define the pullback of $a$\n", "under $\\psi:t\\to (r\\cos(t),\\sin(t),0)$," ] }, { "cell_type": "code", "execution_count": 20, "id": "9a1d13e7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left( r^{2} \\cos\\left(t\\right)^{2} - r^{2} \\cos\\left(t\\right) \\sin\\left(t\\right) \\right) \\mathrm{d} t\\)" ], "text/latex": [ "$\\displaystyle \\left( r^{2} \\cos\\left(t\\right)^{2} - r^{2} \\cos\\left(t\\right) \\sin\\left(t\\right) \\right) \\mathrm{d} t$" ], "text/plain": [ "(r^2*cos(t)^2 - r^2*cos(t)*sin(t)) dt" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N = Manifold(1, 'N') # 1-dim manifold -curve\n", "c.=N.chart() # polar coordinate on N\n", "r=var('r') \n", " # embedding N->R^3:\n", "psi = N.diff_map(M, (r*cos(t), r*sin(t),0),\n", " name='psi',latex_name=r'\\psi')\n", "psi.pullback(a).disp() # pullback of a" ] }, { "cell_type": "markdown", "id": "ed4779e3", "metadata": {}, "source": [ "and use (reparametrized version of) (20.11), to obtain the boundary integral:\n", "$r^2\\int_0^{2\\pi}(\\cos^2 t-\\cos t\\sin t)\\;dt$." ] }, { "cell_type": "code", "execution_count": 21, "id": "3a160dea", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\pi r^{2}\\)" ], "text/latex": [ "$\\displaystyle \\pi r^{2}$" ], "text/plain": [ "pi*r^2" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r^2*integrate(cos(t)^2-cos(t)*sin(t),(t,0,2*pi))" ] }, { "cell_type": "markdown", "id": "fdc6e0e0", "metadata": {}, "source": [ "Now we use the map \n", "$\\Phi:(\\theta,\\phi)\\to \n", "(r\\sin(\\theta)\\cos(\\phi), r\\sin(\\theta)\\sin(\\phi),r\\cos(\\theta))$,\n" ] }, { "cell_type": "code", "execution_count": 22, "id": "7843b182", "metadata": {}, "outputs": [], "source": [ "r=var('r')\n", "N = Manifold(2, 'N') # manifold N=S^2\n", "c_sph.=N.chart() # spherical coordinates\n", " # embedding S^2->R^3\n", "Phi = N.diff_map(M, (r*sin(theta)*cos(phi), r*sin(theta)*sin(phi),r*cos(theta)),\n", " name='psi',latex_name=r'\\psi')" ] }, { "cell_type": "markdown", "id": "842477d8", "metadata": {}, "source": [ "and the pullback $\\Phi^*da$." ] }, { "cell_type": "code", "execution_count": 23, "id": "c199d2cf", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left( r^{2} \\cos\\left(\\phi\\right) \\sin\\left(\\theta\\right)^{2} + r^{2} \\cos\\left(\\theta\\right) \\sin\\left(\\theta\\right) \\right) \\mathrm{d} \\theta\\wedge \\mathrm{d} \\phi\\)" ], "text/latex": [ "$\\displaystyle \\left( r^{2} \\cos\\left(\\phi\\right) \\sin\\left(\\theta\\right)^{2} + r^{2} \\cos\\left(\\theta\\right) \\sin\\left(\\theta\\right) \\right) \\mathrm{d} \\theta\\wedge \\mathrm{d} \\phi$" ], "text/plain": [ "(r^2*cos(phi)*sin(theta)^2 + r^2*cos(theta)*sin(theta)) dtheta∧dphi" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phi.pullback(da).disp()" ] }, { "cell_type": "markdown", "id": "2b5ba53f", "metadata": {}, "source": [ "We can apply (reparametrized version of) (20.11) to obtain the integral of $da$ over the hemisphere:\n", "$r^2\\int_0^{2\\pi}\\int_0^{\\pi/2}(\\cos\\phi\\sin^2\\phi+\\cos\\theta\\sin\\theta)\\; d\\theta d\\phi.$" ] }, { "cell_type": "code", "execution_count": 24, "id": "57516de3", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\pi r^{2}\\)" ], "text/latex": [ "$\\displaystyle \\pi r^{2}$" ], "text/plain": [ "pi*r^2" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r^2*integrate(integrate(cos(phi)*(sin(theta))^2+cos(theta)*sin(theta),\n", " (theta,0,pi/2)),(phi,0,2*pi))" ] }, { "cell_type": "markdown", "id": "814ebf23", "metadata": {}, "source": [ "
\n", "\n", "**Example 20.9**\n", "\n", "Compute the integral $\\int_S x^2dy\\wedge dz+\\frac{1}{2}y^2dz\\wedge dx+dx\\wedge dy$ over the \n", "tetrahedron bounded by the coordinate planes and the plane $x+y+z=1$.\n", "\n", "
\n", "\n", "As usual we start from defining 2-form $a$ and 3-form $da$." ] }, { "cell_type": "code", "execution_count": 25, "id": "4a36b6c5", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left( 2 \\, x + y \\right) \\mathrm{d} x\\wedge \\mathrm{d} y\\wedge \\mathrm{d} z\\)" ], "text/latex": [ "$\\displaystyle \\left( 2 \\, x + y \\right) \\mathrm{d} x\\wedge \\mathrm{d} y\\wedge \\mathrm{d} z$" ], "text/plain": [ "(2*x + y) dx∧dy∧dz" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(3, 'R^3') # manifold M=R^3\n", "c_xyz. = M.chart() # Cartesian coordinates\n", "a=M.diff_form(2,name='a')\n", "E=c_xyz.coframe() # coframe (dx,dy,dz)\n", "dx,dy,dz=E[:] # define dx,dy,dz\n", "a=x^2*dy.wedge(dz)+1/2*y^2*dz.wedge(dx)+dx.wedge(dy) #a\n", "da=a.exterior_derivative() # da\n", "da.disp()" ] }, { "cell_type": "markdown", "id": "df555465", "metadata": {}, "source": [ "Since the tetrahedron can be described by the inequalities\n", "\n", "$$0\\leq x\\leq 1,\\quad 0\\leq y\\leq 1-x,\\quad 0\\leq z\\leq 1-x-y,$$\n", "\n", "which is a three-dimensional version of (20.25), by Stokes theorem, the boundary integral is equal to \n", "\n", "$$\\int_0^1\\Big[\\int_0^{1-x}\\Big[\\int_0^{1-x-y} (2x+y)dz\\Big] dy\\Big] dx.$$" ] }, { "cell_type": "code", "execution_count": 26, "id": "6e709ff8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\frac{1}{8}\\)" ], "text/latex": [ "$\\displaystyle \\frac{1}{8}$" ], "text/plain": [ "1/8" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(integrate(integrate(2*x+y,(z,0,1-x-y)),(y,0,1-x)),(x,0,1))" ] }, { "cell_type": "markdown", "id": "3793efbc", "metadata": {}, "source": [ "
\n", "\n", "**Example 20.10**\n", "\n", "Compute the integral $\\int_S (x+y)dx+(2x-z)dy+(y+3z)dz,$ where $S$ is the boundary of the triangle with vertices $(3,0,0), \\ (0,3,0), \\ (0,0,3)$.\n", "\n", "
\n", "\n", "We start from defining 1-form $a$ and 2-form $da$." ] }, { "cell_type": "code", "execution_count": 27, "id": "4817dda6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\mathrm{d} x\\wedge \\mathrm{d} y + 2 \\mathrm{d} y\\wedge \\mathrm{d} z\\)" ], "text/latex": [ "$\\displaystyle \\mathrm{d} x\\wedge \\mathrm{d} y + 2 \\mathrm{d} y\\wedge \\mathrm{d} z$" ], "text/plain": [ "dx∧dy + 2 dy∧dz" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "M = Manifold(3, 'R^3') # manifold M=R^3\n", "c_xyz. = M.chart() # Cartesian coordinates\n", "a=M.diff_form(2,name='a')\n", "E=c_xyz.coframe() # coframe (dx,dy,dz)\n", "dx,dy,dz=E[:] # define dx,dy,dz\n", "a=(x+y)*dx+(2*x-z)*dy+(y+3*z)*dz # a\n", "da=a.exterior_derivative() # da\n", "da.disp()" ] }, { "cell_type": "markdown", "id": "8557ad81", "metadata": {}, "source": [ "First we compute the integral of $da$ over the triangle using the pullback of $da$ under\n", "$\\Phi:(X,Y)\\to(X,Y,3-X-Y)$." ] }, { "cell_type": "code", "execution_count": 28, "id": "b4976c12", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle 3 \\mathrm{d} X\\wedge \\mathrm{d} Y\\)" ], "text/latex": [ "$\\displaystyle 3 \\mathrm{d} X\\wedge \\mathrm{d} Y$" ], "text/plain": [ "3 dX∧dY" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N = Manifold(2, 'N') # triangle S plane\n", "c.=N.chart() # coord on N\n", " # N-> R^3\n", "Phi = N.diff_map(M, (X, Y,3-X-Y),\n", " name='Phi',latex_name=r'\\Phi')\n", "Phi.pullback(da).disp() #pullback of da" ] }, { "cell_type": "markdown", "id": "1e13da93", "metadata": {}, "source": [ "The iterated integral $\\ \\ \\int_0^3[\\int_0^{3-x}3dy]dx$ is equal to$\\frac{27}{2}$." ] }, { "cell_type": "code", "execution_count": 29, "id": "2ea7cd23", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\frac{27}{2}\\)" ], "text/latex": [ "$\\displaystyle \\frac{27}{2}$" ], "text/plain": [ "27/2" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate(integrate(3,(y,0,3-x)),(x,0,3))" ] }, { "cell_type": "markdown", "id": "03e1dc57", "metadata": {}, "source": [ "The boundary of the triangle can be considered as the 1-chain $c=\\psi_1+\\psi_2+\\psi_3$, where $\\psi_1=-\\Phi^1_2,\\ \\ \\psi_2=-\\Phi^0_1,\\ \\ \\psi_3=\\Phi^0_2$ are (reparametrized) singular 1-cubes (parametric curves).\n", "Note that the counterpart of $\\Phi^1_1$ reduces to a point.\n", "\n", "Let us define the space for the parameter $t$," ] }, { "cell_type": "code", "execution_count": 30, "id": "b94cf8d5", "metadata": {}, "outputs": [], "source": [ "N = Manifold(1, 'N') # 1-dim manifold N \"t axis\" \n", "c.=N.chart() # coordinate on N" ] }, { "cell_type": "markdown", "id": "320d15f0", "metadata": {}, "source": [ "next the singular 1-cubes $\\psi_1,\\psi_2,\\psi_3$ and the pullbacks $\\psi_1^*a,\\psi_2^*a,\\psi_3^*a$:" ] }, { "cell_type": "code", "execution_count": 31, "id": "9d6e15ec", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left( -2 \\, t + 3 \\right) \\mathrm{d} t\\)" ], "text/latex": [ "$\\displaystyle \\left( -2 \\, t + 3 \\right) \\mathrm{d} t$" ], "text/plain": [ "(-2*t + 3) dt" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "psi1 = N.diff_map(M, (3-t, t,0),\n", " name='psi1',latex_name=r'\\psi1')\n", "psi1.pullback(a).disp()" ] }, { "cell_type": "code", "execution_count": 32, "id": "89196101", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left( 3 \\, t + 3 \\right) \\mathrm{d} t\\)" ], "text/latex": [ "$\\displaystyle \\left( 3 \\, t + 3 \\right) \\mathrm{d} t$" ], "text/plain": [ "(3*t + 3) dt" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "psi2 = N.diff_map(M, (0, 3-t,t),\n", " name='psi2',latex_name=r'\\psi2')\n", "psi2.pullback(a).disp()" ] }, { "cell_type": "code", "execution_count": 33, "id": "b0e9806b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\left( 4 \\, t - 9 \\right) \\mathrm{d} t\\)" ], "text/latex": [ "$\\displaystyle \\left( 4 \\, t - 9 \\right) \\mathrm{d} t$" ], "text/plain": [ "(4*t - 9) dt" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "psi3 = N.diff_map(M, (t, 0,3-t),\n", " name='psi3',latex_name=r'\\psi3')\n", "psi3.pullback(a).disp()" ] }, { "cell_type": "markdown", "id": "fb41ecaa", "metadata": {}, "source": [ "According to (reparametrized version of) (20.16), the integral of 1-form $a$ over 1-chain $c$ is equal to \n", "\n", "$$\\textstyle\\int_{\\psi_1}a+\\int_{\\psi_2}a+\\int_{\\psi_3}a=\\int_{[0,3]}\\psi_1^*a+\\int_{[0,3]}\\psi_2^*a+\\int_{[0,3]}\\psi_3^*a\\\\\n", "=\\int_0^3 ((-2t+3)+(3t+3)+(4t-9))dt.\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 34, "id": "bec112ba", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle \\frac{27}{2}\\)" ], "text/latex": [ "$\\displaystyle \\frac{27}{2}$" ], "text/plain": [ "27/2" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrate((-2*t+3)+(3*t+3)+(4*t-9),(t,0,3))" ] }, { "cell_type": "markdown", "id": "9e73fe1a", "metadata": {}, "source": [ "
\n", "\n", "### Stokes theorem for chains\n", "\n", "
\n", "\n", "Extending Stokes theorem to $k$-chains is easy, since for $k$-chain $c=\\sum a_i\\phi_i$, where $\\phi_i$ are singular $k$-cubes in an open set $V$ and for $(k-1)$-form $\\omega$ in $V$, we have by (20.14) and (20.23)\n", "\n", "$$ \\int_c d\\omega=\\sum a_i\\int_{\\phi_i} d\\omega=\\sum a_i\\int_{\\partial \\phi_i}\\omega=\\int_{\\partial c}\\omega.$$" ] }, { "cell_type": "markdown", "id": "5b50e592", "metadata": {}, "source": [ "
\n", "\n", "**Remark.** In case of problems, some iterated integrals can be also computed with the help of https://www.wolframalpha.com/ \n", "\n", "For example the command (without #):" ] }, { "cell_type": "code", "execution_count": 35, "id": "cef18310", "metadata": {}, "outputs": [], "source": [ "#integrate(integrate(integrate(2*exp(x+y)*sin(y), (z,0,1-x-y)), (y,0,1-x)), (x,0,1))" ] }, { "cell_type": "markdown", "id": "d9020dfc", "metadata": {}, "source": [ "in wolframalpha window returns\n", "\n", "$$\\int_0^1\\int_0^{1-x}\\int_0^{1-x-y}2\\exp(x+y)\\sin(y)\\;dzdydx=\n", "-3-e(\\sin(1)-2).$$" ] }, { "cell_type": "markdown", "id": "1d6a2f4a", "metadata": {}, "source": [ "**Remark**. Computing iterated integrals, SageMath (or strictly speaking Maxima) may need some assumptions, for example:" ] }, { "cell_type": "code", "execution_count": 36, "id": "5c199957", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\\(\\displaystyle -\\frac{2}{15} \\, \\cos\\left(2\\right) e + \\frac{1}{3} \\, \\cos\\left(1\\right) e + \\frac{1}{15} \\, e \\sin\\left(2\\right) - \\frac{1}{3} \\, e \\sin\\left(1\\right) - \\frac{1}{5}\\)" ], "text/latex": [ "$\\displaystyle -\\frac{2}{15} \\, \\cos\\left(2\\right) e + \\frac{1}{3} \\, \\cos\\left(1\\right) e + \\frac{1}{15} \\, e \\sin\\left(2\\right) - \\frac{1}{3} \\, e \\sin\\left(1\\right) - \\frac{1}{5}$" ], "text/plain": [ "-2/15*cos(2)*e + 1/3*cos(1)*e + 1/15*e*sin(2) - 1/3*e*sin(1) - 1/5" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "var('x y z')\n", "forget()\n", "assume(y+x-1<0)\n", "assume(x-1<0)\n", "integrate(integrate(integrate(2*exp(x+y+z)*sin(x-2*z),(z,0,1-x-y)),(y,0,1-x)),(x,0,1))" ] }, { "cell_type": "markdown", "id": "a4c8e7e3", "metadata": {}, "source": [ "## What's next?\n", " \n", "Take a look at the notebook [Connection](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/21Manifold_Connection.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": 5 }