# Symplectic structures#

The class SymplecticForm implements symplectic structures on differentiable manifolds over $$\RR$$. The derived class SymplecticFormParal is devoted to symplectic forms on a parallelizable manifold.

AUTHORS:

• Tobias Diez (2021) : initial version

REFERENCES:

class sage.manifolds.differentiable.symplectic_form.SymplecticForm(manifold: , name: str | None = None, latex_name: str | None = None)#

Bases: DiffForm

A symplectic form on a differentiable manifold.

An instance of this class is a closed nondegenerate differential $$2$$-form $$\omega$$ on a differentiable manifold $$M$$ over $$\RR$$.

In particular, at each point $$m \in M$$, $$\omega_m$$ is a bilinear map of the type:

$\omega_m:\ T_m M \times T_m M \to \RR,$

where $$T_m M$$ stands for the tangent space to the manifold $$M$$ at the point $$m$$, such that $$\omega_m$$ is skew-symmetric: $$\forall u,v \in T_m M, \ \omega_m(v,u) = - \omega_m(u,v)$$ and nondegenerate: $$(\forall v \in T_m M,\ \ \omega_m(u,v) = 0) \Longrightarrow u=0$$.

Note

If $$M$$ is parallelizable, the class SymplecticFormParal should be used instead.

INPUT:

• manifold – module $$\mathfrak{X}(M)$$ of vector fields on the manifold $$M$$, or the manifold $$M$$ itself

• name – (default: omega) name given to the symplectic form

• latex_name – (default: None) LaTeX symbol to denote the symplectic form; if None, it is formed from name

EXAMPLES:

A symplectic form on the 2-sphere:

sage: M.<x,y> = manifolds.Sphere(2, coordinates='stereographic')
sage: stereoN = M.stereographic_coordinates(pole='north')
sage: stereoS = M.stereographic_coordinates(pole='south')
sage: omega = M.symplectic_form(name='omega', latex_name=r'\omega')
sage: omega
Symplectic form omega on the 2-sphere S^2 of radius 1 smoothly embedded
in the Euclidean space E^3


omega is initialized by providing its single nonvanishing component w.r.t. the vector frame associated to stereoN, which is the default frame on M:

sage: omega[1, 2] = 1/(1 + x^2 + y^2)^2


The components w.r.t. the vector frame associated to stereoS are obtained thanks to the method add_comp_by_continuation():

sage: omega.add_comp_by_continuation(stereoS.frame(),
....:                  stereoS.domain().intersection(stereoN.domain()))
sage: omega.display()
omega = (x^2 + y^2 + 1)^(-2) dx∧dy
sage: omega.display(stereoS)
omega = -1/(xp^4 + yp^4 + 2*(xp^2 + 1)*yp^2 + 2*xp^2 + 1) dxp∧dyp


omega is an exact 2-form (this is trivial here, since M is 2-dimensional):

sage: diff(omega).display()
domega = 0

flat(vector_field)#

Return the image of the given differential form under the map $$\omega^\flat: T M \to T^*M$$ defined by

$<\omega^\flat(X), Y> = \omega_m (X, Y)$

for all $$X, Y \in T_m M$$.

In indices, $$X_i = \omega_{ji} X^j$$.

INPUT:

• vector_field – the vector field to calculate its flat of

EXAMPLES:

sage: M = manifolds.StandardSymplecticSpace(2)
sage: omega = M.symplectic_form()
sage: X = M.vector_field_module().an_element()
sage: X.set_name('X')
sage: X.display()
X = 2 e_q + 2 e_p
sage: omega.flat(X).display()
X_flat = 2 dq - 2 dp

hamiltonian_vector_field(function)#

The Hamiltonian vector field $$X_f$$ generated by a function $$f: M \to \RR$$.

The Hamiltonian vector field is defined by

$X_f \lrcorner \omega + df = 0.$

INPUT:

• function – the function generating the Hamiltonian vector field

EXAMPLES:

sage: M = manifolds.StandardSymplecticSpace(2)
sage: omega = M.symplectic_form()
sage: f = M.scalar_field({ chart: function('f')(*chart[:]) for chart in M.atlas() }, name='f')
sage: f.display()
f: R2 → ℝ
(q, p) ↦ f(q, p)
sage: Xf = omega.hamiltonian_vector_field(f)
sage: Xf.display()
Xf = d(f)/dp e_q - d(f)/dq e_p

hodge_star(pform)#

Compute the Hodge dual of a differential form with respect to the symplectic form.

See hodge_dual() for the definition and more details.

INPUT:

OUTPUT:

• the $$(n-p)$$-form $$*A$$

EXAMPLES:

Hodge dual of any form on the symplectic vector space $$R^2$$:

sage: M = manifolds.StandardSymplecticSpace(2)
sage: omega = M.symplectic_form()
sage: a = M.one_form(1, 0, name='a')
sage: omega.hodge_star(a).display()
*a = dq
sage: b = M.one_form(0, 1, name='b')
sage: omega.hodge_star(b).display()
*b = dp
sage: f = M.scalar_field(1, name='f')
sage: omega.hodge_star(f).display()
*f = -dq∧dp
sage: omega.hodge_star(omega).display()
*omega: R2 → ℝ
(q, p) ↦ 1

on_forms(first, second)#

Return the contraction of the two forms with respect to the symplectic form.

The symplectic form $$\omega$$ gives rise to a bilinear form, also denoted by $$\omega$$ on the space of $$1$$-forms by

$\omega(\alpha, \beta) = \omega(\alpha^\sharp, \beta^\sharp),$

where $$\alpha^\sharp$$ is the dual of $$\alpha$$ with respect to $$\omega$$, see up(). This bilinear form induces a bilinear form on the space of all forms determined by its value on decomposable elements as:

$\omega(\alpha_1 \wedge \ldots \wedge\alpha_p, \beta_1 \wedge \ldots \wedge\beta_p) = det(\omega(\alpha_i, \beta_j)).$

INPUT:

• first – a $$p$$-form $$\alpha$$

• second – a $$p$$-form $$\beta$$

OUTPUT:

• the scalar field $$\omega(\alpha, \beta)$$

EXAMPLES:

sage: M = manifolds.StandardSymplecticSpace(2) sage: omega = M.symplectic_form() sage: a = M.one_form(1, 0, name=’a’) sage: b = M.one_form(0, 1, name=’b’) sage: omega.on_forms(a, b).display() R2 → ℝ (q, p) ↦ -1

poisson(expansion_symbol=None, order=1)#

Return the Poisson tensor associated with the symplectic form.

INPUT:

• expansion_symbol – (default: None) symbolic variable; if specified, the inverse will be expanded in power series with respect to this variable (around its zero value)

• order – integer (default: 1); the order of the expansion if expansion_symbol is not None; the order is defined as the degree of the polynomial representing the truncated power series in expansion_symbol; currently only first order inverse is supported

If expansion_symbol is set, then the zeroth order symplectic form must be invertible. Moreover, subsequent calls to this method will return a cached value, even when called with the default value (to enable computation of derived quantities). To reset, use _del_derived().

OUTPUT:

EXAMPLES:

Poisson tensor of $$2$$-dimensional symplectic vector space:

sage: M = manifolds.StandardSymplecticSpace(2)
sage: omega = M.symplectic_form()
sage: poisson = omega.poisson(); poisson
2-vector field poisson_omega on the Standard symplectic space R2
sage: poisson.display()
poisson_omega = -e_q∧e_p

poisson_bracket(f, g)#

Return the Poisson bracket

$\{f, g\} = \omega(X_f, X_g)$

of the given functions.

INPUT:

• f – function inserted in the first slot

• g – function inserted in the second slot

EXAMPLES:

sage: M.<q, p> = EuclideanSpace(2)
sage: poisson = M.poisson_tensor('varpi')
sage: poisson.set_comp()[1,2] = -1
sage: f = M.scalar_field({ chart: function('f')(*chart[:]) for chart in M.atlas() }, name='f')
sage: g = M.scalar_field({ chart: function('g')(*chart[:]) for chart in M.atlas() }, name='g')
sage: poisson.poisson_bracket(f, g).display()
poisson(f, g): E^2 → ℝ
(q, p) ↦ d(f)/dp*d(g)/dq - d(f)/dq*d(g)/dp

restrict(subdomain, dest_map=None)#

Return the restriction of the symplectic form to some subdomain.

If the restriction has not been defined yet, it is constructed here.

INPUT:

• subdomain – open subset $$U$$ of the symplectic form’s domain

• dest_map – (default: None) smooth destination map $$\Phi:\ U \to V$$, where $$V$$ is a subdomain of the symplectic form’s domain If None, the restriction of the initial vector field module is used.

OUTPUT:

• the restricted symplectic form.

EXAMPLES:

sage: M = Manifold(6, 'M')
sage: omega = M.symplectic_form()
sage: U = M.open_subset('U')
sage: omega.restrict(U)
2-form omega on the Open subset U of the 6-dimensional differentiable manifold M

sharp(form)#

Return the image of the given differential form under the map $$\omega^\sharp: T^* M \to TM$$ defined by

$\omega (\omega^\sharp(\alpha), X) = \alpha(X)$

for all $$X \in T_m M$$ and $$\alpha \in T^*_m M$$. The sharp map is inverse to the flat map.

In indices, $$\alpha^i = \varpi^{ij} \alpha_j$$, where $$\varpi$$ is the Poisson tensor associated with the symplectic form.

INPUT:

• form – the differential form to calculate its sharp of

EXAMPLES:

sage: M = manifolds.StandardSymplecticSpace(2)
sage: omega = M.symplectic_form()
sage: X = M.vector_field_module().an_element()
sage: alpha = omega.flat(X)
sage: alpha.set_name('alpha')
sage: alpha.display()
alpha = 2 dq - 2 dp
sage: omega.sharp(alpha).display()
alpha_sharp = 2 e_q + 2 e_p

volume_form(contra=0)#

Liouville volume form $$\frac{1}{n!}\omega^n$$ associated with the symplectic form $$\omega$$, where $$2n$$ is the dimension of the manifold.

INPUT:

• contra – (default: 0) number of contravariant indices of the returned tensor

OUTPUT:

• if contra = 0: volume form associated with the symplectic form

• if contra = k, with $$1\leq k \leq n$$, the tensor field of type (k,n-k) formed from $$\epsilon$$ by raising the first k indices with the symplectic form (see method up())

EXAMPLES:

Volume form on $$\RR^4$$:

sage: M = manifolds.StandardSymplecticSpace(4)
sage: omega = M.symplectic_form()
sage: vol = omega.volume_form() ; vol
4-form mu_omega on the Standard symplectic space R4
sage: vol.display()
mu_omega = dq1∧dp1∧dq2∧dp2

static wrap(form, name=None, latex_name=None)#

Define the symplectic form from a differential form.

INPUT:

• form – differential $$2$$-form

EXAMPLES:

Volume form on the sphere as a symplectic form:

sage: from sage.manifolds.differentiable.symplectic_form import SymplecticForm
sage: M = manifolds.Sphere(2, coordinates='stereographic')
sage: vol_form = M.induced_metric().volume_form()                   # long time
sage: omega = SymplecticForm.wrap(vol_form, 'omega', r'\omega')     # long time
sage: omega.display()                                               # long time
omega = -4/(y1^4 + y2^4 + 2*(y1^2 + 1)*y2^2 + 2*y1^2 + 1) dy1∧dy2

class sage.manifolds.differentiable.symplectic_form.SymplecticFormParal(manifold: , name: str | None, latex_name: str | None = None)#

A symplectic form on a parallelizable manifold.

Note

If $$M$$ is not parallelizable, the class SymplecticForm should be used instead.

INPUT:

• manifold – module $$\mathfrak{X}(M)$$ of vector fields on the manifold $$M$$, or the manifold $$M$$ itself

• name – (default: omega) name given to the symplectic form

• latex_name – (default: None) LaTeX symbol to denote the symplectic form; if None, it is formed from name

EXAMPLES:

Standard symplectic form on $$\RR^2$$:

sage: M.<q, p> = EuclideanSpace(name="R2", latex_name=r"\mathbb{R}^2")
sage: omega = M.symplectic_form(name='omega', latex_name=r'\omega')
sage: omega
Symplectic form omega on the Euclidean plane R2
sage: omega.set_comp()[1,2] = -1
sage: omega.display()
omega = -dq∧dp

poisson(expansion_symbol=None, order=1)#

Return the Poisson tensor associated with the symplectic form.

INPUT:

• expansion_symbol – (default: None) symbolic variable; if specified, the inverse will be expanded in power series with respect to this variable (around its zero value)

• order – integer (default: 1); the order of the expansion if expansion_symbol is not None; the order is defined as the degree of the polynomial representing the truncated power series in expansion_symbol; currently only first order inverse is supported

If expansion_symbol is set, then the zeroth order symplectic form must be invertible. Moreover, subsequent calls to this method will return a cached value, even when called with the default value (to enable computation of derived quantities). To reset, use _del_derived().

OUTPUT:

EXAMPLES:

Poisson tensor of $$2$$-dimensional symplectic vector space:

sage: from sage.manifolds.differentiable.symplectic_form import SymplecticFormParal
sage: M.<q, p> = EuclideanSpace(2, "R2", r"\mathbb{R}^2", symbols=r"q:q p:p")
sage: omega = SymplecticFormParal(M, 'omega', r'\omega')
sage: omega[1,2] = -1
sage: poisson = omega.poisson(); poisson
2-vector field poisson_omega on the Euclidean plane R2
sage: poisson.display()
poisson_omega = -e_q∧e_p

restrict(subdomain, dest_map=None)#

Return the restriction of the symplectic form to some subdomain.

If the restriction has not been defined yet, it is constructed here.

INPUT:

• subdomain – open subset $$U$$ of the symplectic form’s domain

• dest_map – (default: None) smooth destination map $$\Phi:\ U \rightarrow V$$, where $$V$$ is a subdomain of the symplectic form’s domain If None, the restriction of the initial vector field module is used.

OUTPUT:

• the restricted symplectic form.

EXAMPLES:

Restriction of the standard symplectic form on $$\RR^2$$ to the upper half plane:

sage: from sage.manifolds.differentiable.symplectic_form import SymplecticFormParal
sage: M = EuclideanSpace(2, "R2", r"\mathbb{R}^2", symbols=r"q:q p:p")
sage: X.<q, p> = M.chart()
sage: omega = SymplecticFormParal(M, 'omega', r'\omega')
sage: omega[1,2] = -1
sage: U = M.open_subset('U', coord_def={X: q>0})
sage: omegaU = omega.restrict(U); omegaU
Symplectic form omega on the Open subset U of the Euclidean plane R2
sage: omegaU.display()
omega = -dq∧dp