Liouville Integrability¶

da PowerShell -- jupyter nbconvert --to html notebook.ipynb

In [2]:
import sympy as sp
from itertools import combinations

# -------------------------------------------------
# Poisson bracket
# -------------------------------------------------
def poisson_bracket(f, g, q, p):
    return sum(
        sp.diff(f, qi) * sp.diff(g, pi) - sp.diff(f, pi) * sp.diff(g, qi)
        for qi, pi in zip(q, p)
    )

# -------------------------------------------------
# Conservazione rispetto all'Hamiltoniana
# -------------------------------------------------
def is_conserved_hamiltonian(F, H, q, p):
    pb = poisson_bracket(F, H, q, p)
    return sp.simplify(pb) == 0

# -------------------------------------------------
# Involuzione
# -------------------------------------------------
def are_in_involution(F_list, q, p):
    for Fi, Fj in combinations(F_list, 2):
        pb = poisson_bracket(Fi, Fj, q, p)
        if sp.simplify(pb) != 0:
            return False
    return True

# -------------------------------------------------
# Verifica integrabilità di Liouville
# -------------------------------------------------
def verify_liouville_integrability(F_list, H, q, p):
    n = len(q)

    if len(F_list) != n:
        return False

    for F in F_list:
        if not is_conserved_hamiltonian(F, H, q, p):
            return False

    if not are_in_involution(F_list, q, p):
        return False

    return True

Oscillatore armonico¶

In [18]:
# Simboli
q1, p1, m, w = sp.symbols('q1 p1 m w', real=True)
q = [q1]
p = [p1]

# Hamiltoniana
H_ho = p1**2/(2*m) + m*w**2*q1**2/2

# Integrali del moto - lo Hamiltoniano stesso
F_list_ho = [H_ho]

print(verify_liouville_integrability(F_list_ho, H_ho, q, p))
True

Moto Kepleriano¶

In [20]:
# Simboli
x, y, px, py, m, k = sp.symbols('x y px py m k', real=True)
q = [x, y]
p = [px, py]

# Hamiltoniana di Kepler
r = sp.sqrt(x**2 + y**2)
H_kepler = (px**2 + py**2)/(2*m) - k/r

# Momento angolare - appiamo da letteratura che si conserva
Lz = x*py - y*px

F_list_kepler = [H_kepler, Lz]

print(verify_liouville_integrability(F_list_kepler, H_kepler, q, p))
True
In [ ]: