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 [ ]: