CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
GitHub Repository: sagemanifolds/IntroToManifolds
Path: blob/main/14Manifold_Differential_Forms.ipynb
Views: 80
Kernel: SageMath 9.6

14. Differential kk-forms

This notebook is part of the Introduction to manifolds in SageMath by Andrzej Chrzeszczyk (Jan Kochanowski University of Kielce, Poland).

'SageMath version 9.6, Release Date: 2022-05-15'

Warning: in this notebook there are many repetitions with respect to notebook 10. Although mathematically alternating forms on modules from notebook 10 are generalizations of differential forms, the SageMath code in the present notebook differs significantly from that in notebook 10.

Let MM be a smooth manifold.

A differential kk-form or simply kk-form on a manifold MM is a smooth map ωω that, to each point pMp ∈ M, assigns kk-linear antisymmetric form ω(p)=ωpω(p)=ω_p on the tangent space TpMT_pM.

Reminder. kk-linear antisymmetric forms on arbitrary modules were presented in notebook 10, and smoothness of covariant tensor fields in notebook 13.

One can use an equivalent definition:

A differential form of degree kk, or differential kk-form, ωω on a manifold MM is a smooth tensor field of type (0,k)(0,k) on MM, with the antisymmetry property:

ParseError: KaTeX parse error: Undefined control sequence: \label at position 122: …. . . , X_k ), \̲l̲a̲b̲e̲l̲{}\tag{14.1} \e…

for 1i<jk1\leq i < j \leq k, X1,...,XkX(M) X_1 , . . . , X_k ∈ \mathfrak{X}(M).

Note that from (14.1) it follows that if Xi=XjX_i=X_j then ω(X1,...,Xi,...,Xj,...,Xk)=0ω(X_1 , . . . , X_i , . . . , X_j , . . . , X_k ) = 0.
The relation (14.1) can be reformulated as

ω(Xσ(1),,Xσ(k))=sign(σ)ω(X1,,Xk),\omega(X_{\sigma(1)},\ldots,X_{\sigma(k)})=\mathrm{sign}(\sigma) \omega(X_1,\ldots,X_k),

for σSk\sigma\in S_k (permutations and their signs were defined in notebook 10).

A 0-form is a smooth real-valued function on MM.
The set of the k-forms on a manifold MM, is denoted by Ωk(M)\Omega^k(M). It is a submodule of the module of covariant tensor fields T(0,k)MT^{(0,k)} M on the manifold MM.

Example 14.1

Let us define a differential 2-form on a 3-dimensional manifold.

M = Manifold(3, 'M') # manifold M X.<x,y,z> = M.chart() a = M.diff_form(2, name='a') ; # define 2-form print(a) # show information on a
2-form a on the 3-dimensional differentiable manifold M
# parent?
# mathematical object of which "a" is an element show(a.parent())

Ω2(M)\displaystyle \Omega^{2}\left(M\right)

The obtained module can be defined independently:

Om2 = M.diff_form_module(2) # define module of 2-forms show(Om2)

Ω2(M)\displaystyle \Omega^{2}\left(M\right)

Antisymmetrization operation Alt

If tt is a covariant tensor field from T(0,k)MT^{(0,k)}M, then we can define a differential kk-form called Alt(tt) in the following way

ParseError: KaTeX parse error: Undefined control sequence: \label at position 144: …_{\sigma(k)}), \̲l̲a̲b̲e̲l̲{}\tag{14.2} \e…

for XiX(M)X_i\in\mathfrak{X}(M).

Alt is a linear map on the module T(0,k)MT^{(0,k)}M (over C(M)C^\infty(M)) into Ωk(M)\Omega^k(M).

To prove that for tT(0,k)Mt\in T^{(0,k)}M we have Alt(t)Ωk(M)\text{Alt}(t)\in \Omega^k(M) note that for arbitrary permutation τSk\tau\in S_k

Alt(t)(vτ(1),,vτ(k))=1k!σSksignσt(vσ(τ(1)),,vσ(τ(k)))=1k!σSksignσsignσt(vτ(1),,vτ(k))=signτt(v1,,vk).\text{Alt}(t)(v_{\tau(1)},\ldots,v_{\tau(k)}) =\frac{1}{k!}\sum_{\sigma\in S_k}\text{sign}\sigma\, t(v_{\sigma(\tau(1))},\ldots,v_{\sigma(\tau(k))})\\ =\frac{1}{k!}\sum_{\sigma\in S_k}\text{sign}\sigma\, \text{sign}\sigma\,t(v_{\tau(1)},\ldots,v_{\tau(k)})=\text{sign}\tau\,t(v_{1},\ldots,v_{k}).

We can check also that if tΩk(M)t\in \Omega^k(M), then Alt(tt)=tt.
In fact, assume that t(vσ(1),,vσ(k))=signσt(v1,,vk)t(v_{\sigma(1)},\ldots,v_{\sigma(k)})=\text{sign}\sigma\, t(v_1,\ldots,v_k). Then Alt(t)(v1,,vk)=1k!σSk(signσ)t(vσ(1),,vσ(k))=1k!σSk(signσ)(signσ)t(v1,,vk)=t(v1,,vk).\text{Alt}(t)(v_1,\ldots,v_k)= \frac{1}{k!}\sum_{\sigma\in S_k}(\text{sign} \sigma)t(v_{\sigma(1)},\ldots,v_{\sigma(k)})\\ =\frac{1}{k!}\sum_{\sigma\in S_k}(\text{sign} \sigma)(\text{sign} \sigma)\, t(v_{1},\ldots,v_{k})=t(v_{1},\ldots,v_{k}).

The last two observations lead to the relation Alt(Alt(t))=Alt(t),or equivalentlyAlt2=Alt.\text{Alt}(\text{Alt}(t))=\text{Alt}(t), \quad \text{or equivalently}\quad \text{Alt}^2=\text{Alt}.

Wedge product

If ωω is a kk-differential form and ηη is an ll-differential form on MM, the exterior, or wedge, product ωηΩ(k+l)(M)ω ∧ η\in\Omega^{(k+l)}(M), is defined by ParseError: KaTeX parse error: Undefined control sequence: \label at position 87: …a\otimes\eta). \̲l̲a̲b̲e̲l̲{}\tag{14.3} \e…

Remark. Some authors use different coefficients in this formula. Our version is in accordance with that in SageMath Manifolds.

Example 14.2

If αα and ββ are 1-forms, applying (14.3), (14.2) and using the fact that there are only two permutations of two elements with opposite signs we have (αβ)(X1,X2)=(1+1)!1!1!Alt(αβ)(X1,X2)=2!1!1!12![(αβ)(X1,X2)(αβ)(X2,X1)]=α(X1)β(X2)α(X2)β(X1)=(αββα)(X1,X2),(α ∧ β)(X_1 , X_2 ) = \frac{(1+1)!}{1!1!}\mathrm{Alt} (α ⊗ β)(X_1 , X_2 )\\ = \frac{2!}{1!1!}\frac{1}{2!} [ (α ⊗ β)(X_1 , X_2 ) − (α ⊗ β)(X_2 , X_1 )]\\ = α(X_1 )β(X_2 ) − α(X_2 )β(X_1 ) = (α ⊗ β − β ⊗ α)(X_1 , X_2 ),

for X1,X2X(M).X_1 , X_2 ∈ \mathfrak{X}(M). Consequently αβ=(αββα)=βα,for α,βΩ1(M).α ∧ β = (α ⊗ β − β ⊗ α) = −β ∧ α,\quad \mbox{for }\quad α, β ∈ \Omega^1 (M).

Basic algebraic properties of wedge product

From the multilinearity of the tensor product and linearity of antisymmetrization it follows.

For α,α1,α2Ωk(M),β,β1,β2Ωm(M)\alpha,\alpha_1,\alpha_2\in \Omega^k(M),\beta,\beta_1,\beta_2\in \Omega^m(M) and aC(M)a\in C^\infty(M)

(α1+α2)β=α1β+α2β,α(β1+β2)=αβ1+αβ2,(aα)β=a(αβ)=α(aβ).\begin{equation} \begin{matrix} (\alpha_1+\alpha_2)\wedge\beta=\alpha_1\wedge\beta+\alpha_2\wedge\beta,\\ \alpha\wedge(\beta_1+\beta_2)=\alpha\wedge\beta_1+\alpha\wedge\beta_2,\\ (a\alpha)\wedge\beta=a(\alpha\wedge\beta)=\alpha\wedge(a\beta). \end{matrix} \tag{14.4} \end{equation}

Associativity of the wedge product

To check the associativity of the wedge product we need some properties of the antisymmetrization operation.

First observe that if tT(0,k)Mt\in T^{(0,k)}M and sT(0,m)Ms\in T^{(0,m)}M, then

Alt(t)=0Alt(ts)=Alt(st)=0.\begin{equation} \text{Alt}(t)=0\quad \Longrightarrow\quad \text{Alt}(t\otimes s)=\text{Alt}(s\otimes t)=0. \tag{Alt1} \end{equation}

To prove this, let us note that

(k+m)!Alt(ts)(v1,...,vk+m)=σSk+m(signσ)t(vσ(1),...,vσ(k))s(vσ(k+1),...,vσ(k+m)).(k + m)!\, \text{Alt}(t ⊗ s)(v_1 , . . . , v_{k+m} ) = \sum_{\sigma\in S_{k+m}} (\text{sign}\, σ) t (v_{σ(1)} , . . . , v_{σ(k)} )s(v_{σ(k+1)} , . . . , v_{σ(k+m)} ).

First define the subgroup of Sk+mS_{k+m},

G={σSk+m:(σ(k+1),,σ(k+m))=(k+1,,k+m)},G=\{\sigma\in S_{k+m}: (\sigma(k+1),\ldots,\sigma(k+m))=(k+1,\ldots,k+m)\},

and compute the sum from the right hand side of the previous equality restricted to this subgroup.

σG(signσ)t(vσ(1),...,vσ(k))s(vσ(k+1),...,vσ(k+m))=[σG(signσ)t(vσ(1),...,vσ(k))]s(vk+1,...,vk+m)=k!(Alt(t))(v1,...,vk)s(vk+1,...,vk+m)=k!(Alt(t)s)(v1,,vk+m),\sum_{\sigma\in G}(\text{sign}\, σ)\,t (v_{σ(1)} , . . . , v_{σ(k)} )s(v_{σ(k+1)} , . . . , v_{σ(k+m)} )\\ =\Big[\sum_{\sigma\in G}(\text{sign}\, σ)\,t (v_{σ(1)} , . . . , v_{σ(k)} )\Big] s(v_{k+1} , . . . , v_{k+m} )\\= k!(\text{Alt}(t))(v_{1} , . . . , v_{k} ) s(v_{k+1} , . . . , v_{k+m} )= k!(\text{Alt}(t)\otimes s)(v_1,\ldots,v_{k+m}),

so the entire sum vanishes if the sum in brackets vanishes, i.e. Alt(tt) vanishes.

Now for fixed σ~Sk+m\tilde\sigma\in S_{k+m} let us sum over the coset Gσ~={σσ~:σGG\tilde\sigma=\{\sigma\tilde\sigma: \sigma \in G}.

σGσ~(signσ)(ts)(vσ(1),...,vσ(k+m))=σG(signσσ~)(ts)(vσ(σ~(1)),...,vσ(σ~(k+m)))=signσ~[σGsignσt(vσ(σ~(1)),...,vσ(σ~(k)))]s(vσ(σ~(k+1)),...,vσ(σ~(k+m)))=signσ~k!(Alt(t))(vσ~(1),...,vσ~(k))s(vσ~(k+1),...,vσ~(k+m))signσ~k![Alt(t)s](vσ~(1),...,vσ~(k+m)).\sum_{\sigma'\in G\tilde\sigma}(\text{sign}\, σ')(t ⊗ s)(v_{σ'(1)} , . . . , v_{σ'(k+m)} )\\ =\sum_{\sigma\in G}(\text{sign}\, σ\tilde\sigma)(t ⊗ s)(v_{\sigma(\tilde\sigma(1))} , . . . , v_{\sigma(\tilde \sigma(k+m))} )\\ =\text{sign}\tilde\sigma \Big[\sum_{\sigma\in G}\text{sign}\sigma \, t(v_{\sigma(\tilde\sigma(1))} , . . . , v_{\sigma(\tilde \sigma(k))} )\Big] s(v_{\sigma(\tilde\sigma(k+1))} , . . . , v_{\sigma(\tilde \sigma(k+m))} )\\ =\text{sign}\tilde\sigma\, k!\,(\text{Alt}(t)) (v_{\tilde\sigma(1)} , . . . , v_{\tilde \sigma(k)} ) s(v_{\tilde\sigma(k+1)} , . . . , v_{\tilde \sigma(k+m)} )\\ \text{sign}\tilde\sigma\, k!\,\big[\text{Alt}(t)\otimes s\big] (v_{\tilde\sigma(1)} , . . . , v_{\tilde \sigma(k+m)} ) .

Thus if Alt(t)\text{Alt}(t) vanishes then the sums over all cosets Gσ~G\tilde\sigma vanish. Since the group Sk+mS_{k+m} is a sum of cosets Gσ~G\tilde\sigma, the implication (Alt1) holds true.

The second ingredient of our associativity proof is the following

Alt(Alt(ts)r)=Alt(tsr)=Alt(tAlt(sr)).\begin{equation} \text{Alt}(\text{Alt}(t ⊗ s) ⊗ r) = \text{Alt}(t ⊗ s ⊗ r) = \text{Alt}(t ⊗ \text{Alt}(s ⊗ r)). \tag{Alt2} \end{equation}

In fact, the linearity of Alt and the relation Alt2=Alt \text{Alt}^2=\text{Alt} implies

Alt(Alt(sr)sr)=Alt(Alt(sr))Alt(sr)=0.\text{Alt}(\text{Alt}(s ⊗ r) − s ⊗ r)=\text{Alt}(\text{Alt}(s ⊗ r))-\text{Alt}(s\otimes r)=0.

Applying the implication (Alt1) to  Alt(sr)sr \ \text{Alt}(s ⊗ r) − s ⊗ r\ we obtain

Alt(tAlt(sr))Alt(tsr)=Alt(t[Alt(sr)sr]).\text{Alt}(t\otimes\text{Alt}(s\otimes r))-\text{Alt}(t\otimes s\otimes r)= \text{Alt}(t\otimes[\text{Alt}(s\otimes r)-s\otimes r]).

Since we have checked that the value of Alt on the expression in brackets vanishes, then the implication (Alt1) gives us

Alt(tAlt(sr)Alt(tsr))=Alt(t[Alt(sr)sr])=0,\text{Alt}(t\otimes\text{Alt}(s\otimes r)-\text{Alt}(t\otimes s\otimes r)) =\text{Alt}(t\otimes[\text{Alt}(s\otimes r)-s\otimes r])=0,

i.e., the second equality from (Alt2) holds true

Alt(tAlt(sr))=Alt(tsr).\text{Alt}(t ⊗ \text{Alt}(s ⊗ r)) = \text{Alt}(t ⊗ s ⊗ r).

The first equality in (Alt2) can be proved analogously.

From (Alt2) it follows for αΩk(M), βΩl(M), γΩm(M)\alpha\in\Omega^k(M),\ \beta\in \Omega^l(M), \ \gamma\in \Omega^m(M)

(αβ)γ=(k+m+l)!(k+m)!l!Alt((αβ)γ)=(k+m+l)!(k+m)!l!Alt((k+m)!k!m!(Alt(αβ)γ)=(k+m+l)!k!m!l!Alt(αβγ).(\alpha\wedge \beta)\wedge \gamma= \frac{(k+m+l)!}{(k+m)!l!}\text{Alt}((\alpha\wedge\beta)\otimes\gamma)\\ =\frac{(k+m+l)!}{(k+m)!l!}\text{Alt}(\frac{(k+m)!}{k!m!}(\text{Alt}(\alpha\otimes\beta)\otimes\gamma)\\= \frac{(k+m+l)!}{k!m!l!}\text{Alt}(\alpha\otimes\beta\otimes\gamma).

Analogously for α(βγ)α ∧ (β ∧ γ ). We have proved associativity of the wedge product:

(αβ)γ=α(βγ)=(k+l+m)!k!l!m!Alt(αβγ),(α ∧ β) ∧ γ=α ∧ (β ∧ γ ) = \frac{(k+l+m)!}{k!l!m!} \mathrm{Alt} (α ⊗ β ⊗ γ ),

for αΩk(M), βΩl(M), γΩm(M)\alpha\in\Omega^k(M),\ \beta\in \Omega^l(M), \ \gamma\in \Omega^m(M), and more generally

ParseError: KaTeX parse error: Undefined control sequence: \label at position 136: …s \alpha_r ), \̲l̲a̲b̲e̲l̲{}\tag{14.6} \e…

for αiΩki(M).\alpha_i\in\Omega^{k_i}(M).

For example if x1,,xnx^1,\ldots,x^n are local coordinates on MM, then since dxidx^i are 1-forms, then dxi1dxikdx^{i_1}\wedge\ldots\wedge dx^{i_k} are kk-forms on MM.

Differential forms in local coordinates

Let (x1,...,xn)(x^1 , . . . , x^n ) be a local coordinate system on MM. According to (13.7) a kk-differential form possesses the local representation

ParseError: KaTeX parse error: Undefined control sequence: \label at position 66: … · ⊗ dx^{i_k}, \̲l̲a̲b̲e̲l̲{}\tag{14.7} \e…


ParseError: KaTeX parse error: Undefined control sequence: \label at position 122: …x^{i_k}}\Big). \̲l̲a̲b̲e̲l̲{}\tag{14.8} \e…

