Algebra of Scalar Fields - Manifolds

Skip to content
Back to top
View this page
Edit this page

# Algebra of Scalar Fields

The class `ScalarFieldAlgebra` implements the commutative algebra \(C^0(M)\) of scalar fields on a topological manifold \(M\) over a topological field \(K\). By scalar field, it is meant a continuous function \(M \to K\). The set \(C^0(M)\) is an algebra over \(K\), whose ring product is the pointwise multiplication of \(K\)-valued functions, which is clearly commutative.

AUTHORS:

- Eric Gourgoulhon, Michal Bejger (2014-2015): initial version

- Travis Scrimshaw (2016): review tweaks

REFERENCES:

- [Lee2011]

- [KN1963]

class sage.manifolds.scalarfield_algebra.ScalarFieldAlgebra(domain)

  Bases: `UniqueRepresentation`, `Parent`

  Commutative algebra of scalar fields on a topological manifold.

  If \(M\) is a topological manifold over a topological field \(K\), the commutative algebra of scalar fields on \(M\) is the set \(C^0(M)\) of all continuous maps \(M \to K\). The set \(C^0(M)\) is an algebra over \(K\), whose ring product is the pointwise multiplication of \(K\)-valued functions, which is clearly commutative.

  If \(K = \RR\) or \(K = \CC\), the field \(K\) over which the algebra \(C^0(M)\) is constructed is represented by the `Symbolic Ring` `SR`, since there is no exact representation of \(\RR\) nor \(\CC\).

  INPUT:

  - `domain` – the topological manifold \(M\) on which the scalar fields are defined

  EXAMPLES:

  Algebras of scalar fields on the sphere \(S^2\) and on some open subsets of it:

  Sage

      sage: M = Manifold(2, 'M', structure='topological') # the 2-dimensional sphere S^2
      sage: U = M.open_subset('U')  # complement of the North pole
      sage: c_xy.<x,y> = U.chart()  # stereographic coordinates from the North pole
      sage: V = M.open_subset('V')  # complement of the South pole
      sage: c_uv.<u,v> = V.chart()  # stereographic coordinates from the South pole
      sage: M.declare_union(U,V)    # S^2 is the union of U and V
      sage: xy_to_uv = c_xy.transition_map(c_uv, (x/(x^2+y^2), y/(x^2+y^2)),
      ....:                                intersection_name='W',
      ....:                                restrictions1= x^2+y^2!=0,
      ....:                                restrictions2= u^2+v^2!=0)
      sage: uv_to_xy = xy_to_uv.inverse()
      sage: CM = M.scalar_field_algebra(); CM
      Algebra of scalar fields on the 2-dimensional topological manifold M
      sage: W = U.intersection(V)  # S^2 minus the two poles
      sage: CW = W.scalar_field_algebra(); CW
      Algebra of scalar fields on the Open subset W of the
       2-dimensional topological manifold M

  Python

      >>> from sage.all import *
      >>> M = Manifold(Integer(2), 'M', structure='topological') # the 2-dimensional sphere S^2
      >>> U = M.open_subset('U')  # complement of the North pole
      >>> c_xy = U.chart(names=('x', 'y',)); (x, y,) = c_xy._first_ngens(2)# stereographic coordinates from the North pole
      >>> V = M.open_subset('V')  # complement of the South pole
      >>> c_uv = V.chart(names=('u', 'v',)); (u, v,) = c_uv._first_ngens(2)# stereographic coordinates from the South pole
      >>> M.declare_union(U,V)    # S^2 is the union of U and V
      >>> xy_to_uv = c_xy.transition_map(c_uv, (x/(x**Integer(2)+y**Integer(2)), y/(x**Integer(2)+y**Integer(2))),
      ...                                intersection_name='W',
      ...                                restrictions1= x**Integer(2)+y**Integer(2)!=Integer(0),
      ...                                restrictions2= u**Integer(2)+v**Integer(2)!=Integer(0))
      >>> uv_to_xy = xy_to_uv.inverse()
      >>> CM = M.scalar_field_algebra(); CM
      Algebra of scalar fields on the 2-dimensional topological manifold M
      >>> W = U.intersection(V)  # S^2 minus the two poles
      >>> CW = W.scalar_field_algebra(); CW
      Algebra of scalar fields on the Open subset W of the
       2-dimensional topological manifold M

  \(C^0(M)\) and \(C^0(W)\) belong to the category of commutative algebras over \(\RR\) (represented here by `SymbolicRing`):

  Sage

      sage: CM.category()
      Join of Category of commutative algebras over Symbolic Ring and Category of homsets of topological spaces
      sage: CM.base_ring()
      Symbolic Ring
      sage: CW.category()
      Join of Category of commutative algebras over Symbolic Ring and Category of homsets of topological spaces
      sage: CW.base_ring()
      Symbolic Ring

  [Python]

      >>> from sage.all import *
      >>> CM.category()
      Join of Category of commutative algebras over Symbolic Ring and Category of homsets of topological spaces
      >>> CM.base_ring()
      Symbolic Ring
      >>> CW.category()
      Join of Category of commutative algebras over Symbolic Ring and Category of homsets of topological spaces
      >>> CW.base_ring()
      Symbolic Ring

  The elements of \(C^0(M)\) are scalar fields on \(M\):

  Sage

      sage: CM.an_element()
      Scalar field on the 2-dimensional topological manifold M
      sage: CM.an_element().display()  # this sample element is a constant field
      M → ℝ
      on U: (x, y) ↦ 2
      on V: (u, v) ↦ 2

  Python

      >>> from sage.all import *
      >>> CM.an_element()
      Scalar field on the 2-dimensional topological manifold M
      >>> CM.an_element().display()  # this sample element is a constant field
      M → ℝ
      on U: (x, y) ↦ 2
      on V: (u, v) ↦ 2

  Those of \(C^0(W)\) are scalar fields on \(W\):

  Sage

      sage: CW.an_element()
      Scalar field on the Open subset W of the 2-dimensional topological
       manifold M
      sage: CW.an_element().display()  # this sample element is a constant field
      W → ℝ
      (x, y) ↦ 2
      (u, v) ↦ 2

  [Python]

      >>> from sage.all import *
      >>> CW.an_element()
      Scalar field on the Open subset W of the 2-dimensional topological
       manifold M
      >>> CW.an_element().display()  # this sample element is a constant field
      W → ℝ
      (x, y) ↦ 2
      (u, v) ↦ 2

  The zero element:

  Sage

      sage: CM.zero()
      Scalar field zero on the 2-dimensional topological manifold M
      sage: CM.zero().display()
      zero: M → ℝ
      on U: (x, y) ↦ 0
      on V: (u, v) ↦ 0

  Python

      >>> from sage.all import *
      >>> CM.zero()
      Scalar field zero on the 2-dimensional topological manifold M
      >>> CM.zero().display()
      zero: M → ℝ
      on U: (x, y) ↦ 0
      on V: (u, v) ↦ 0

  Sage

      sage: CW.zero()
      Scalar field zero on the Open subset W of the 2-dimensional
       topological manifold M
      sage: CW.zero().display()
      zero: W → ℝ
         (x, y) ↦ 0
         (u, v) ↦ 0

  [Python]

      >>> from sage.all import *
      >>> CW.zero()
      Scalar field zero on the Open subset W of the 2-dimensional
       topological manifold M
      >>> CW.zero().display()
      zero: W → ℝ
         (x, y) ↦ 0
         (u, v) ↦ 0

  The unit element:

  Sage

      sage: CM.one()
      Scalar field 1 on the 2-dimensional topological manifold M
      sage: CM.one().display()
      1: M → ℝ
      on U: (x, y) ↦ 1
      on V: (u, v) ↦ 1

  Python

      >>> from sage.all import *
      >>> CM.one()
      Scalar field 1 on the 2-dimensional topological manifold M
      >>> CM.one().display()
      1: M → ℝ
      on U: (x, y) ↦ 1
      on V: (u, v) ↦ 1

  Sage

      sage: CW.one()
      Scalar field 1 on the Open subset W of the 2-dimensional topological
       manifold M
      sage: CW.one().display()
      1: W → ℝ
        (x, y) ↦ 1
        (u, v) ↦ 1

  [Python]

      >>> from sage.all import *
      >>> CW.one()
      Scalar field 1 on the Open subset W of the 2-dimensional topological
       manifold M
      >>> CW.one().display()
      1: W → ℝ
        (x, y) ↦ 1
        (u, v) ↦ 1

  A generic element can be constructed by using a dictionary of the coordinate expressions defining the scalar field:

  Sage

      sage: f = CM({c_xy: atan(x^2+y^2), c_uv: pi/2 - atan(u^2+v^2)}); f
      Scalar field on the 2-dimensional topological manifold M
      sage: f.display()
      M → ℝ
      on U: (x, y) ↦ arctan(x^2 + y^2)
      on V: (u, v) ↦ 1/2*pi - arctan(u^2 + v^2)
      sage: f.parent()
      Algebra of scalar fields on the 2-dimensional topological manifold M

  Python

      >>> from sage.all import *
      >>> f = CM({c_xy: atan(x**Integer(2)+y**Integer(2)), c_uv: pi/Integer(2) - atan(u**Integer(2)+v**Integer(2))}); f
      Scalar field on the 2-dimensional topological manifold M
      >>> f.display()
      M → ℝ
      on U: (x, y) ↦ arctan(x^2 + y^2)
      on V: (u, v) ↦ 1/2*pi - arctan(u^2 + v^2)
      >>> f.parent()
      Algebra of scalar fields on the 2-dimensional topological manifold M

  Specific elements can also be constructed in this way:

  Sage

      sage: CM(0) == CM.zero()
      True
      sage: CM(1) == CM.one()
      True

  [Python]

      >>> from sage.all import *
      >>> CM(Integer(0)) == CM.zero()
      True
      >>> CM(Integer(1)) == CM.one()
      True

  Note that the zero scalar field is cached:

  Sage

      sage: CM(0) is CM.zero()
      True

  Python

      >>> from sage.all import *
      >>> CM(Integer(0)) is CM.zero()
      True

  Elements can also be constructed by means of the method `scalar_field()` acting on the domain (this allows one to set the name of the scalar field at the construction):

  Sage

      sage: f1 = M.scalar_field({c_xy: atan(x^2+y^2), c_uv: pi/2 - atan(u^2+v^2)},
      ....:                     name='f')
      sage: f1.parent()
      Algebra of scalar fields on the 2-dimensional topological manifold M
      sage: f1 == f
      True
      sage: M.scalar_field(0, chart='all') == CM.zero()
      True

  [Python]

      >>> from sage.all import *
      >>> f1 = M.scalar_field({c_xy: atan(x**Integer(2)+y**Integer(2)), c_uv: pi/Integer(2) - atan(u**Integer(2)+v**Integer(2))},
      ...                     name='f')
      >>> f1.parent()
      Algebra of scalar fields on the 2-dimensional topological manifold M
      >>> f1 == f
      True
      >>> M.scalar_field(Integer(0), chart='all') == CM.zero()
      True

  The algebra \(C^0(M)\) coerces to \(C^0(W)\) since \(W\) is an open subset of \(M\):

  Sage

      sage: CW.has_coerce_map_from(CM)
      True

  Python

      >>> from sage.all import *
      >>> CW.has_coerce_map_from(CM)
      True

  The reverse is of course false:

  Sage

      sage: CM.has_coerce_map_from(CW)
      False

  [Python]

      >>> from sage.all import *
      >>> CM.has_coerce_map_from(CW)
      False

  The coercion map is nothing but the restriction to \(W\) of scalar fields on \(M\):

  Sage

      sage: fW = CW(f) ; fW
      Scalar field on the Open subset W of the
       2-dimensional topological manifold M
      sage: fW.display()
      W → ℝ
        (x, y) ↦ arctan(x^2 + y^2)
        (u, v) ↦ 1/2*pi - arctan(u^2 + v^2)

  Python

      >>> from sage.all import *
      >>> fW = CW(f) ; fW
      Scalar field on the Open subset W of the
       2-dimensional topological manifold M
      >>> fW.display()
      W → ℝ
        (x, y) ↦ arctan(x^2 + y^2)
        (u, v) ↦ 1/2*pi - arctan(u^2 + v^2)

  Sage

      sage: CW(CM.one()) == CW.one()
      True

  [Python]

      >>> from sage.all import *
      >>> CW(CM.one()) == CW.one()
      True

  The coercion map allows for the addition of elements of \(C^0(W)\) with elements of \(C^0(M)\), the result being an element of \(C^0(W)\):

  Sage

      sage: s = fW + f
      sage: s.parent()
      Algebra of scalar fields on the Open subset W of the
       2-dimensional topological manifold M
      sage: s.display()
      W → ℝ
        (x, y) ↦ 2*arctan(x^2 + y^2)
        (u, v) ↦ pi - 2*arctan(u^2 + v^2)

  Python

      >>> from sage.all import *
      >>> s = fW + f
      >>> s.parent()
      Algebra of scalar fields on the Open subset W of the
       2-dimensional topological manifold M
      >>> s.display()
      W → ℝ
        (x, y) ↦ 2*arctan(x^2 + y^2)
        (u, v) ↦ pi - 2*arctan(u^2 + v^2)

  Another coercion is that from the Symbolic Ring. Since the Symbolic Ring is the base ring for the algebra `CM`, the coercion of a symbolic expression `s` is performed by the operation `s*CM.one()`, which invokes the (reflected) multiplication operator. If the symbolic expression does not involve any chart coordinate, the outcome is a constant scalar field:

  Sage

      sage: h = CM(pi*sqrt(2)) ; h
      Scalar field on the 2-dimensional topological manifold M
      sage: h.display()
      M → ℝ
      on U: (x, y) ↦ sqrt(2)*pi
      on V: (u, v) ↦ sqrt(2)*pi
      sage: a = var('a')
      sage: h = CM(a); h.display()
      M → ℝ
      on U: (x, y) ↦ a
      on V: (u, v) ↦ a

  [Python]

      >>> from sage.all import *
      >>> h = CM(pi*sqrt(Integer(2))) ; h
      Scalar field on the 2-dimensional topological manifold M
      >>> h.display()
      M → ℝ
      on U: (x, y) ↦ sqrt(2)*pi
      on V: (u, v) ↦ sqrt(2)*pi
      >>> a = var('a')
      >>> h = CM(a); h.display()
      M → ℝ
      on U: (x, y) ↦ a
      on V: (u, v) ↦ a

  If the symbolic expression involves some coordinate of one of the manifold’s charts, the outcome is initialized only on the chart domain:

  Sage

      sage: h = CM(a+x); h.display()
      M → ℝ
      on U: (x, y) ↦ a + x
      on W: (u, v) ↦ (a*u^2 + a*v^2 + u)/(u^2 + v^2)
      sage: h = CM(a+u); h.display()
      M → ℝ
      on W: (x, y) ↦ (a*x^2 + a*y^2 + x)/(x^2 + y^2)
      on V: (u, v) ↦ a + u

  Python

      >>> from sage.all import *
      >>> h = CM(a+x); h.display()
      M → ℝ
      on U: (x, y) ↦ a + x
      on W: (u, v) ↦ (a*u^2 + a*v^2 + u)/(u^2 + v^2)
      >>> h = CM(a+u); h.display()
      M → ℝ
      on W: (x, y) ↦ (a*x^2 + a*y^2 + x)/(x^2 + y^2)
      on V: (u, v) ↦ a + u

  If the symbolic expression involves coordinates of different charts, the scalar field is created as a Python object, but is not initialized, in order to avoid any ambiguity:

  Sage

      sage: h = CM(x+u); h.display()
      M → ℝ

  [Python]

      >>> from sage.all import *
      >>> h = CM(x+u); h.display()
      M → ℝ

  Element

    alias of `ScalarField`

  one()

    Return the unit element of the algebra.

    This is nothing but the constant scalar field \(1\) on the manifold, where \(1\) is the unit element of the base field.

    EXAMPLES:

    Sage

        sage: M = Manifold(2, 'M', structure='topological')
        sage: X.<x,y> = M.chart()
        sage: CM = M.scalar_field_algebra()
        sage: h = CM.one(); h
        Scalar field 1 on the 2-dimensional topological manifold M
        sage: h.display()
        1: M → ℝ
           (x, y) ↦ 1

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(2), 'M', structure='topological')
        >>> X = M.chart(names=('x', 'y',)); (x, y,) = X._first_ngens(2)
        >>> CM = M.scalar_field_algebra()
        >>> h = CM.one(); h
        Scalar field 1 on the 2-dimensional topological manifold M
        >>> h.display()
        1: M → ℝ
           (x, y) ↦ 1

    The result is cached:

    Sage

        sage: CM.one() is h
        True

    [Python]

        >>> from sage.all import *
        >>> CM.one() is h
        True

  zero()

    Return the zero element of the algebra.

    This is nothing but the constant scalar field \(0\) on the manifold, where \(0\) is the zero element of the base field.

    EXAMPLES:

    Sage

        sage: M = Manifold(2, 'M', structure='topological')
        sage: X.<x,y> = M.chart()
        sage: CM = M.scalar_field_algebra()
        sage: z = CM.zero(); z
        Scalar field zero on the 2-dimensional topological manifold M
        sage: z.display()
        zero: M → ℝ
           (x, y) ↦ 0

    Python

        >>> from sage.all import *
        >>> M = Manifold(Integer(2), 'M', structure='topological')
        >>> X = M.chart(names=('x', 'y',)); (x, y,) = X._first_ngens(2)
        >>> CM = M.scalar_field_algebra()
        >>> z = CM.zero(); z
        Scalar field zero on the 2-dimensional topological manifold M
        >>> z.display()
        zero: M → ℝ
           (x, y) ↦ 0

    The result is cached:

    Sage

        sage: CM.zero() is z
        True

    [Python]

        >>> from sage.all import *
        >>> CM.zero() is z
        True