Mixed Differential Forms¶
Let \(M\) and \(N\) be differentiable manifolds and \(\varphi : M \longrightarrow N\)
a differentiable map. A mixed differential form along \(\varphi\) is an element
of the graded algebra represented by
MixedFormAlgebra.
Its homogeneous components consist of differential forms along \(\varphi\). Mixed
forms are useful to represent characteristic classes and perform computations
of such.
AUTHORS:
Michael Jung (2019) : initial version
- class sage.manifolds.differentiable.mixed_form.MixedForm(parent, name=None, latex_name=None)¶
Bases:
sage.structure.element.AlgebraElement,sage.structure.element.ModuleElementWithMutabilityAn instance of this class is a mixed form along some differentiable map \(\varphi: M \to N\) between two differentiable manifolds \(M\) and \(N\). More precisely, a mixed form \(a\) along \(\varphi: M \to N\) can be considered as a differentiable map
\[a: M \longrightarrow \bigoplus^n_{k=0} T^{(0,k)}N,\]where \(T^{(0,k)}\) denotes the tensor bundle of type \((0,k)\), \(\bigoplus\) the Whitney sum and \(n\) the dimension of \(N\), such that
\[\forall x\in M, \quad a(x) \in \bigoplus^n_{k=0} \Lambda^k\left( T_{\varphi(x)}^* N \right),\]where \(\Lambda^k(T^*_{\varphi(x)} N)\) is the \(k\)-th exterior power of the dual of the tangent space \(T_{\varphi(x)} N\). Thus, a mixed differential form \(a\) consists of homogeneous components \(a_i\), \(i=0,1, \dots, n\), where the \(i\)-th homogeneous component represents a differential form of degree \(i\).
The standard case of a mixed form on \(M\) corresponds to \(M=N\) with \(\varphi = \mathrm{Id}_M\).
INPUT:
parent– graded algebra of mixed forms represented byMixedFormAlgebrawhere the mixed formselfshall belong tocomp– (default:None) homogeneous components of the mixed form as a list; if none is provided, the components are set to innocent unnamed differential formsname– (default:None) name given to the mixed formlatex_name– (default:None) LaTeX symbol to denote the mixed form; if none is provided, the LaTeX symbol is set toname
EXAMPLES:
Initialize a mixed form on a 2-dimensional parallelizable differentiable manifold:
sage: M = Manifold(2, 'M') sage: c_xy.<x,y> = M.chart() sage: e_xy = c_xy.frame() sage: A = M.mixed_form(name='A'); A Mixed differential form A on the 2-dimensional differentiable manifold M sage: A.parent() Graded algebra Omega^*(M) of mixed differential forms on the 2-dimensional differentiable manifold M
The default way to specify the \(i\)-th homogeneous component of a mixed form is by accessing it via
A[i]or usingset_comp():sage: A = M.mixed_form(name='A') sage: A[0].set_expr(x) # scalar field sage: A.set_comp(1)[0] = y*x sage: A.set_comp(2)[0,1] = y^2*x sage: A.display() # display names A = A_0 + A_1 + A_2 sage: A.display_expansion() # display expansion in basis A = x + x*y dx + x*y^2 dx∧dy
Another way to define the homogeneous components is using predefined differential forms:
sage: f = M.scalar_field(x, name='f'); f Scalar field f on the 2-dimensional differentiable manifold M sage: omega = M.diff_form(1, name='omega'); omega 1-form omega on the 2-dimensional differentiable manifold M sage: omega[e_xy,0] = y*x; omega.display() omega = x*y dx sage: eta = M.diff_form(2, name='eta'); eta 2-form eta on the 2-dimensional differentiable manifold M sage: eta[e_xy,0,1] = y^2*x; eta.display() eta = x*y^2 dx∧dy
The components of a mixed form
Bcan then be set as follows:sage: B = M.mixed_form(name='B') sage: B[:] = [f, omega, eta]; B.display() # display names B = f + omega + eta sage: B.display_expansion() # display in coordinates B = x + x*y dx + x*y^2 dx∧dy sage: B[0] Scalar field f on the 2-dimensional differentiable manifold M sage: B[1] 1-form omega on the 2-dimensional differentiable manifold M sage: B[2] 2-form eta on the 2-dimensional differentiable manifold M
As we can see, the names are applied. However note that the differential forms are different instances:
sage: f is B[0] False
Alternatively, the components can be determined from scratch:
sage: B = M.mixed_form([f, omega, eta], name='B') sage: B.display() B = f + omega + eta
Mixed forms are elements of an algebra so they can be added, and multiplied via the wedge product:
sage: C = x*A; C Mixed differential form x∧A on the 2-dimensional differentiable manifold M sage: C.display_expansion() x∧A = x^2 + x^2*y dx + x^2*y^2 dx∧dy sage: D = A+C; D Mixed differential form A+x∧A on the 2-dimensional differentiable manifold M sage: D.display_expansion() A+x∧A = x^2 + x + (x^2 + x)*y dx + (x^2 + x)*y^2 dx∧dy sage: E = A*C; E Mixed differential form A∧(x∧A) on the 2-dimensional differentiable manifold M sage: E.display_expansion() A∧(x∧A) = x^3 + 2*x^3*y dx + 2*x^3*y^2 dx∧dy
Coercions are fully implemented:
sage: F = omega*A sage: F.display_expansion() omega∧A = x^2*y dx sage: G = omega+A sage: G.display_expansion() omega+A = x + 2*x*y dx + x*y^2 dx∧dy
Moreover, it is possible to compute the exterior derivative of a mixed form:
sage: dA = A.exterior_derivative(); dA.display() dA = zero + dA_0 + dA_1 sage: dA.display_expansion() dA = dx - x dx∧dy
Initialize a mixed form on a 2-dimensional non-parallelizable differentiable manifold:
sage: M = Manifold(2, 'M') sage: U = M.open_subset('U') ; V = M.open_subset('V') sage: M.declare_union(U,V) # M is the union of U and V sage: c_xy.<x,y> = U.chart() ; c_uv.<u,v> = V.chart() sage: transf = c_xy.transition_map(c_uv, (x+y, x-y), ....: intersection_name='W', restrictions1= x>0, ....: restrictions2= u+v>0) sage: inv = transf.inverse() sage: W = U.intersection(V) sage: e_xy = c_xy.frame(); e_uv = c_uv.frame() # define frames sage: A = M.mixed_form(name='A') sage: A[0].set_expr(x, c_xy) sage: A[0].display() A_0: M → ℝ on U: (x, y) ↦ x on W: (u, v) ↦ 1/2*u + 1/2*v sage: A[1][0] = y*x; A[1].display(e_xy) A_1 = x*y dx sage: A[2][e_uv,0,1] = u*v^2; A[2].display(e_uv) A_2 = u*v^2 du∧dv sage: A.add_comp_by_continuation(e_uv, W, c_uv) sage: A.display_expansion(e_uv) A = 1/2*u + 1/2*v + (1/8*u^2 - 1/8*v^2) du + (1/8*u^2 - 1/8*v^2) dv + u*v^2 du∧dv sage: A.add_comp_by_continuation(e_xy, W, c_xy) sage: A.display_expansion(e_xy) A = x + x*y dx + (-2*x^3 + 2*x^2*y + 2*x*y^2 - 2*y^3) dx∧dy
Since zero and one are special elements, their components cannot be changed:
sage: z = M.mixed_form_algebra().zero() sage: z[0] = 1 Traceback (most recent call last): ... ValueError: the components of an immutable element cannot be changed sage: one = M.mixed_form_algebra().one() sage: one[0] = 0 Traceback (most recent call last): ... ValueError: the components of an immutable element cannot be changed
- add_comp_by_continuation(frame, subdomain, chart=None)¶
Set components with respect to a vector frame by continuation of the coordinate expression of the components in a subframe.
The continuation is performed by demanding that the components have the same coordinate expression as those on the restriction of the frame to a given subdomain.
INPUT:
frame– vector frame \(e\) in which the components are to be setsubdomain– open subset of \(e\)’s domain in which the components are known or can be evaluated from other componentschart– (default:None) coordinate chart on \(e\)’s domain in which the extension of the expression of the components is to be performed; ifNone, the default’s chart of \(e\)’s domain is assumed
EXAMPLES:
Mixed form defined by differential forms with components on different parts of the 2-sphere:
sage: M = Manifold(2, 'M') # 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: W = U.intersection(V) sage: e_xy = c_xy.frame(); e_uv = c_uv.frame() sage: F = M.mixed_form(name='F') # No predefined components, here sage: F[0] = M.scalar_field(x, name='f') sage: F[1] = M.diff_form(1, {e_xy: [x,0]}, name='omega') sage: F[2].set_name(name='eta') sage: F[2][e_uv,0,1] = u*v sage: F.add_comp_by_continuation(e_uv, W, c_uv) sage: F.add_comp_by_continuation(e_xy, W, c_xy) # Now, F is fully defined sage: F.display_expansion(e_xy) F = x + x dx - x*y/(x^8 + 4*x^6*y^2 + 6*x^4*y^4 + 4*x^2*y^6 + y^8) dx∧dy sage: F.display_expansion(e_uv) F = u/(u^2 + v^2) - (u^3 - u*v^2)/(u^6 + 3*u^4*v^2 + 3*u^2*v^4 + v^6) du - 2*u^2*v/(u^6 + 3*u^4*v^2 + 3*u^2*v^4 + v^6) dv + u*v du∧dv
- copy(name=None, latex_name=None)¶
Return an exact copy of
self.Note
The name and names of the components are not copied.
INPUT:
name– (default:None) name given to the copylatex_name– (default:None) LaTeX symbol to denote the copy; if none is provided, the LaTeX symbol is set toname
EXAMPLES:
Initialize a 2-dimensional manifold and differential forms:
sage: M = Manifold(2, 'M') sage: U = M.open_subset('U') ; V = M.open_subset('V') sage: M.declare_union(U,V) # M is the union of U and V sage: c_xy.<x,y> = U.chart() ; c_uv.<u,v> = V.chart() sage: xy_to_uv = c_xy.transition_map(c_uv, (x+y, x-y), ....: intersection_name='W', restrictions1= x>0, ....: restrictions2= u+v>0) sage: uv_to_xy = xy_to_uv.inverse() sage: W = U.intersection(V) sage: e_xy = c_xy.frame(); e_uv = c_uv.frame() sage: f = M.scalar_field(x, name='f', chart=c_xy) sage: f.add_expr_by_continuation(c_uv, W) sage: f.display() f: M → ℝ on U: (x, y) ↦ x on V: (u, v) ↦ 1/2*u + 1/2*v sage: omega = M.diff_form(1, name='omega') sage: omega[e_xy,0] = x sage: omega.add_comp_by_continuation(e_uv, W, c_uv) sage: omega.display() omega = x dx sage: A = M.mixed_form([f, omega, 0], name='A'); A.display() A = f + omega + zero sage: A.display_expansion(e_uv) A = 1/2*u + 1/2*v + (1/4*u + 1/4*v) du + (1/4*u + 1/4*v) dv
An exact copy is made. The copy is an entirely new instance and has a different name, but has the very same values:
sage: B = A.copy(); B.display() (unnamed scalar field) + (unnamed 1-form) + (unnamed 2-form) sage: B.display_expansion(e_uv) 1/2*u + 1/2*v + (1/4*u + 1/4*v) du + (1/4*u + 1/4*v) dv sage: A == B True sage: A is B False
- derivative()¶
Compute the exterior derivative of
self.More precisely, the exterior derivative on \(\Omega^k(M,\varphi)\) is a linear map
\[\mathrm{d}_{k} : \Omega^k(M,\varphi) \to \Omega^{k+1}(M,\varphi),\]where \(\Omega^k(M,\varphi)\) denotes the space of differential forms of degree \(k\) along \(\varphi\) (see
exterior_derivative()for further information). By linear extension, this induces a map on \(\Omega^*(M,\varphi)\):\[\mathrm{d}: \Omega^*(M,\varphi) \to \Omega^*(M,\varphi).\]OUTPUT:
a
MixedFormrepresenting the exterior derivative of the mixed form
EXAMPLES:
Exterior derivative of a mixed form on a 3-dimensional manifold:
sage: M = Manifold(3, 'M', start_index=1) sage: c_xyz.<x,y,z> = M.chart() sage: f = M.scalar_field(z^2, name='f') sage: f.disp() f: M → ℝ (x, y, z) ↦ z^2 sage: a = M.diff_form(2, 'a') sage: a[1,2], a[1,3], a[2,3] = z+y^2, z+x, x^2 sage: a.disp() a = (y^2 + z) dx∧dy + (x + z) dx∧dz + x^2 dy∧dz sage: F = M.mixed_form([f, 0, a, 0], name='F'); F.display() F = f + zero + a + zero sage: dF = F.exterior_derivative() sage: dF.display() dF = zero + df + dzero + da sage: dF = F.exterior_derivative() sage: dF.display_expansion() dF = 2*z dz + (2*x + 1) dx∧dy∧dz
Due to long calculation times, the result is cached:
sage: F.exterior_derivative() is dF True
- disp()¶
Display the homogeneous components of the mixed form.
The output is either text-formatted (console mode) or LaTeX-formatted (notebook mode).
EXAMPLES:
sage: M = Manifold(2, 'M') sage: f = M.scalar_field(name='f') sage: omega = M.diff_form(1, name='omega') sage: eta = M.diff_form(2, name='eta') sage: F = M.mixed_form([f, omega, eta], name='F'); F Mixed differential form F on the 2-dimensional differentiable manifold M sage: F.display() # display names of homogeneous components F = f + omega + eta
- disp_exp(frame=None, chart=None, from_chart=None)¶
Display the expansion in a particular basis and chart of mixed forms.
The output is either text-formatted (console mode) or LaTeX-formatted (notebook mode).
INPUT:
frame– (default:None) vector frame with respect to which the mixed form is expanded; ifNone, only the names of the components are displayedchart– (default:None) chart with respect to which the components of the mixed form in the selected frame are expressed; ifNone, the default chart of the vector frame domain is assumed
EXAMPLES:
Display the expansion of a mixed form on a 2-dimensional non-parallelizable differentiable manifold:
sage: M = Manifold(2, 'M') sage: U = M.open_subset('U') ; V = M.open_subset('V') sage: M.declare_union(U,V) # M is the union of U and V sage: c_xy.<x,y> = U.chart() ; c_uv.<u,v> = V.chart() sage: transf = c_xy.transition_map(c_uv, (x-y, x+y), ....: intersection_name='W', restrictions1= x>0, ....: restrictions2= u+v>0) sage: inv = transf.inverse() sage: W = U.intersection(V) sage: e_xy = c_xy.frame(); e_uv = c_uv.frame() # define frames sage: omega = M.diff_form(1, name='omega') sage: omega[e_xy,0] = x; omega.display(e_xy) omega = x dx sage: omega.add_comp_by_continuation(e_uv, W, c_uv) # continuation onto M sage: eta = M.diff_form(2, name='eta') sage: eta[e_uv,0,1] = u*v; eta.display(e_uv) eta = u*v du∧dv sage: eta.add_comp_by_continuation(e_xy, W, c_xy) # continuation onto M sage: F = M.mixed_form([0, omega, eta], name='F'); F Mixed differential form F on the 2-dimensional differentiable manifold M sage: F.display() # display names of homogeneous components F = zero + omega + eta sage: F.display_expansion(e_uv) F = (1/4*u + 1/4*v) du + (1/4*u + 1/4*v) dv + u*v du∧dv sage: F.display_expansion(e_xy) F = x dx + (2*x^2 - 2*y^2) dx∧dy
- display()¶
Display the homogeneous components of the mixed form.
The output is either text-formatted (console mode) or LaTeX-formatted (notebook mode).
EXAMPLES:
sage: M = Manifold(2, 'M') sage: f = M.scalar_field(name='f') sage: omega = M.diff_form(1, name='omega') sage: eta = M.diff_form(2, name='eta') sage: F = M.mixed_form([f, omega, eta], name='F'); F Mixed differential form F on the 2-dimensional differentiable manifold M sage: F.display() # display names of homogeneous components F = f + omega + eta
- display_exp(frame=None, chart=None, from_chart=None)¶
Display the expansion in a particular basis and chart of mixed forms.
The output is either text-formatted (console mode) or LaTeX-formatted (notebook mode).
INPUT:
frame– (default:None) vector frame with respect to which the mixed form is expanded; ifNone, only the names of the components are displayedchart– (default:None) chart with respect to which the components of the mixed form in the selected frame are expressed; ifNone, the default chart of the vector frame domain is assumed
EXAMPLES:
Display the expansion of a mixed form on a 2-dimensional non-parallelizable differentiable manifold:
sage: M = Manifold(2, 'M') sage: U = M.open_subset('U') ; V = M.open_subset('V') sage: M.declare_union(U,V) # M is the union of U and V sage: c_xy.<x,y> = U.chart() ; c_uv.<u,v> = V.chart() sage: transf = c_xy.transition_map(c_uv, (x-y, x+y), ....: intersection_name='W', restrictions1= x>0, ....: restrictions2= u+v>0) sage: inv = transf.inverse() sage: W = U.intersection(V) sage: e_xy = c_xy.frame(); e_uv = c_uv.frame() # define frames sage: omega = M.diff_form(1, name='omega') sage: omega[e_xy,0] = x; omega.display(e_xy) omega = x dx sage: omega.add_comp_by_continuation(e_uv, W, c_uv) # continuation onto M sage: eta = M.diff_form(2, name='eta') sage: eta[e_uv,0,1] = u*v; eta.display(e_uv) eta = u*v du∧dv sage: eta.add_comp_by_continuation(e_xy, W, c_xy) # continuation onto M sage: F = M.mixed_form([0, omega, eta], name='F'); F Mixed differential form F on the 2-dimensional differentiable manifold M sage: F.display() # display names of homogeneous components F = zero + omega + eta sage: F.display_expansion(e_uv) F = (1/4*u + 1/4*v) du + (1/4*u + 1/4*v) dv + u*v du∧dv sage: F.display_expansion(e_xy) F = x dx + (2*x^2 - 2*y^2) dx∧dy
- display_expansion(frame=None, chart=None, from_chart=None)¶
Display the expansion in a particular basis and chart of mixed forms.
The output is either text-formatted (console mode) or LaTeX-formatted (notebook mode).
INPUT:
frame– (default:None) vector frame with respect to which the mixed form is expanded; ifNone, only the names of the components are displayedchart– (default:None) chart with respect to which the components of the mixed form in the selected frame are expressed; ifNone, the default chart of the vector frame domain is assumed
EXAMPLES:
Display the expansion of a mixed form on a 2-dimensional non-parallelizable differentiable manifold:
sage: M = Manifold(2, 'M') sage: U = M.open_subset('U') ; V = M.open_subset('V') sage: M.declare_union(U,V) # M is the union of U and V sage: c_xy.<x,y> = U.chart() ; c_uv.<u,v> = V.chart() sage: transf = c_xy.transition_map(c_uv, (x-y, x+y), ....: intersection_name='W', restrictions1= x>0, ....: restrictions2= u+v>0) sage: inv = transf.inverse() sage: W = U.intersection(V) sage: e_xy = c_xy.frame(); e_uv = c_uv.frame() # define frames sage: omega = M.diff_form(1, name='omega') sage: omega[e_xy,0] = x; omega.display(e_xy) omega = x dx sage: omega.add_comp_by_continuation(e_uv, W, c_uv) # continuation onto M sage: eta = M.diff_form(2, name='eta') sage: eta[e_uv,0,1] = u*v; eta.display(e_uv) eta = u*v du∧dv sage: eta.add_comp_by_continuation(e_xy, W, c_xy) # continuation onto M sage: F = M.mixed_form([0, omega, eta], name='F'); F Mixed differential form F on the 2-dimensional differentiable manifold M sage: F.display() # display names of homogeneous components F = zero + omega + eta sage: F.display_expansion(e_uv) F = (1/4*u + 1/4*v) du + (1/4*u + 1/4*v) dv + u*v du∧dv sage: F.display_expansion(e_xy) F = x dx + (2*x^2 - 2*y^2) dx∧dy
- exterior_derivative()¶
Compute the exterior derivative of
self.More precisely, the exterior derivative on \(\Omega^k(M,\varphi)\) is a linear map
\[\mathrm{d}_{k} : \Omega^k(M,\varphi) \to \Omega^{k+1}(M,\varphi),\]where \(\Omega^k(M,\varphi)\) denotes the space of differential forms of degree \(k\) along \(\varphi\) (see
exterior_derivative()for further information). By linear extension, this induces a map on \(\Omega^*(M,\varphi)\):\[\mathrm{d}: \Omega^*(M,\varphi) \to \Omega^*(M,\varphi).\]OUTPUT:
a
MixedFormrepresenting the exterior derivative of the mixed form
EXAMPLES:
Exterior derivative of a mixed form on a 3-dimensional manifold:
sage: M = Manifold(3, 'M', start_index=1) sage: c_xyz.<x,y,z> = M.chart() sage: f = M.scalar_field(z^2, name='f') sage: f.disp() f: M → ℝ (x, y, z) ↦ z^2 sage: a = M.diff_form(2, 'a') sage: a[1,2], a[1,3], a[2,3] = z+y^2, z+x, x^2 sage: a.disp() a = (y^2 + z) dx∧dy + (x + z) dx∧dz + x^2 dy∧dz sage: F = M.mixed_form([f, 0, a, 0], name='F'); F.display() F = f + zero + a + zero sage: dF = F.exterior_derivative() sage: dF.display() dF = zero + df + dzero + da sage: dF = F.exterior_derivative() sage: dF.display_expansion() dF = 2*z dz + (2*x + 1) dx∧dy∧dz
Due to long calculation times, the result is cached:
sage: F.exterior_derivative() is dF True
- irange(start=None)¶
Single index generator.
INPUT:
start– (default:None) initial value \(i_0\) of the index between 0 and \(n\), where \(n\) is the manifold’s dimension; if none is provided, the value 0 is assumed
OUTPUT:
an iterable index, starting from \(i_0\) and ending at \(n\), where \(n\) is the manifold’s dimension
EXAMPLES:
sage: M = Manifold(3, 'M') sage: a = M.mixed_form(name='a') sage: list(a.irange()) [0, 1, 2, 3] sage: list(a.irange(2)) [2, 3]
- restrict(subdomain, dest_map=None)¶
Return the restriction of
selfto some subdomain.INPUT:
subdomain–DifferentiableManifold; open subset \(U\) of the domain ofselfdest_map–DiffMap(default:None); destination map \(\Psi:\ U \rightarrow V\), where \(V\) is an open subset of the manifold \(N\) where the mixed form takes it values; ifNone, the restriction of \(\Phi\) to \(U\) is used, \(\Phi\) being the differentiable map \(S \rightarrow M\) associated with the mixed form
OUTPUT:
MixedFormrepresenting the restriction
EXAMPLES:
Initialize the 2-sphere:
sage: M = Manifold(2, 'M') # 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: W = U.intersection(V) sage: e_xy = c_xy.frame(); e_uv = c_uv.frame()
And predefine some forms:
sage: f = M.scalar_field(x^2, name='f', chart=c_xy) sage: f.add_expr_by_continuation(c_uv, W) sage: omega = M.diff_form(1, name='omega') sage: omega[e_xy,0] = y^2 sage: omega.add_comp_by_continuation(e_uv, W, c_uv) sage: eta = M.diff_form(2, name='eta') sage: eta[e_xy,0,1] = x^2*y^2 sage: eta.add_comp_by_continuation(e_uv, W, c_uv)
Now, a mixed form can be restricted to some subdomain:
sage: F = M.mixed_form([f, omega, eta], name='F') sage: FV = F.restrict(V); FV Mixed differential form F on the Open subset V of the 2-dimensional differentiable manifold M sage: FV[:] [Scalar field f on the Open subset V of the 2-dimensional differentiable manifold M, 1-form omega on the Open subset V of the 2-dimensional differentiable manifold M, 2-form eta on the Open subset V of the 2-dimensional differentiable manifold M] sage: FV.display_expansion(e_uv) F = u^2/(u^4 + 2*u^2*v^2 + v^4) - (u^2*v^2 - v^4)/(u^8 + 4*u^6*v^2 + 6*u^4*v^4 + 4*u^2*v^6 + v^8) du - 2*u*v^3/(u^8 + 4*u^6*v^2 + 6*u^4*v^4 + 4*u^2*v^6 + v^8) dv - u^2*v^2/(u^12 + 6*u^10*v^2 + 15*u^8*v^4 + 20*u^6*v^6 + 15*u^4*v^8 + 6*u^2*v^10 + v^12) du∧dv
- set_comp(i)¶
Return the \(i\)-th homogeneous component for assignment.
EXAMPLES:
sage: M = Manifold(2, 'M') sage: X.<x,y> = M.chart() sage: A = M.mixed_form(name='A') sage: A.set_comp(0).set_expr(x^2) # scalar field sage: A.set_comp(1)[:] = [-y, x] sage: A.set_comp(2)[0,1] = x-y sage: A.display() A = A_0 + A_1 + A_2 sage: A.display_expansion() A = x^2 - y dx + x dy + (x - y) dx∧dy
- set_immutable()¶
Set
selfand homogeneous components ofselfimmutable.EXAMPLES:
sage: M = Manifold(2, 'M') sage: X.<x,y> = M.chart() sage: f = M.scalar_field(x^2, name='f') sage: A = M.mixed_form([f, 0, 0], name='A') sage: A.set_immutable() sage: A.is_immutable() True sage: A[0].is_immutable() True sage: f.is_immutable() False
- set_name(name=None, latex_name=None, apply_to_comp=True)¶
Redefine the string and LaTeX representation of the object.
INPUT:
name– (default:None) name given to the mixed formlatex_name– (default:None) LaTeX symbol to denote the mixed form; if none is provided, the LaTeX symbol is set tonameapply_to_comp– (default:True) ifTrueall homogeneous components will be renamed accordingly; ifFalseonly the mixed form will be renamed
EXAMPLES:
Rename a mixed form:
sage: M = Manifold(4, 'M') sage: F = M.mixed_form(name='dummy', latex_name=r'\ugly'); F Mixed differential form dummy on the 4-dimensional differentiable manifold M sage: latex(F) \ugly sage: F.set_name(name='F', latex_name=r'\mathcal{F}'); F Mixed differential form F on the 4-dimensional differentiable manifold M sage: latex(F) \mathcal{F}
If not stated otherwise, all homogeneous components are renamed accordingly:
sage: F.display() F = F_0 + F_1 + F_2 + F_3 + F_4
Setting the argument
set_alltoFalseprevents the renaming in the homogeneous components:sage: F.set_name(name='eta', latex_name=r'\eta', apply_to_comp=False) sage: F.display() eta = F_0 + F_1 + F_2 + F_3 + F_4
To rename a homogeneous component individually, we simply access the homogeneous component and use its
set_name()method:sage: F[0].set_name(name='g'); F.display() eta = g + F_1 + F_2 + F_3 + F_4
- set_restriction(rst)¶
Set a (component-wise) restriction of
selfto some subdomain.INPUT:
rst–MixedFormof the same type asself, defined on a subdomain of the domain ofself
EXAMPLES:
Initialize the 2-sphere:
sage: M = Manifold(2, 'M') # 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: W = U.intersection(V) sage: e_xy = c_xy.frame(); e_uv = c_uv.frame()
And define some forms on the subset
U:sage: f = U.scalar_field(x, name='f', chart=c_xy) sage: omega = U.diff_form(1, name='omega') sage: omega[e_xy,0] = y sage: AU = U.mixed_form([f, omega, 0], name='A'); AU Mixed differential form A on the Open subset U of the 2-dimensional differentiable manifold M sage: AU.display_expansion(e_xy) A = x + y dx
A mixed form on
Mcan be specified by some mixed form on a subset:sage: A = M.mixed_form(name='A'); A Mixed differential form A on the 2-dimensional differentiable manifold M sage: A.set_restriction(AU) sage: A.display_expansion(e_xy) A = x + y dx sage: A.add_comp_by_continuation(e_uv, W, c_uv) sage: A.display_expansion(e_uv) A = u/(u^2 + v^2) - (u^2*v - v^3)/(u^6 + 3*u^4*v^2 + 3*u^2*v^4 + v^6) du - 2*u*v^2/(u^6 + 3*u^4*v^2 + 3*u^2*v^4 + v^6) dv sage: A.restrict(U) == AU True
- wedge(other)¶
Wedge product on the graded algebra of mixed forms.
More precisely, the wedge product is a bilinear map
\[\wedge: \Omega^k(M,\varphi) \times \Omega^l(M,\varphi) \to \Omega^{k+l}(M,\varphi),\]where \(\Omega^k(M,\varphi)\) denotes the space of differential forms of degree \(k\) along \(\varphi\). By bilinear extension, this induces a map
\[\wedge: \Omega^*(M,\varphi) \times \Omega^*(M,\varphi) \to \Omega^*(M,\varphi) ``\]and equips \(\Omega^*(M,\varphi)\) with a multiplication such that it becomes a graded algebra.
INPUT:
other– mixed form in the same algebra asself
OUTPUT:
the mixed form resulting from the wedge product of
selfwithother
EXAMPLES:
Initialize a mixed form on a 3-dimensional manifold:
sage: M = Manifold(3, 'M') sage: c_xyz.<x,y,z> = M.chart() sage: f = M.scalar_field(x, name='f') sage: f.display() f: M → ℝ (x, y, z) ↦ x sage: g = M.scalar_field(y, name='g') sage: g.display() g: M → ℝ (x, y, z) ↦ y sage: omega = M.diff_form(1, name='omega') sage: omega[0] = x sage: omega.display() omega = x dx sage: eta = M.diff_form(1, name='eta') sage: eta[1] = y sage: eta.display() eta = y dy sage: mu = M.diff_form(2, name='mu') sage: mu[0,2] = z sage: mu.display() mu = z dx∧dz sage: A = M.mixed_form([f, omega, mu, 0], name='A') sage: A.display_expansion() A = x + x dx + z dx∧dz sage: B = M.mixed_form([g, eta, mu, 0], name='B') sage: B.display_expansion() B = y + y dy + z dx∧dz
The wedge product of
AandByields:sage: C = A.wedge(B); C Mixed differential form A∧B on the 3-dimensional differentiable manifold M sage: C.display_expansion() A∧B = x*y + x*y dx + x*y dy + x*y dx∧dy + (x + y)*z dx∧dz - y*z dx∧dy∧dz sage: D = B.wedge(A); D # Don't even try, it's not commutative! Mixed differential form B∧A on the 3-dimensional differentiable manifold M sage: D.display_expansion() # I told you so! B∧A = x*y + x*y dx + x*y dy - x*y dx∧dy + (x + y)*z dx∧dz - y*z dx∧dy∧dz
Alternatively, the multiplication symbol can be used:
sage: A*B Mixed differential form A∧B on the 3-dimensional differentiable manifold M sage: A*B == C True
Yet, the multiplication includes coercions:
sage: E = x*A; E.display_expansion() x∧A = x^2 + x^2 dx + x*z dx∧dz sage: F = A*eta; F.display_expansion() A∧eta = x*y dy + x*y dx∧dy - y*z dx∧dy∧dz