{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 15. Pulback of tensor fields\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": [
"Recall from [notebook 7](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/07Manifold_FunPullb_Curves.ipynb), that every smooth map between two smooth manifolds $\\psi : M → N$ defines a pullback map $\\psi^* : C^∞ (N ) → C^∞ (M )$\n",
"by\n",
"\n",
"$$\n",
"\\psi^∗ f = f ◦ \\psi\\quad \\mbox{ for any } f ∈ C^∞ (N ).$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"\n",
"**Example 15.1**\n",
"\n",
"If we denote by $\\psi$ the coordinate change defined by\n",
"$x=r\\cos(\\phi),\\; y=r\\sin(\\phi)$ on the open set $U=\\{(r,\\phi): r>0, 0<\\phi <2\\pi \\},$ then for a scalar function $f$ of variables $x,y,$ the pullback\n",
"$\\psi^*f$ is the function $(r,\\phi)\\to f(r\\cos(\\phi),r\\sin(\\phi))$, defined on $U$.\n",
"\n",
"In the special case $f(x,y)=\\sqrt{x^2+y^2}$, the pullback \n",
"$\\psi^*f$ is the function on $U$: $(r,\\phi)\\to r.$"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle \\begin{array}{llcl} {\\psi}^*f:& U & \\longrightarrow & \\mathbb{R} \\\\ & \\left(r, {\\phi}\\right) & \\longmapsto & r \\end{array}\\)"
],
"text/latex": [
"$\\displaystyle \\begin{array}{llcl} {\\psi}^*f:& U & \\longrightarrow & \\mathbb{R} \\\\ & \\left(r, {\\phi}\\right) & \\longmapsto & r \\end{array}$"
],
"text/plain": [
"\\psi^*(f): U → ℝ\n",
" (r, phi) ↦ r"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%display latex\n",
"M = Manifold(2, 'R^2p') # manifold R^2\n",
"U = M.open_subset('U') # open subset of R2, \n",
" # polar coord. on U: \n",
"c_rphi.=U.chart(r'r:(0,oo) phi:(0,2*pi):\\phi')\n",
"N = Manifold(2, 'R^2c') # second copy of R^2 \n",
"c_xy. = N.chart() # Cartesian coordinates:\n",
" # psi: M --> N : polar to Cart.:\n",
"psi = U.diff_map(N, (r*cos(phi), r*sin(phi)),name=r'\\psi')\n",
" # f -scalar function on N \n",
"f=N.scalar_field(sqrt(x^2+y^2),name='f') \n",
"\n",
"fplb=psi.pullback(f) # psi^*f -scalar func. on M\n",
"fplb.disp() # show pullback psi^*f"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"\n",
"### Pullback of covariant tensor fields\n",
"\n",
"
\n",
"\n",
"If $\\psi: M\\to N$ is a smooth map between smooth manifolds, one can extend the pullback operation to a map $\\psi^∗ : T^{(0,k)}N → T^{(0,k)}M $ by\n",
"\n",
"\\begin{equation}\n",
"(ψ^∗ t)_p (u_{1p} , . . . , u_{kp} ) = t_{ψ( p)} (dψ_p u_{1p} , . . . , dψ_p u_{kp} ),\n",
"\\label{}\\tag{15.1}\n",
"\\end{equation}\n",
"\n",
"for $u_{1p} , . . . , u_{kp} ∈ T_p M,\\ \\ p ∈ M.$\n",
"From the linearity of $d\\psi_p$ it follows the multilinearity of $(\\psi^*t)_p$.\n",
"\n",
"If $f ∈ C^∞ (N )$, then the differential $d f$ of $f$ is a tensor field of type $(0,1)$,\n",
"consequently from (15.1) it follows\n",
"\n",
"$$(ψ^∗ d f )_p (v_p ) = d f_{ψ( p)} (dψ_p v_p ),$$\n",
"\n",
"for $v_p ∈ T_p M.$
From the definitions of $df$ and $d\\psi$ we have\n",
"\n",
"$$d f_{ ψ( p)} (dψ_p v_p ) = dψ_p v_p ( f ) = v_p (ψ^∗ f ) = d(ψ^*f )_p (v_p ).$$\n",
"\n",
"We have checked that for a smooth map $\\ \\psi : M → N\\ $ and $\\ f\\in C^∞ (N )$\n",
"\n",
"\\begin{equation}\n",
"ψ^∗ d f = d(ψ^∗ f ).\n",
"\\label{}\\tag{15.2}\n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"\n",
"**Example 15.2**\n",
"\n",
"Compute the pullback of differential of the scalar function from Example 15.1.\n",
"\n",
"First we compute the left hand side of (15.2):"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle {\\psi}^*\\mathrm{d}f = \\mathrm{d} r\\)"
],
"text/latex": [
"$\\displaystyle {\\psi}^*\\mathrm{d}f = \\mathrm{d} r$"
],
"text/plain": [
"\\psi^*(df) = dr"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# continuation\n",
"df=f.differential() # differential of f\n",
"dfplb=psi.pullback(df) # pullback psi^*df\n",
"dfplb.disp(basis=c_rphi) # display in polar coordinates"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here is the right hand side of (15.2):"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle \\mathrm{d}{\\psi}^*f = \\mathrm{d} r\\)"
],
"text/latex": [
"$\\displaystyle \\mathrm{d}{\\psi}^*f = \\mathrm{d} r$"
],
"text/plain": [
"d\\psi^*(f) = dr"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fplb.differential().disp() # d(psi^*f)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"\n",
"**Example 15.3**\n",
"\n",
"Compute pullback of a scalar function and its differential for general mapping between two-dimensional manifolds $M$ and $N$\n",
"\n",
"$$\\psi: M \\to N,\\quad \\psi(u,v)=\n",
"(\\psi_1(u,v),\\psi_2(u,v)).\n",
"$$\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle \\begin{array}{llcl} {\\psi}^*f:& R^2_{uv} & \\longrightarrow & \\mathbb{R} \\\\ & \\left(u, v\\right) & \\longmapsto & f\\left(\\psi_{1}\\left(u, v\\right), \\psi_{2}\\left(u, v\\right)\\right) \\end{array}\\)"
],
"text/latex": [
"$\\displaystyle \\begin{array}{llcl} {\\psi}^*f:& R^2_{uv} & \\longrightarrow & \\mathbb{R} \\\\ & \\left(u, v\\right) & \\longmapsto & f\\left(\\psi_{1}\\left(u, v\\right), \\psi_{2}\\left(u, v\\right)\\right) \\end{array}$"
],
"text/plain": [
"\\psi^*(f): R^2_{uv} → ℝ\n",
" (u, v) ↦ f(psi1(u, v), psi2(u, v))"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%display latex\n",
"M = Manifold(2, r'R^2_{uv}') # manifold M\n",
"c_uv.=M.chart() # coordinates u,v\n",
"N = Manifold(2, r'R^2_{xy}') # manifold N\n",
"c_xy. = N.chart() # coordinates x,y\n",
" # first component of psi\n",
"psi1=M.scalar_field(function('psi1')(u,v),name=r'\\psi1')\n",
" # second component of psi\n",
"psi2=M.scalar_field(function('psi2')(u,v),name=r'\\psi2') \n",
" # define psi\n",
"psi = M.diff_map(N,(psi1.expr(),psi2.expr()) ,name=r'\\psi')\n",
" # scalar function f\n",
"f=N.scalar_field(function('f')(x,y),name='f') \n",
"fplb=psi.pullback(f) # pullback psi^*f\n",
"fplb.disp() # show pullback psi^*f"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle \\mathrm{d}{\\psi}^*f = \\left( \\frac{\\partial\\,f}{\\partial \\left( \\psi_{1}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{1}}{\\partial u} + \\frac{\\partial\\,f}{\\partial \\left( \\psi_{2}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial u} \\right) \\mathrm{d} u + \\left( \\frac{\\partial\\,f}{\\partial \\left( \\psi_{1}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{1}}{\\partial v} + \\frac{\\partial\\,f}{\\partial \\left( \\psi_{2}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\right) \\mathrm{d} v\\)"
],
"text/latex": [
"$\\displaystyle \\mathrm{d}{\\psi}^*f = \\left( \\frac{\\partial\\,f}{\\partial \\left( \\psi_{1}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{1}}{\\partial u} + \\frac{\\partial\\,f}{\\partial \\left( \\psi_{2}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial u} \\right) \\mathrm{d} u + \\left( \\frac{\\partial\\,f}{\\partial \\left( \\psi_{1}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{1}}{\\partial v} + \\frac{\\partial\\,f}{\\partial \\left( \\psi_{2}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\right) \\mathrm{d} v$"
],
"text/plain": [
"d\\psi^*(f) = (d(f)/d(psi1(u, v))*d(psi1)/du + d(f)/d(psi2(u, v))*d(psi2)/du) du + (d(f)/d(psi1(u, v))*d(psi1)/dv + d(f)/d(psi2(u, v))*d(psi2)/dv) dv"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fplb.differential().disp() # d(psi^*f)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle {\\psi}^*\\mathrm{d}f = \\left( \\frac{\\partial\\,f}{\\partial \\left( \\psi_{1}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{1}}{\\partial u} + \\frac{\\partial\\,f}{\\partial \\left( \\psi_{2}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial u} \\right) \\mathrm{d} u + \\left( \\frac{\\partial\\,f}{\\partial \\left( \\psi_{1}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{1}}{\\partial v} + \\frac{\\partial\\,f}{\\partial \\left( \\psi_{2}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\right) \\mathrm{d} v\\)"
],
"text/latex": [
"$\\displaystyle {\\psi}^*\\mathrm{d}f = \\left( \\frac{\\partial\\,f}{\\partial \\left( \\psi_{1}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{1}}{\\partial u} + \\frac{\\partial\\,f}{\\partial \\left( \\psi_{2}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial u} \\right) \\mathrm{d} u + \\left( \\frac{\\partial\\,f}{\\partial \\left( \\psi_{1}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{1}}{\\partial v} + \\frac{\\partial\\,f}{\\partial \\left( \\psi_{2}\\left(u, v\\right) \\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\right) \\mathrm{d} v$"
],
"text/plain": [
"\\psi^*(df) = (d(f)/d(psi1(u, v))*d(psi1)/du + d(f)/d(psi2(u, v))*d(psi2)/du) du + (d(f)/d(psi1(u, v))*d(psi1)/dv + d(f)/d(psi2(u, v))*d(psi2)/dv) dv"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df=f.differential() # df\n",
"dfplb=psi.pullback(df) # psi^*(df)\n",
"dfplb.disp() # show pullback of df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"\n",
"**Example 15.4**\n",
"\n",
"Compute the pullback of 1-form $\\ \\ 𝛼=𝑎_0(𝑥,𝑦)d𝑥+𝑎_1(𝑥,𝑦)d𝑦\\ $ under the map $\\psi$ from the previous example."
]
},
{
"cell_type": "code",
"execution_count": 8,
"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": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%display latex\n",
"M = Manifold(2, r'R^2_{uv}') # manifold M\n",
"c_uv.=M.chart() # coordinates u,v\n",
"N = Manifold(2, r'R^2_{xy}') # manifold N\n",
"c_xy. = N.chart() # coordinates x,y\n",
" # first component of psi\n",
"psi1=M.scalar_field(function('psi1')(u,v),name=r'\\psi1')\n",
" # second component of psi\n",
"psi2=M.scalar_field(function('psi2')(u,v),name=r'\\psi2') \n",
" # define psi\n",
"psi = M.diff_map(N,(psi1.expr(),psi2.expr()) ,name=r'\\psi')\n",
" # scalar function f\n",
"f=N.scalar_field(function('f')(x,y),name='f') \n",
"\n",
"al=N.diff_form(1,name=r'\\alpha') # 1-form al\n",
"astr=['a'+str(i) for i in range(2)] # list of comp. names\n",
"af=[N.scalar_field(function(astr[i])(x,y),name=astr[i]) \n",
" for i in range(2)] # list of components\n",
"al[:]=af # define all components\n",
"al.disp() # show al"
]
},
{
"cell_type": "code",
"execution_count": 9,
"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": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Manifold.options.omit_function_arguments=False\n",
"alplb=psi.pullback(al) # pullback psi^*al\n",
"alplb.disp() # show pullback of al"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Shorter result can be obtained omitting functions arguments."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle {\\psi}^*\\alpha = \\left( a_{0}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} + a_{1}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial u} \\right) \\mathrm{d} u + \\left( a_{0}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial v} + a_{1}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\right) \\mathrm{d} v\\)"
],
"text/latex": [
"$\\displaystyle {\\psi}^*\\alpha = \\left( a_{0}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} + a_{1}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial u} \\right) \\mathrm{d} u + \\left( a_{0}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial v} + a_{1}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\right) \\mathrm{d} v$"
],
"text/plain": [
"\\psi^*(\\alpha) = (a0(psi1, psi2)*d(psi1)/du + a1(psi1, psi2)*d(psi2)/du) du + (a0(psi1, psi2)*d(psi1)/dv + a1(psi1, psi2)*d(psi2)/dv) dv"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Manifold.options.omit_function_arguments=True\n",
"alplb.disp()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"\n",
"**Example 15.5**\n",
"\n",
"Compute the pullback of a tensor field of (0,2)-type \n",
"$f_{00}(𝑥,𝑦)d𝑥⊗d𝑥+𝑓_{01}(𝑥,𝑦)d𝑥⊗d𝑦+𝑓_{10}(𝑥,𝑦)d𝑦⊗d𝑥+𝑓_{11}(𝑥,𝑦)d𝑦⊗d𝑦\\ \\ $\n",
"on a two dimensional manifold under $\\psi$ from Example 15.3."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle t = f_{00} \\mathrm{d} x\\otimes \\mathrm{d} x + f_{01} \\mathrm{d} x\\otimes \\mathrm{d} y + f_{10} \\mathrm{d} y\\otimes \\mathrm{d} x + f_{11} \\mathrm{d} y\\otimes \\mathrm{d} y\\)"
],
"text/latex": [
"$\\displaystyle t = f_{00} \\mathrm{d} x\\otimes \\mathrm{d} x + f_{01} \\mathrm{d} x\\otimes \\mathrm{d} y + f_{10} \\mathrm{d} y\\otimes \\mathrm{d} x + f_{11} \\mathrm{d} y\\otimes \\mathrm{d} y$"
],
"text/plain": [
"t = f00 dx⊗dx + f01 dx⊗dy + f10 dy⊗dx + f11 dy⊗dy"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# continuation\n",
"t = N.tensor_field(0,2, name='t') # tensor field t of type (0,2)\n",
" # list of component names:\n",
"def fn(i,j): return 'f'+str(i)+str(j) \n",
" # list of component functions:\n",
"f=[[N.scalar_field(function(fn(j,k))(x,y),name=fn(j,k)) \n",
" for k in range(2)] for j in range(2)]\n",
"t[:]=f # define all components of t\n",
"t.disp() # show t"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle \\begin{array}{lcl} {\\psi}^*t_{ \\, u \\, u }^{ \\phantom{\\, u}\\phantom{\\, u} } & = & f_{00}\\left(\\psi_{1}, \\psi_{2}\\right) \\left(\\frac{\\partial\\,\\psi_{1}}{\\partial u}\\right)^{2} + f_{11}\\left(\\psi_{1}, \\psi_{2}\\right) \\left(\\frac{\\partial\\,\\psi_{2}}{\\partial u}\\right)^{2} + {\\left(f_{01}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} + f_{10}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u}\\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial u} \\\\ {\\psi}^*t_{ \\, u \\, v }^{ \\phantom{\\, u}\\phantom{\\, v} } & = & f_{00}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} \\frac{\\partial\\,\\psi_{1}}{\\partial v} + f_{10}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial v} \\frac{\\partial\\,\\psi_{2}}{\\partial u} + {\\left(f_{01}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} + f_{11}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial u}\\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\\\ {\\psi}^*t_{ \\, v \\, u }^{ \\phantom{\\, v}\\phantom{\\, u} } & = & f_{00}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} \\frac{\\partial\\,\\psi_{1}}{\\partial v} + f_{01}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial v} \\frac{\\partial\\,\\psi_{2}}{\\partial u} + {\\left(f_{10}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} + f_{11}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial u}\\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\\\ {\\psi}^*t_{ \\, v \\, v }^{ \\phantom{\\, v}\\phantom{\\, v} } & = & f_{00}\\left(\\psi_{1}, \\psi_{2}\\right) \\left(\\frac{\\partial\\,\\psi_{1}}{\\partial v}\\right)^{2} + {\\left(f_{01}\\left(\\psi_{1}, \\psi_{2}\\right) + f_{10}\\left(\\psi_{1}, \\psi_{2}\\right)\\right)} \\frac{\\partial\\,\\psi_{1}}{\\partial v} \\frac{\\partial\\,\\psi_{2}}{\\partial v} + f_{11}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial v}^{2} \\end{array}\\)"
],
"text/latex": [
"$\\displaystyle \\begin{array}{lcl} {\\psi}^*t_{ \\, u \\, u }^{ \\phantom{\\, u}\\phantom{\\, u} } & = & f_{00}\\left(\\psi_{1}, \\psi_{2}\\right) \\left(\\frac{\\partial\\,\\psi_{1}}{\\partial u}\\right)^{2} + f_{11}\\left(\\psi_{1}, \\psi_{2}\\right) \\left(\\frac{\\partial\\,\\psi_{2}}{\\partial u}\\right)^{2} + {\\left(f_{01}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} + f_{10}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u}\\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial u} \\\\ {\\psi}^*t_{ \\, u \\, v }^{ \\phantom{\\, u}\\phantom{\\, v} } & = & f_{00}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} \\frac{\\partial\\,\\psi_{1}}{\\partial v} + f_{10}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial v} \\frac{\\partial\\,\\psi_{2}}{\\partial u} + {\\left(f_{01}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} + f_{11}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial u}\\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\\\ {\\psi}^*t_{ \\, v \\, u }^{ \\phantom{\\, v}\\phantom{\\, u} } & = & f_{00}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} \\frac{\\partial\\,\\psi_{1}}{\\partial v} + f_{01}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial v} \\frac{\\partial\\,\\psi_{2}}{\\partial u} + {\\left(f_{10}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{1}}{\\partial u} + f_{11}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial u}\\right)} \\frac{\\partial\\,\\psi_{2}}{\\partial v} \\\\ {\\psi}^*t_{ \\, v \\, v }^{ \\phantom{\\, v}\\phantom{\\, v} } & = & f_{00}\\left(\\psi_{1}, \\psi_{2}\\right) \\left(\\frac{\\partial\\,\\psi_{1}}{\\partial v}\\right)^{2} + {\\left(f_{01}\\left(\\psi_{1}, \\psi_{2}\\right) + f_{10}\\left(\\psi_{1}, \\psi_{2}\\right)\\right)} \\frac{\\partial\\,\\psi_{1}}{\\partial v} \\frac{\\partial\\,\\psi_{2}}{\\partial v} + f_{11}\\left(\\psi_{1}, \\psi_{2}\\right) \\frac{\\partial\\,\\psi_{2}}{\\partial v}^{2} \\end{array}$"
],
"text/plain": [
"\\psi^*(t)_uu = f00(psi1, psi2)*(d(psi1)/du)^2 + f11(psi1, psi2)*(d(psi2)/du)^2 + (f01(psi1, psi2)*d(psi1)/du + f10(psi1, psi2)*d(psi1)/du)*d(psi2)/du \n",
"\\psi^*(t)_uv = f00(psi1, psi2)*d(psi1)/du*d(psi1)/dv + f10(psi1, psi2)*d(psi1)/dv*d(psi2)/du + (f01(psi1, psi2)*d(psi1)/du + f11(psi1, psi2)*d(psi2)/du)*d(psi2)/dv \n",
"\\psi^*(t)_vu = f00(psi1, psi2)*d(psi1)/du*d(psi1)/dv + f01(psi1, psi2)*d(psi1)/dv*d(psi2)/du + (f10(psi1, psi2)*d(psi1)/du + f11(psi1, psi2)*d(psi2)/du)*d(psi2)/dv \n",
"\\psi^*(t)_vv = f00(psi1, psi2)*(d(psi1)/dv)^2 + (f01(psi1, psi2) + f10(psi1, psi2))*d(psi1)/dv*d(psi2)/dv + f11(psi1, psi2)*d(psi2)/dv^2 "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Manifold.options.omit_function_arguments=True\n",
"tplb=psi.pullback(t) # pullback psi^*t\n",
"tplb.display_comp() # show pullback components"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"\n",
"### Basic properties of pullback\n",
"\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For a smooth map $\\psi: M \\to N,\\ $ tensor fields $t$ and $s$ on $N$ of type\n",
"$( 0,k)$ and constants $a,b\\in R\\ $ we have\n",
"\n",
"$$\n",
"(ψ^*(at + bs))_p (u_{1p} , . . . , u_{kp} ) = (at + bs)_{ψ( p)}\n",
"(dψ_p u_{1p} , . . . , dψ_p u_{kp} )\\\\\n",
"= (at_{ψ( p)} + bs_{ψ( p)} )(dψ_p u_{1p} , . . . , dψ_p u_{kp} )\\\\\n",
"= at_{ψ( p)} (dψ_p u_{1p} , . . . , dψ_p u_{kp} )\n",
"+ bs_{ψ( p)} (dψ_p u_{1p} , . . . , dψ_p u_{kp} )\\\\\n",
"= a(ψ^∗ t)_p (u_{1p} , . . . , u_{kp} ) + b(ψ^∗ s)_p (u_{1p} , . . . , u_{kp} )\\\\\n",
"= (aψ^∗ t + bψ^∗ s)_p (u_p , . . . , w_p ),$$\n",
"\n",
"for $u_{1p} , . . . , u_{kp} ∈ T_p M$. Therefore we have the following linearity result.\n",
"\n",
"Let $ψ : M → N$ be a smooth\n",
"map.\n",
"If $t$ and $s$ are tensor fields of type\n",
"$( 0,k)$ on $N$ and $a, b ∈ R$, then\n",
"\n",
"\\begin{equation}\n",
"ψ^∗ (at + bs) = aψ^∗ t + bψ^∗ s.\n",
"\\label{}\\tag{15.3}\n",
"\\end{equation}
\n",
"\n",
"For $\\psi\\ $ as before, $f\\in C^\\infty(N)\\ $ and $t\\in T^{(0.k)}N$, we have\n",
"\n",
"$$\n",
"(ψ^∗ ( f t)_p (u_{1p} , . . . , u_{kp} ) = \n",
"( f t)_{ψ( p)} (dψ_p u_{1p} , . . . , dψ_p u_{kp} )\\\\\n",
"= f( ψ( p)) t_{ψ( p)} (dψ_p u_{1p} , . . . , dψ_p u_{kp} )\n",
"= (ψ^∗ f )( p) (ψ^∗ t)_p (u_{1p} , . . . , u_{kp} )\n",
"=((ψ^∗ f )(ψ^∗ t))_p (u_{1p} , . . . , u_{kp} ).\n",
"$$\n",
"Thus\n",
"\\begin{equation}\n",
"ψ^∗ ( f t) = (ψ^∗ f )(ψ^∗ t).\n",
"\\label{}\\tag{15.4}\n",
"\\end{equation}\n",
"
\n",
"\n",
"If $\\psi:M\\to N\\ $ is smooth, $t$ and $s$ are tensor fields on $N$ of types\n",
"$(0,k)$\n",
"and $(0,l)$ respectively,\n",
" we have\n",
"\n",
"$$\n",
"ψ^*(t ⊗ s)_p(u_{1p},...,u_{(k+l)p}) = (t ⊗ s)_{ψ( p)} (dψ_p u_{1p} , . . . , dψ_p u_{(k+l)p} )\\\\\n",
"= t_{ψ( p)} (dψ_p u_{1p} , . . .,dψ_p u_{kp}) s_{ψ( p)} (dψ_p u_{(k+1)p},. . . , dψ_p u_{(k+l)p} )\\\\\n",
"= (ψ^∗ t)_p (u_{1p} , . . .,u_{kp})(ψ^∗ s)_p (u_{(k+1)p},. . . , u_{(k+l)p} )\n",
"= ((ψ^∗ t) ⊗ (ψ^∗ s))_p (u_{1p} , . . . , u_{(k+l)p} ),\n",
"$$\n",
"\n",
"so\n",
"\n",
"\\begin{equation}\n",
"ψ^∗ (t ⊗ s) = (ψ^∗ t) ⊗ (ψ^∗ s).\n",
"\\label{}\\tag{15.5}\n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If $M_1, M_2, M_3$ are smooth manifolds, $ψ_1 : M_1 → M_2$ and $ψ_2 : M_2 → M_3$ are smooth maps, then\n",
"\n",
"$$ (ψ_2 ◦ ψ_1 )^∗ t = (ψ_1^∗ ◦ ψ_2^∗ )\\;t,\\quad \\mbox{for } t ∈ T^{(0,k)} M_3.$$\n",
"\n",
"To prove this relation let us note that\n",
"$$((ψ_2 ◦ ψ_1 )^∗ t)_p (u_{1p} , . . . , u_{kp} )\\\\\n",
"= t_{(ψ_2 ◦ψ_1 )( p)} (d(ψ_2 ◦ ψ_1 )_p u_{1p} , . . . , \n",
"d(ψ_2 ◦ ψ_1 )_p u_{kp})\\\\\n",
"= t_{ψ_2(ψ_1(p))} (dψ_{2ψ_1( p)} (dψ_{1p} u_{1p} ), . . . , \n",
" dψ_{2ψ_1( p)} (dψ_{1p} u_{kp} ))\\\\\n",
"= (ψ_2^∗ t)_{ψ 1 ( p)} (dψ_{1 p} u_{1p} , . . . , dψ_{1p} u_{kp} )\n",
"= (ψ_1^∗ (ψ_2^∗ t))_p (u_{1p} , . . . , u_{kp} ).\n",
"$$\n",
"\n",
"
\n",
"\n",
"### Pullback of covariant tensor fields in components\n",
"\n",
"
\n",
"\n",
"If $t$ is a tensor field of type $(0,k)$ on $N$, given locally by $t = t_{i_1... i_k} dy^{i_1} ⊗ · · · ⊗dy^{i_k}$, then the pullback of $t$ under $ψ$ is given by\n",
"\n",
"$$ψ^∗ t = ψ^∗ (t_{i_1... i_k} dy^{i_1} ⊗ · · · ⊗ dy^{i_k} )\\\\\n",
"= (ψ^∗ t_{i_1... i_k} )(ψ^∗ dy^{i_1} ) ⊗ · · · ⊗ (ψ^∗ dy^{i_k} )\\\\\n",
"= (ψ^∗ t_{i_1... i_k} ) d(ψ^∗ y^{i_1} ) ⊗ · · · ⊗ d(ψ^∗ y^{i_k} ).$$\n",
"\n",
"Since $d(ψ^∗ y^i ) = (∂(ψ^∗ y^i )/∂ x^m) dx^m$,\n",
"where $(x^1 , . . . , x^n )$ are coordinates on $M$, we have\n",
"\n",
"\\begin{equation}\n",
"ψ^∗ t = (ψ^∗ t_{i_1... i_k} )\\frac{\\partial(\\psi^*y^{i_1})}{\n",
"\\partial x^{m_1}}\\ldots\n",
"\\frac{\\partial(\\psi^*y^{i_k})}{\\partial x^{m_k}}dx^{m_1}⊗ · · · ⊗ dx^{m_k}.\n",
"\\tag{15.6}\n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"The same formula can be written:\n",
"$$ψ^∗ (t_{i_1... i_k} dy^{i_1} ⊗ · · · ⊗dy^{i_k} )= (t_{i_1... i_k}\\circ\\psi )\\frac{\\partial(y^{i_1}\\circ\\psi)}{\n",
"\\partial x^{m_1}}\\ldots\n",
"\\frac{\\partial(y^{i_k}\\circ\\psi)}{\\partial x^{m_k}}dx^{m_1}⊗ · · · ⊗ dx^{m_k}.$$
\n",
"So to obtain $\\psi^*t$, just replace in $t=t_{i_1... i_k} dy^{i_1} ⊗ · · · ⊗dy^{i_k}$
\n",
"$t_{i_1... i_k}\\to t_{i_1... i_k}\\circ \\psi\\quad$\n",
"and $dy^i\\to \\frac{\\partial(y^{i}\\circ\\psi)}{\\partial x^{m}}dx^{m}.$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"\n",
"**Example 15.6**\n",
"\n",
"Consider the covariant tensor field $ \\ g=dx\\otimes dx+ dy\\otimes dy+ dz\\otimes dz$ in $R^3$ and its pullback under the embedding $\\psi: S^2\\to R^3$ defined by \n",
"\n",
"$$ \\psi(\\theta,\\phi)=(\\sin \\theta \\cos \\phi, \\sin \\theta\\sin \\phi,\\cos\\theta).$$"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle \\begin{array}{llcl} \\iota:& \\mathbb{S}^{2} & \\longrightarrow & \\mathbb{E}^{3} \\\\ \\mbox{on}\\ A : & \\left(\\theta, {\\phi}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(\\cos\\left({\\phi}\\right) \\sin\\left(\\theta\\right), \\sin\\left({\\phi}\\right) \\sin\\left(\\theta\\right), \\cos\\left(\\theta\\right)\\right) \\end{array}\\)"
],
"text/latex": [
"$\\displaystyle \\begin{array}{llcl} \\iota:& \\mathbb{S}^{2} & \\longrightarrow & \\mathbb{E}^{3} \\\\ \\mbox{on}\\ A : & \\left(\\theta, {\\phi}\\right) & \\longmapsto & \\left(x, y, z\\right) = \\left(\\cos\\left({\\phi}\\right) \\sin\\left(\\theta\\right), \\sin\\left({\\phi}\\right) \\sin\\left(\\theta\\right), \\cos\\left(\\theta\\right)\\right) \\end{array}$"
],
"text/plain": [
"iota: S^2 → E^3\n",
"on A: (theta, phi) ↦ (x, y, z) = (cos(phi)*sin(theta), sin(phi)*sin(theta), cos(theta))"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%display latex\n",
"S2=manifolds.Sphere(2) # manifolds.Sphere module contains the def.\n",
"Phi=S2.embedding() # of the embedding S^2 -> E^3 \n",
"sph.=S2.spherical_coordinates() # spherical coordinates\n",
"E=S2.ambient() # 3-dim Euclidean space\n",
"c_cart. = E.cartesian_coordinates() # Cartesian coord. in E^3\n",
"Phi.disp() # show Phi"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`metric` is a predefined covariant tensor field of type (0,2) in $E^3$ "
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle g = \\mathrm{d} x\\otimes \\mathrm{d} x+\\mathrm{d} y\\otimes \\mathrm{d} y+\\mathrm{d} z\\otimes \\mathrm{d} z\\)"
],
"text/latex": [
"$\\displaystyle g = \\mathrm{d} x\\otimes \\mathrm{d} x+\\mathrm{d} y\\otimes \\mathrm{d} y+\\mathrm{d} z\\otimes \\mathrm{d} z$"
],
"text/plain": [
"g = dx⊗dx + dy⊗dy + dz⊗dz"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g=E.metric() # g is predefined tensor field of type (0,2)\n",
"g.disp() # show g"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The pullback of g:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle {\\iota}^*g = \\mathrm{d} \\theta\\otimes \\mathrm{d} \\theta + \\sin\\left(\\theta\\right)^{2} \\mathrm{d} {\\phi}\\otimes \\mathrm{d} {\\phi}\\)"
],
"text/latex": [
"$\\displaystyle {\\iota}^*g = \\mathrm{d} \\theta\\otimes \\mathrm{d} \\theta + \\sin\\left(\\theta\\right)^{2} \\mathrm{d} {\\phi}\\otimes \\mathrm{d} {\\phi}$"
],
"text/plain": [
"iota^*(g) = dtheta⊗dtheta + sin(theta)^2 dphi⊗dphi"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Phi.pullback(g).disp() # pullback of g"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" \n",
"\n",
"**Example 15.7**\n",
"\n",
"We can repeat the previous example in higher dimensions. For example we can compute the pullback of $ \\ g=dx_1\\otimes dx_1+ dx_2\\otimes dx_2+ dx_3\\otimes dx_3+dx_4\\otimes dx_4$\n",
"under the embedding $S^3\\to E^4.$"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle \\left(\\cos\\left({\\phi}\\right) \\sin\\left(\\chi\\right) \\sin\\left(\\theta\\right), \\sin\\left(\\chi\\right) \\sin\\left({\\phi}\\right) \\sin\\left(\\theta\\right), \\cos\\left(\\theta\\right) \\sin\\left(\\chi\\right), \\cos\\left(\\chi\\right)\\right)\\)"
],
"text/latex": [
"$\\displaystyle \\left(\\cos\\left({\\phi}\\right) \\sin\\left(\\chi\\right) \\sin\\left(\\theta\\right), \\sin\\left(\\chi\\right) \\sin\\left({\\phi}\\right) \\sin\\left(\\theta\\right), \\cos\\left(\\theta\\right) \\sin\\left(\\chi\\right), \\cos\\left(\\chi\\right)\\right)$"
],
"text/plain": [
"(cos(phi)*sin(chi)*sin(theta),\n",
" sin(chi)*sin(phi)*sin(theta),\n",
" cos(theta)*sin(chi),\n",
" cos(chi))"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%display latex\n",
"S3=manifolds.Sphere(3) # manifolds.Sphere module contains the def.\n",
"Phi=S3.embedding() # of the embedding S^3 -> E^4\n",
"sph.=S3.spherical_coordinates() # and spherical coordinates\n",
"E=S3.ambient() # Euclidean space E^4\n",
"c_cart. = E.cartesian_coordinates() # Cartesian coord. in E^4\n",
"fun=Phi.coord_functions()[:];fun # functions defining the emb. S^3 -> E^4"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`metric` is a predefined covariant tensor field of type (0,2) in $E^4.$ "
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle g = \\mathrm{d} {x_{1}}\\otimes \\mathrm{d} {x_{1}}+\\mathrm{d} {x_{2}}\\otimes \\mathrm{d} {x_{2}}+\\mathrm{d} {x_{3}}\\otimes \\mathrm{d} {x_{3}}+\\mathrm{d} {x_{4}}\\otimes \\mathrm{d} {x_{4}}\\)"
],
"text/latex": [
"$\\displaystyle g = \\mathrm{d} {x_{1}}\\otimes \\mathrm{d} {x_{1}}+\\mathrm{d} {x_{2}}\\otimes \\mathrm{d} {x_{2}}+\\mathrm{d} {x_{3}}\\otimes \\mathrm{d} {x_{3}}+\\mathrm{d} {x_{4}}\\otimes \\mathrm{d} {x_{4}}$"
],
"text/plain": [
"g = dx1⊗dx1 + dx2⊗dx2 + dx3⊗dx3 + dx4⊗dx4"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g=E.metric() # g is a predefined (0,2) type tensor field\n",
"g.disp() # show g"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pullback of g:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle {\\iota}^*g = \\mathrm{d} \\chi\\otimes \\mathrm{d} \\chi + \\sin\\left(\\chi\\right)^{2} \\mathrm{d} \\theta\\otimes \\mathrm{d} \\theta + \\sin\\left(\\chi\\right)^{2} \\sin\\left(\\theta\\right)^{2} \\mathrm{d} {\\phi}\\otimes \\mathrm{d} {\\phi}\\)"
],
"text/latex": [
"$\\displaystyle {\\iota}^*g = \\mathrm{d} \\chi\\otimes \\mathrm{d} \\chi + \\sin\\left(\\chi\\right)^{2} \\mathrm{d} \\theta\\otimes \\mathrm{d} \\theta + \\sin\\left(\\chi\\right)^{2} \\sin\\left(\\theta\\right)^{2} \\mathrm{d} {\\phi}\\otimes \\mathrm{d} {\\phi}$"
],
"text/plain": [
"iota^*(g) = dchi⊗dchi + sin(chi)^2 dtheta⊗dtheta + sin(chi)^2*sin(theta)^2 dphi⊗dphi"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Phi.pullback(g).disp() # pullback Psi^*g"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" \n",
"\n",
"\n",
"Since the differential k-forms are special cases of covariant tensor fields, the pullback operation can be applied to such forms.\n",
"\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Example 15.8**\n",
"\n",
"Consider the same embedding $\\psi: S^2\\to R^3$ as in Example 15.6, defined by $$ \\psi(\\theta,\\phi)=(\\sin \\theta \\cos \\phi, \\sin \\theta\\sin \\phi,\\cos\\theta),$$ and compute the pullbacks\n",
"$\\psi^*(dx\\wedge dy),\\ \\psi^*(dy\\wedge dz),\\ \\psi^*(dx\\wedge dz).$"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle {\\psi}^* \\mathrm{d} x \\wedge \\mathrm{d} y = \\cos\\left(\\theta\\right) \\sin\\left(\\theta\\right) \\mathrm{d} \\theta\\wedge \\mathrm{d} {\\phi}\\)"
],
"text/latex": [
"$\\displaystyle {\\psi}^* \\mathrm{d} x \\wedge \\mathrm{d} y = \\cos\\left(\\theta\\right) \\sin\\left(\\theta\\right) \\mathrm{d} \\theta\\wedge \\mathrm{d} {\\phi}$"
],
"text/plain": [
"psi^*(dx∧dy) = cos(theta)*sin(theta) dtheta∧dphi"
]
},
"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",
"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",
"E=c_xyz.coframe() # coframe (dx,dy,dz)\n",
"dx,dy,dz=E[:] # define dx,dy,dz\n",
"omega1=dx.wedge(dy) # wedge prod. dx/\\dy\n",
"omega2=dy.wedge(dz) # wedge prod. dy/\\dz\n",
"omega3=dx.wedge(dz) # wedge prod. dx/\\dz\n",
"plb=psi.pullback(omega1) # pullback psi^*omega1\n",
"plb.disp()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle {\\psi}^* \\mathrm{d} y \\wedge \\mathrm{d} z = \\cos\\left({\\phi}\\right) \\sin\\left(\\theta\\right)^{2} \\mathrm{d} \\theta\\wedge \\mathrm{d} {\\phi}\\)"
],
"text/latex": [
"$\\displaystyle {\\psi}^* \\mathrm{d} y \\wedge \\mathrm{d} z = \\cos\\left({\\phi}\\right) \\sin\\left(\\theta\\right)^{2} \\mathrm{d} \\theta\\wedge \\mathrm{d} {\\phi}$"
],
"text/plain": [
"psi^*(dy∧dz) = cos(phi)*sin(theta)^2 dtheta∧dphi"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plb=psi.pullback(omega2) # pullback psi^*omega2\n",
"plb.disp()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\\(\\displaystyle {\\psi}^* \\mathrm{d} x \\wedge \\mathrm{d} z = -\\sin\\left({\\phi}\\right) \\sin\\left(\\theta\\right)^{2} \\mathrm{d} \\theta\\wedge \\mathrm{d} {\\phi}\\)"
],
"text/latex": [
"$\\displaystyle {\\psi}^* \\mathrm{d} x \\wedge \\mathrm{d} z = -\\sin\\left({\\phi}\\right) \\sin\\left(\\theta\\right)^{2} \\mathrm{d} \\theta\\wedge \\mathrm{d} {\\phi}$"
],
"text/plain": [
"psi^*(dx∧dz) = -sin(phi)*sin(theta)^2 dtheta∧dphi"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plb=psi.pullback(omega3) # pullback psi^*omega3\n",
"plb.disp()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"More examples of pullbacks of k-forms can be found in the [next notebook](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/16Manifold_Ext_Der.ipynb)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## What's next?\n",
"\n",
"Take a look at the notebook [Exterior derivative](https://nbviewer.org/github/sagemanifolds/IntroToManifolds/blob/main/16Manifold_Ext_Der.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
}
|