De Rham Cohomology

Let \(M\) and \(N\) be differentiable manifolds and \(\varphi\colon M \to N\) be a differentiable map. Then the associated de Rham complex is given by

\[0 \rightarrow \Omega^0(M,\varphi) \xrightarrow{\mathrm{d}_0} \Omega^1(M,\varphi) \xrightarrow{\mathrm{d}_1} \dots \xrightarrow{\mathrm{d}_{n-1}} \Omega^n(M,\varphi) \xrightarrow{\mathrm{d}_{n}} 0,\]

where \(\Omega^k(M,\varphi)\) is the module of differential forms of degree \(k\), and \(d_k\) is the associated exterior derivative. Then the \(k\)-th de Rham cohomology group is given by

\[H^k_{\mathrm{dR}}(M, \varphi) = \left. \mathrm{ker}(\mathrm{d}_k) \middle/ \mathrm{im}(\mathrm{d}_{k-1}) \right. ,\]

and the corresponding ring is obtained by

\[H^*_{\mathrm{dR}}(M, \varphi) = \bigoplus^n_{k=0} H^k_{\mathrm{dR}}(M, \varphi).\]

The de Rham cohomology ring is implemented via DeRhamCohomologyRing. Its elements, the cohomology classes, are represented by DeRhamCohomologyClass.

AUTHORS:

  • Michael Jung (2021) : initial version

class sage.manifolds.differentiable.de_rham_cohomology.DeRhamCohomologyClass(parent, representative)[source]

Bases: AlgebraElement

Define a cohomology class in the de Rham cohomology ring.

INPUT:

  • parent – de Rham cohomology ring represented by an instance of DeRhamCohomologyRing

  • representative – a closed (mixed) differential form representing the cohomology class

Note

The current implementation only provides basic features. Comparison via exact forms are not supported at the time being.

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()
sage: C = M.de_rham_complex()
sage: H = C.cohomology()
sage: omega = M.diff_form(1, [1,1], name='omega')
sage: u = H(omega); u
[omega]
>>> from sage.all import *
>>> M = Manifold(Integer(2), 'M')
>>> X = M.chart(names=('x', 'y',)); (x, y,) = X._first_ngens(2)
>>> C = M.de_rham_complex()
>>> H = C.cohomology()
>>> omega = M.diff_form(Integer(1), [Integer(1),Integer(1)], name='omega')
>>> u = H(omega); u
[omega]
M = Manifold(2, 'M')
X.<x,y> = M.chart()
C = M.de_rham_complex()
H = C.cohomology()
omega = M.diff_form(1, [1,1], name='omega')
u = H(omega); u

Cohomology classes can be lifted to the algebra of mixed differential forms:

sage: u.lift()
Mixed differential form omega on the 2-dimensional differentiable
 manifold M
>>> from sage.all import *
>>> u.lift()
Mixed differential form omega on the 2-dimensional differentiable
 manifold M
u.lift()

However, comparison of two cohomology classes is limited the time being:

sage: eta = M.diff_form(1, [1,1], name='eta')
sage: H(eta) == u
True
sage: H.one() == u
Traceback (most recent call last):
...
NotImplementedError: comparison via exact forms is currently not supported
>>> from sage.all import *
>>> eta = M.diff_form(Integer(1), [Integer(1),Integer(1)], name='eta')
>>> H(eta) == u
True
>>> H.one() == u
Traceback (most recent call last):
...
NotImplementedError: comparison via exact forms is currently not supported
eta = M.diff_form(1, [1,1], name='eta')
H(eta) == u
H.one() == u
cup(other)[source]

Cup product of two cohomology classes.

INPUT:

  • other – another cohomology class in the de Rham cohomology

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()
sage: C = M.de_rham_complex()
sage: H = C.cohomology()
sage: omega = M.diff_form(1, [1,1], name='omega')
sage: eta = M.diff_form(1, [1,-1], name='eta')
sage: H(omega).cup(H(eta))
[omega∧eta]
>>> from sage.all import *
>>> M = Manifold(Integer(2), 'M')
>>> X = M.chart(names=('x', 'y',)); (x, y,) = X._first_ngens(2)
>>> C = M.de_rham_complex()
>>> H = C.cohomology()
>>> omega = M.diff_form(Integer(1), [Integer(1),Integer(1)], name='omega')
>>> eta = M.diff_form(Integer(1), [Integer(1),-Integer(1)], name='eta')
>>> H(omega).cup(H(eta))
[omega∧eta]
M = Manifold(2, 'M')
X.<x,y> = M.chart()
C = M.de_rham_complex()
H = C.cohomology()
omega = M.diff_form(1, [1,1], name='omega')
eta = M.diff_form(1, [1,-1], name='eta')
H(omega).cup(H(eta))
lift()[source]

Return a representative of self in the associated de Rham complex.

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()
sage: C = M.de_rham_complex()
sage: H = C.cohomology()
sage: omega = M.diff_form(2, name='omega')
sage: omega[0,1] = x
sage: omega.display()
omega = x dx∧dy
sage: u = H(omega); u
[omega]
sage: u.representative()
Mixed differential form omega on the 2-dimensional differentiable
 manifold M
>>> from sage.all import *
>>> M = Manifold(Integer(2), 'M')
>>> X = M.chart(names=('x', 'y',)); (x, y,) = X._first_ngens(2)
>>> C = M.de_rham_complex()
>>> H = C.cohomology()
>>> omega = M.diff_form(Integer(2), name='omega')
>>> omega[Integer(0),Integer(1)] = x
>>> omega.display()
omega = x dx∧dy
>>> u = H(omega); u
[omega]
>>> u.representative()
Mixed differential form omega on the 2-dimensional differentiable
 manifold M
M = Manifold(2, 'M')
X.<x,y> = M.chart()
C = M.de_rham_complex()
H = C.cohomology()
omega = M.diff_form(2, name='omega')
omega[0,1] = x
omega.display()
u = H(omega); u
u.representative()
representative()[source]

Return a representative of self in the associated de Rham complex.

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()
sage: C = M.de_rham_complex()
sage: H = C.cohomology()
sage: omega = M.diff_form(2, name='omega')
sage: omega[0,1] = x
sage: omega.display()
omega = x dx∧dy
sage: u = H(omega); u
[omega]
sage: u.representative()
Mixed differential form omega on the 2-dimensional differentiable
 manifold M
>>> from sage.all import *
>>> M = Manifold(Integer(2), 'M')
>>> X = M.chart(names=('x', 'y',)); (x, y,) = X._first_ngens(2)
>>> C = M.de_rham_complex()
>>> H = C.cohomology()
>>> omega = M.diff_form(Integer(2), name='omega')
>>> omega[Integer(0),Integer(1)] = x
>>> omega.display()
omega = x dx∧dy
>>> u = H(omega); u
[omega]
>>> u.representative()
Mixed differential form omega on the 2-dimensional differentiable
 manifold M
M = Manifold(2, 'M')
X.<x,y> = M.chart()
C = M.de_rham_complex()
H = C.cohomology()
omega = M.diff_form(2, name='omega')
omega[0,1] = x
omega.display()
u = H(omega); u
u.representative()
class sage.manifolds.differentiable.de_rham_cohomology.DeRhamCohomologyRing(de_rham_complex)[source]

Bases: Parent, UniqueRepresentation

The de Rham cohomology ring of a de Rham complex.

This ring is naturally endowed with a multiplication induced by the wedge product, called cup product, see DeRhamCohomologyClass.cup().

Note

The current implementation only provides basic features. Comparison via exact forms are not supported at the time being.

INPUT:

  • de_rham_complex – a de Rham complex, typically an instance of MixedFormAlgebra

EXAMPLES:

We define the de Rham cohomology ring on a parallelizable manifold \(M\):

sage: M = Manifold(2, 'M')
sage: X.<x,y> = M.chart()
sage: C = M.de_rham_complex()
sage: H = C.cohomology(); H
De Rham cohomology ring on the 2-dimensional differentiable manifold M
>>> from sage.all import *
>>> M = Manifold(Integer(2), 'M')
>>> X = M.chart(names=('x', 'y',)); (x, y,) = X._first_ngens(2)
>>> C = M.de_rham_complex()
>>> H = C.cohomology(); H
De Rham cohomology ring on the 2-dimensional differentiable manifold M
M = Manifold(2, 'M')
X.<x,y> = M.chart()
C = M.de_rham_complex()
H = C.cohomology(); H

Its elements are induced by closed differential forms on \(M\):

sage: beta = M.diff_form(1, [1,0], name='beta')
sage: beta.display()
beta = dx
sage: d1 = C.differential(1)
sage: d1(beta).display()
dbeta = 0
sage: b = H(beta); b
[beta]
>>> from sage.all import *
>>> beta = M.diff_form(Integer(1), [Integer(1),Integer(0)], name='beta')
>>> beta.display()
beta = dx
>>> d1 = C.differential(Integer(1))
>>> d1(beta).display()
dbeta = 0
>>> b = H(beta); b
[beta]
beta = M.diff_form(1, [1,0], name='beta')
beta.display()
d1 = C.differential(1)
d1(beta).display()
b = H(beta); b

Cohomology classes can be lifted to the algebra of mixed differential forms:

sage: b.representative()
Mixed differential form beta on the 2-dimensional differentiable
 manifold M
>>> from sage.all import *
>>> b.representative()
Mixed differential form beta on the 2-dimensional differentiable
 manifold M
b.representative()

The ring admits a zero and unit element:

sage: H.zero()
[zero]
sage: H.one()
[one]
>>> from sage.all import *
>>> H.zero()
[zero]
>>> H.one()
[one]
H.zero()
H.one()
Element[source]

alias of DeRhamCohomologyClass

one()[source]

Return the one element of self.

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: C = M.de_rham_complex()
sage: H = C.cohomology()
sage: H.one()
[one]
sage: H.one().representative()
Mixed differential form one on the 2-dimensional differentiable
 manifold M
>>> from sage.all import *
>>> M = Manifold(Integer(2), 'M')
>>> C = M.de_rham_complex()
>>> H = C.cohomology()
>>> H.one()
[one]
>>> H.one().representative()
Mixed differential form one on the 2-dimensional differentiable
 manifold M
M = Manifold(2, 'M')
C = M.de_rham_complex()
H = C.cohomology()
H.one()
H.one().representative()
zero()[source]

Return the zero element of self.

EXAMPLES:

sage: M = Manifold(2, 'M')
sage: C = M.de_rham_complex()
sage: H = C.cohomology()
sage: H.zero()
[zero]
sage: H.zero().representative()
Mixed differential form zero on the 2-dimensional differentiable
 manifold M
>>> from sage.all import *
>>> M = Manifold(Integer(2), 'M')
>>> C = M.de_rham_complex()
>>> H = C.cohomology()
>>> H.zero()
[zero]
>>> H.zero().representative()
Mixed differential form zero on the 2-dimensional differentiable
 manifold M
M = Manifold(2, 'M')
C = M.de_rham_complex()
H = C.cohomology()
H.zero()
H.zero().representative()