Since ω\omega is antisymmetric, ωi1...ikω_{i_1 ...i_k} is also antisymmetric.
Since Alt is linear and Alt(ω\omega)=ω \omega\ we have

ω=Alt(ω)=i1,,ik=1nωi1...ikAlt(dxi1dxik).\begin{matrix} \omega=\mathrm{Alt}(\omega)=\sum_{i_1,\ldots,i_k=1}^n ω_{i_1 ...i_k}\mathrm{Alt}(dx^{i_1}\otimes\ldots\otimes dx^{i_k}).\\ \end{matrix}

From (14.6) it follows that (note that dxijdx^{i_j} are 1-forms) Alt(dxi1dxik)=1k!dxi1dxik.\mathrm{Alt}(dx^{i_1}\otimes\ldots\otimes dx^{i_k})=\frac{1}{k!}dx^{i_1}\wedge\ldots\wedge dx^{i_k}. Thus we have ParseError: KaTeX parse error: Undefined control sequence: \label at position 228: …. \end{matrix} \̲l̲a̲b̲e̲l̲{}\tag{14.9} \e…

Note that every element of the sum with increasing indices has k!k! counterparts in the sum with arbitrarily ordered indices. For arbitrary permutation σSk\sigma\in S_k (no summation here)

ωσ(i1)σ(ik)dxσ(i1)dxσ(ik)=sign(σ)2ωi1...ikdxi1dxik=ωi1...ikdxi1dxik.\omega_{\sigma(i_1)\ldots\sigma(i_k)}dx^{\sigma(i_1)}\wedge\ldots\wedge dx^{\sigma(i_k)}=\mathrm{sign}(\sigma)^2ω_{i_1 ...i_k}dx^{i_1}\wedge\ldots\wedge dx^{i_k}\\=ω_{i_1 ...i_k}dx^{i_1}\wedge\ldots\wedge dx^{i_k}.

Elements of the set

{dxi1dxik:1i1<<ikn}\{dx^{i_1}\wedge\dots\wedge dx^{i_k}: 1\leq i_1<\ldots<i_k\leq n\}

are linearly independent, since if

0=ω=i1<...<ikωi1ikdxi1dxik,0=\omega=\sum_{i_1<...<i_k}\omega_{i_1\ldots i_k}dx^{i_1}\wedge\dots\wedge dx^{i_k},

then taking the basis {x1,,xn}\{\frac{\partial}{\partial x^{1}},\ldots,\frac{\partial}{\partial x^{n}}\} and an increasing index sequence (j1,,jk)(j_1,\ldots,j_k), we obtain

0=ω(xj1,,xjk)=k!i1<...<ikωi1ikAlt({dxi1dxik)(xj1,,xjk)=i1<...<ikωi1ikσSk(signσ)dxi1(xjσ(1))dxik(xjσ(k)).0=\omega(\frac{\partial}{\partial x^{j_1}},\ldots,\frac{\partial}{\partial x^{j_k}})=k!\sum_{i_1<...<i_k}\omega_{i_1\ldots i_k} \text{Alt}(\{dx^{i_1}\otimes\dots\otimes dx^{i_k})\big( \frac{\partial}{\partial x^{j_1}},\ldots,\frac{\partial}{\partial x^{j_k}}\big)\\ =\sum_{i_1<...<i_k}\omega_{i_1\ldots i_k} \sum_{\sigma\in S_k}(\text{sign}\, \sigma) dx^{i_1}(\frac{\partial}{\partial x^{j_{\sigma(1)}}})\ldots dx^{i_k}(\frac{\partial}{\partial x^{j_{\sigma(k)}}}).

Since (i1,...,ik)(i_1 , . . . , i_k ) and (j1,...,jk)( j_1 , . . . , j_k ) are both increasing, there is only one choice of i1,...,ik i_1,..., i_k\ which gives a nonzero value, namely  i1=j1,,ik=jk.\ i_1 = j_1,\ldots,i_k =j_k. Since

dxj1(xj1)dxjk(xjk)=1dx^{j_1}(\frac{\partial}{\partial x^{j_{1}}})\ldots dx^{j_k}(\frac{\partial}{\partial x^{j_{k}}})=1

we have 0=ω(xj1,,xjk)=ωj1jk. 0=\omega(\frac{\partial}{\partial x^{j_1}},\ldots,\frac{\partial}{\partial x^{j_k}})=\omega_{j_1\ldots j_k}.


If ωΩk(M)\omega ∈ \Omega^k(M) and ηΩl(M)\eta ∈ \Omega^l(M), then

ωη=(1)klηω.\omega ∧ \eta = (−1)^{kl} \eta ∧ \omega.

This is consequence of (we use the unordered version of (14.9))

(k+l)!ωη=ωi1...ikηj1...jldxi1dxikdxj1dxjl=(1)klωi1...ikηj1...jldxj1dxjldxi1dxik=(k+l)!(1)klηω.(k+l)!ω ∧ η = ω_{i_1 ...i_k} η_{ j_1 ... j_l} dx^{i_1} ∧ · · · ∧ dx^{i_k} ∧ dx^{j_1} ∧ · · · ∧ dx^{j_l}\\ = (−1)^{kl} ω_{i_1 ...i_k} η_{j_1 ... j_l} dx^{j_1} ∧ · · · ∧ dx^{j_l} ∧ dx^{i_1} ∧ · · · ∧ dx^{i_k} = (k+l)!(−1)^{kl} η ∧ ω.

Abbreviated notations for kk-forms

For arbitrary differential forms in Ωk(M)\Omega^k(M) sometimes we would not want to actually write out all of the elements of the local frames of Ωk(M)\Omega^k(M), so instead we write ParseError: KaTeX parse error: Undefined control sequence: \label at position 43: …m_I a_I dx^I . \̲l̲a̲b̲e̲l̲{}\tag{14.10} \… Here the II stands for the sequence of kk increasing indices i1i2iki_1 i_2 \ldots i_k: 1i1<i2<<ikn1 ≤ i_1 < i_2 < \ldots < i_k ≤ n. That is, we sum over IJk,n={(i1i2ik):1i1<i2<<ikn}.I ∈ J_{k,n} = \{(i_1 i_2 \ldots i_k ) : 1 ≤ i_1 < i_2 < \ldots < i_k ≤ n\}.

For example, for k=3k = 3 and n=4n = 4 we have I{123,124,134,234}.I\in\{123,124,134,234\}.

If II and JJ are disjoint, then we have dxIdxJ=±dxKdx^I ∧ dx^J = ±dx^K where K=IJK = I ∪ J, but is reordered to be in increasing order. Elements with repeated indices are dropped. Using this notation we can compute the wedge product as follows ParseError: KaTeX parse error: Undefined control sequence: \label at position 152: …Ib_J\Big)dx^K. \̲l̲a̲b̲e̲l̲{}\tag{14.11} \…

Example 14.3

Let us define a differential 2-form on a 3-dimensional manifold.

%display latex N = 3 # dimension of manifold M M = Manifold(N, 'M') # manifold M X = M.chart(' '.join(['x'+str(i)+':x^{'+str(i)+'}' for i in range(N)])) # chart on M x0, x1, x2 = X[:] # coordinates x^0, x^1, x^2 of chart X as the Python variables x0, x1, x2 a = M.diff_form(2, name='a') # differential 2-form on M a01 = M.scalar_field(function('a01')(x0,x1,x2), name='a01') # component a_{01} a02 = M.scalar_field(function('a02')(x0,x1,x2), name='a02') # component a_{02} a12 = M.scalar_field(function('a12')(x0,x1,x2), name='a12') # component a_{12} a[0,1] = a01; a[0,2] = a02 # by antisymmetry, 6 nonzero components defined a[1,2] = a12 a.disp()

a=a01(x0,x1,x2)dx0dx1+a02(x0,x1,x2)dx0dx2+a12(x0,x1,x2)dx1dx2\displaystyle a = a_{01}\left({x^{0}}, {x^{1}}, {x^{2}}\right) \mathrm{d} {x^{0}}\wedge \mathrm{d} {x^{1}} + a_{02}\left({x^{0}}, {x^{1}}, {x^{2}}\right) \mathrm{d} {x^{0}}\wedge \mathrm{d} {x^{2}} + a_{12}\left({x^{0}}, {x^{1}}, {x^{2}}\right) \mathrm{d} {x^{1}}\wedge \mathrm{d} {x^{2}}

The arguments of components can be omitted

Manifold.options.omit_function_arguments=True a.disp()

a=a01dx0dx1+a02dx0dx2+a12dx1dx2\displaystyle a = a_{01} \mathrm{d} {x^{0}}\wedge \mathrm{d} {x^{1}} + a_{02} \mathrm{d} {x^{0}}\wedge \mathrm{d} {x^{2}} + a_{12} \mathrm{d} {x^{1}}\wedge \mathrm{d} {x^{2}}

# mathematical object of which "a" is an element a.parent()

Ω2(M)\displaystyle \Omega^{2}\left(M\right)

The matrix of 2-form must be antisymmetric.


(0a01a02a010a12a02a120)\displaystyle \left(\begin{array}{rrr} 0 & a_{01} & a_{02} \\ -a_{01} & 0 & a_{12} \\ -a_{02} & -a_{12} & 0 \end{array}\right)

We can check the formula  aij=a(x0,x1)\ a_{ij}=a(\frac{\partial}{\partial x^0},\frac{\partial}{\partial x^1}).

# check the matrix a(d/dxi,d/dxj) fr = X.frame(); matrix([[a(fr[i0],fr[i1]).expr() for i1 in range(3)] for i0 in range(3)])

(0a01(x0,x1,x2)a02(x0,x1,x2)a01(x0,x1,x2)0a12(x0,x1,x2)a02(x0,x1,x2)a12(x0,x1,x2)0)\displaystyle \left(\begin{array}{rrr} 0 & a_{01}\left({x^{0}}, {x^{1}}, {x^{2}}\right) & a_{02}\left({x^{0}}, {x^{1}}, {x^{2}}\right) \\ -a_{01}\left({x^{0}}, {x^{1}}, {x^{2}}\right) & 0 & a_{12}\left({x^{0}}, {x^{1}}, {x^{2}}\right) \\ -a_{02}\left({x^{0}}, {x^{1}}, {x^{2}}\right) & -a_{12}\left({x^{0}}, {x^{1}}, {x^{2}}\right) & 0 \end{array}\right)

Example 14.4

Let us show how the antisymmetrization operation works for tensor fields tT(0,2)Mt\in T^{(0,2)}M.

N = 3 # dimension of manifold M M = Manifold(N, 'M') # manifold M X = M.chart(' '.join(['x'+str(i)+':x^{'+str(i)+'}' for i in range(N)])) # chart on M x0, x1, x2 = X[:] # coordinates x^0, x^1, x^2 of chart X as the Python variables x0, x1, x2 t = M.tensor_field(0,2, name='t') # tensor field of type (0,2) f2 = [['f'+str(i)+str(j) for j in range(N)] for i in range(N)] # table of comp. names f = [[M.scalar_field(function(f2[j][k])(x0,x1,x2), name=f2[j][k]) # table of comp. funcs for k in range(N)] for j in range(N)] t[:] = f # define all components
t.disp() # show tensor t

t=f00dx0dx0+f01dx0dx1+f02dx0dx2+f10dx1dx0+f11dx1dx1+f12dx1dx2+f20dx2dx0+f21dx2dx1+f22dx2dx2\displaystyle t = f_{00} \mathrm{d} {x^{0}}\otimes \mathrm{d} {x^{0}} + f_{01} \mathrm{d} {x^{0}}\otimes \mathrm{d} {x^{1}} + f_{02} \mathrm{d} {x^{0}}\otimes \mathrm{d} {x^{2}} + f_{10} \mathrm{d} {x^{1}}\otimes \mathrm{d} {x^{0}} + f_{11} \mathrm{d} {x^{1}}\otimes \mathrm{d} {x^{1}} + f_{12} \mathrm{d} {x^{1}}\otimes \mathrm{d} {x^{2}} + f_{20} \mathrm{d} {x^{2}}\otimes \mathrm{d} {x^{0}} + f_{21} \mathrm{d} {x^{2}}\otimes \mathrm{d} {x^{1}} + f_{22} \mathrm{d} {x^{2}}\otimes \mathrm{d} {x^{2}}

Now we apply the antisymmetrization operation, the result is 2-form at.

at = t.antisymmetrize() # antisymmetrization of t print(at) # show info on at
2-form on the 3-dimensional differentiable manifold M
Manifold.options.omit_function_arguments=True at.disp() # show at

(12f0112f10)dx0dx1+(12f0212f20)dx0dx2+(12f1212f21)dx1dx2\displaystyle \left( \frac{1}{2} \, f_{01} - \frac{1}{2} \, f_{10} \right) \mathrm{d} {x^{0}}\wedge \mathrm{d} {x^{1}} + \left( \frac{1}{2} \, f_{02} - \frac{1}{2} \, f_{20} \right) \mathrm{d} {x^{0}}\wedge \mathrm{d} {x^{2}} + \left( \frac{1}{2} \, f_{12} - \frac{1}{2} \, f_{21} \right) \mathrm{d} {x^{1}}\wedge \mathrm{d} {x^{2}}

The matrix of components of tt is a full 3-3 matrix:

t[:] # components of t

(f00f01f02f10f11f12f20f21f22)\displaystyle \left(\begin{array}{rrr} f_{00} & f_{01} & f_{02} \\ f_{10} & f_{11} & f_{12} \\ f_{20} & f_{21} & f_{22} \end{array}\right)

and the antisymmetrized tensor has the antisymmetric matrix of components:

at[:] # components of antisymmetrization

(012f0112f1012f0212f2012f01+12f10012f1212f2112f02+12f2012f12+12f210)\displaystyle \left(\begin{array}{rrr} 0 & \frac{1}{2} \, f_{01} - \frac{1}{2} \, f_{10} & \frac{1}{2} \, f_{02} - \frac{1}{2} \, f_{20} \\ -\frac{1}{2} \, f_{01} + \frac{1}{2} \, f_{10} & 0 & \frac{1}{2} \, f_{12} - \frac{1}{2} \, f_{21} \\ -\frac{1}{2} \, f_{02} + \frac{1}{2} \, f_{20} & -\frac{1}{2} \, f_{12} + \frac{1}{2} \, f_{21} & 0 \end{array}\right)

Example 14.5

Consider a tensor field of type (0,3)(0,3) on a 4-dimensional manifold and its antisymmetrization.

%display latex N = 4 # dimension of the manifold M M = Manifold(N, 'M') # manifold M X = M.chart(' '.join(['x'+str(i)+':x^{'+str(i)+'}' for i in range(N)])) # chart on M t3 = M.tensor_field(0,3, name='t3') # tensor field of type (0,3) print(t3) # show info on t3 # table of component names: f3 = [[['a'+str(i)+str(j)+str(k) for k in range(N)] for j in range(N)] for i in range(N)] # table of component functions: f = [[[M.scalar_field(function(f3[i][j][k])(*X), name=f3[i][j][k]) for k in range(N)] for j in range(N)] for i in range(N)] t3[:] = f # define all components
Tensor field t3 of type (0,3) on the 4-dimensional differentiable manifold M

Let ee be the frame:

e = X.frame(); e # frame of M

(M,(x0,x1,x2,x3))\displaystyle \left(M, \left(\frac{\partial}{\partial {x^{0}} },\frac{\partial}{\partial {x^{1}} },\frac{\partial}{\partial {x^{2}} },\frac{\partial}{\partial {x^{3}} }\right)\right)

and let's show how the definition of the antisymmetrization works if we take (v1,v2,v3)=(x0,x1,x2)(v_1,v_2,v_3)=(\frac{\partial}{\partial x^0}, \frac{\partial}{\partial x^1},\frac{\partial}{\partial x^2}) in (14.2):

S3 = Permutations(3).list() # S_3 group s = 1/factorial(3)*sum([sign(p)*t3(e[p[0]-1],e[p[1]-1],e[p[2]-1]) for p in S3]) # special case of (14.2)
Manifold.options.omit_function_arguments=True s.disp() # show the result #s.expr()

MR(x0,x1,x2,x3)16a01216a02116a102+16a120+16a20116a210\displaystyle \begin{array}{llcl} & M & \longrightarrow & \mathbb{R} \\ & \left({x^{0}}, {x^{1}}, {x^{2}}, {x^{3}}\right) & \longmapsto & \frac{1}{6} \, a_{012} - \frac{1}{6} \, a_{021} - \frac{1}{6} \, a_{102} + \frac{1}{6} \, a_{120} + \frac{1}{6} \, a_{201} - \frac{1}{6} \, a_{210} \end{array}

As we can see the sum contains 3!=6 elements with signs equal to permutations signs.

For comparison one can use the antisymmetrize method:

# built in t3a = t3.antisymmetrize() # antisymmetrization

MR(x0,x1,x2,x3)16a01216a02116a102+16a120+16a20116a210\displaystyle \begin{array}{llcl} & M & \longrightarrow & \mathbb{R} \\ & \left({x^{0}}, {x^{1}}, {x^{2}}, {x^{3}}\right) & \longmapsto & \frac{1}{6} \, a_{012} - \frac{1}{6} \, a_{021} - \frac{1}{6} \, a_{102} + \frac{1}{6} \, a_{120} + \frac{1}{6} \, a_{201} - \frac{1}{6} \, a_{210} \end{array}

Example 14.6

Define two 1-forms with symbolic components and compute their wedge product.

N = 3 # dimension of manifold M M = Manifold(N, 'M') # manifold M X = M.chart(' '.join(['x'+str(i)+':x^{'+str(i)+'}' for i in range(N)])) # chart on M a = M.diff_form(1,name='a') # 1-form a b = M.diff_form(1,name='b') # 1-form b ast = ['a'+str(j) for j in range(N)] # list of component names bst = ['b'+str(j) for j in range(N)] # list of component names af = [M.scalar_field(function(ast[j])(*X),name=ast[j]) for j in range(N)] # list of component functions bf = [M.scalar_field(function(bst[j])(*X),name=bst[j]) for j in range(N)] # list of component functions a[:] = af # define all components of a b[:] = bf # define all components of b
Manifold.options.omit_function_arguments=True %display latex a.disp() # show a

a=a0dx0+a1dx1+a2dx2\displaystyle a = a_{0} \mathrm{d} {x^{0}} + a_{1} \mathrm{d} {x^{1}} + a_{2} \mathrm{d} {x^{2}}

b.disp() # show b

b=b0dx0+b1dx1+b2dx2\displaystyle b = b_{0} \mathrm{d} {x^{0}} + b_{1} \mathrm{d} {x^{1}} + b_{2} \mathrm{d} {x^{2}}

# mathematical object of which "b" is an element. b.parent()

Ω1(M)\displaystyle \Omega^{1}\left(M\right)

Wedge product aba\wedge b:

ab = a.wedge(b) # wedge product ab.disp() # in SageMath

ab=(a1b0+a0b1)dx0dx1+(a2b0+a0b2)dx0dx2+(a2b1+a1b2)dx1dx2\displaystyle a\wedge b = \left( -a_{1} b_{0} + a_{0} b_{1} \right) \mathrm{d} {x^{0}}\wedge \mathrm{d} {x^{1}} + \left( -a_{2} b_{0} + a_{0} b_{2} \right) \mathrm{d} {x^{0}}\wedge \mathrm{d} {x^{2}} + \left( -a_{2} b_{1} + a_{1} b_{2} \right) \mathrm{d} {x^{1}}\wedge \mathrm{d} {x^{2}}

Compare with the result obtained from definition (14.3):

ab1 = factorial(1+1)/factorial(1)/factorial(1)*(a*b).antisymmetrize() ab1.disp() # use formula (14.3)

(a1b0+a0b1)dx0dx1+(a2b0+a0b2)dx0dx2+(a2b1+a1b2)dx1dx2\displaystyle \left( -a_{1} b_{0} + a_{0} b_{1} \right) \mathrm{d} {x^{0}}\wedge \mathrm{d} {x^{1}} + \left( -a_{2} b_{0} + a_{0} b_{2} \right) \mathrm{d} {x^{0}}\wedge \mathrm{d} {x^{2}} + \left( -a_{2} b_{1} + a_{1} b_{2} \right) \mathrm{d} {x^{1}}\wedge \mathrm{d} {x^{2}}

ab1 == ab # check if both methods agree

True\displaystyle \mathrm{True}

Define the matrix containing the components of 1-forms in rows:

ma = matrix([a[:],b[:]]) ma

(a0a1a2b0b1b2)\displaystyle \left(\begin{array}{rrr} a_{0} & a_{1} & a_{2} \\ b_{0} & b_{1} & b_{2} \end{array}\right)

The components of the wedge product of 1-forms are minors of the matrix of components of these 1-forms.


[a1b0+a0b1,a2b0+a0b2,a2b1+a1b2]\displaystyle \left[-a_{1} b_{0} + a_{0} b_{1}, -a_{2} b_{0} + a_{0} b_{2}, -a_{2} b_{1} + a_{1} b_{2}\right]

Example 14.7

Consider the wedge product of three 1-forms (in 3-dimensional manifold).

# continuation Manifold.options.omit_function_arguments=True cst = ['c'+str(j) for j in range(N)] # list of component names cf = [M.scalar_field(function(cst[j])(*X),name=cst[j]) for j in range(N)] # list of component functions c = M.diff_form(1,name='c') # 1-form c c[:] = cf # define all coefficients abc = (a.wedge(b)).wedge(c) # wedge prod. a /\ b /\ c abc.disp()

abc=((a2b1a1b2)c0+(a2b0a0b2)c1(a1b0a0b1)c2)dx0dx1dx2\displaystyle a\wedge b\wedge c = \left( -{\left(a_{2} b_{1} - a_{1} b_{2}\right)} c_{0} + {\left(a_{2} b_{0} - a_{0} b_{2}\right)} c_{1} - {\left(a_{1} b_{0} - a_{0} b_{1}\right)} c_{2} \right) \mathrm{d} {x^{0}}\wedge \mathrm{d} {x^{1}}\wedge \mathrm{d} {x^{2}}

We can recognize in the result the Laplace expansion of the determinant  \ det (a0,a1,a2b0,b1,b2c0,c1,c2),  \left(\begin{matrix} a_0,a_1,a_2\\ b_0,b_1,b_2\\ c_0,c_1,c2 \end{matrix}\right),\ \ so we have
abc=\quad a\wedge b\wedge c= det (a0,a1,a2b0,b1,b2c0,c1,c2)dx0dx1dx2.\left(\begin{matrix} a_0,a_1,a_2\\ b_0,b_1,b_2\\ c_0,c_1,c2 \end{matrix}\right) dx^0\wedge dx^1\wedge dx^2.

We can check the observation using SageMath:

d = X.coframe() d

(M,(dx0,dx1,dx2))\displaystyle \left(M, \left(\mathrm{d} {x^{0}},\mathrm{d} {x^{1}},\mathrm{d} {x^{2}}\right)\right)

# compare abc with the 3-form with the determinant as coefficient abc == det(matrix([a[:],b[:],c[:]]))*(d[0].wedge(d[1])).wedge(d[2])

True\displaystyle \mathrm{True}

The unique component of the wedge product abc=abcabc=a\wedge b\wedge c must be equal to   abc(x0,x1,x2)\ \ abc(\frac{\partial}{\partial x^0},\frac{\partial}{\partial x^1},\frac{\partial}{\partial x^2}).

Let us check it with SageMath Manifolds.

X.frame() # default frame

(M,(x0,x1,x2))\displaystyle \left(M, \left(\frac{\partial}{\partial {x^{0}} },\frac{\partial}{\partial {x^{1}} },\frac{\partial}{\partial {x^{2}} }\right)\right)

# check if the value of abc on the frame # is equal to det([a[:],b[:],c[:]]) abc(*X.frame()) == det(matrix([a[:],b[:],c[:]]))

True\displaystyle \mathrm{True}

# the same in an other way abc[0,1,2] == det(matrix([a[:],b[:],c[:]]))

True\displaystyle \mathrm{True}

Example 14.8

Consider two 2-forms on a 4-dimensional manifold.

N = 4 # dimension of manifold M M = Manifold(N, 'M') # manifold M X = M.chart(' '.join(['x'+str(i)+':x^{'+str(i)+'}' for i in range(N)])) # chart on M a=M.diff_form(2,name='a') # 2-form a b=M.diff_form(2,name='b') # 2-form b

We define first the names of functions,

def ast(i,j): return 'a'+str(i)+str(j) # names of comp. for a def bst(i,j): return 'b'+str(i)+str(j) # names of comp. for b

and the upper triangles of component matrices.

for i0 in range(N): # component functions for a for i1 in range(N): if i1>i0: a[i0,i1] = M.scalar_field(function(ast(i0,i1))(*X), name=ast(i0,i1)) for i0 in range(N): # component functions for b for i1 in range(N): if i1>i0: b[i0,i1] = M.scalar_field(function(bst(i0,i1))(*X), name=bst(i0,i1))
Manifold.options.omit_function_arguments=True %display latex a[:] # show components of a

(0a01a02a03a010a12a13a02a120a23a03a13a230)\displaystyle \left(\begin{array}{rrrr} 0 & a_{01} & a_{02} & a_{03} \\ -a_{01} & 0 & a_{12} & a_{13} \\ -a_{02} & -a_{12} & 0 & a_{23} \\ -a_{03} & -a_{13} & -a_{23} & 0 \end{array}\right)

b[:] # show components of b

(0b01b02b03b010b12b13b02b120b23b03b13b230)\displaystyle \left(\begin{array}{rrrr} 0 & b_{01} & b_{02} & b_{03} \\ -b_{01} & 0 & b_{12} & b_{13} \\ -b_{02} & -b_{12} & 0 & b_{23} \\ -b_{03} & -b_{13} & -b_{23} & 0 \end{array}\right)

Recall that according to the general rule, to obtain the wedge product we use all possible strictly increasing and disjoint sequences I=(i1,i2), J=(j1,j2)I=(i_1,i_2),\ J=(j_1,j_2) and define dxK=e1e2e3e4,dx^K=e^1\wedge e^2\wedge e^3\wedge e^4, where K=(1,2,3,4)K=(1,2,3,4) is reordered disjoint union IJI\cup J. We have

(IaIdxI)(JbJdxJ)=K(IJ=KIJ=±aIbJ)dxK.\Big(\sum_I a_Idx^I\Big)\wedge\Big(\sum_J b_Jdx^J\Big)= \sum_K\Big(\sum_{\substack{I\cup J=K\\I\cap J=\emptyset}}\pm a_Ib_J\Big)dx^K.

To be less formal, to compute the wedge product we

a) take all possible components of the first 2-form with increasing permutations II of two indices from (0,1,2,3);

b) multiply them by components of the second 2-form with increasing permutations JJ of the remaining 2 indices;

c) the products are taken with + or - depending on the sign of the joined permutation (I,J)(I,J) of (0,1,2,3).