Hamilton's Characteristic Function¶
da PowerShell -- jupyter nbconvert --to html notebook.ipynb
In [12]:
import sympy as sp
def action_integral(L, q, q_dot, t0, t1):
"""
Calcola l'azione S = ∫ L dt
"""
S = sp.integrate(L, (t, t0, t1))
return sp.simplify(S)
def hamilton_jacobi_principal(L, q, q_dot, t):
"""
Restituisce simbolicamente la funzione S(q,t)
"""
S = sp.Function('S')(q, t)
return S
def characteristic_function(H, q, S, t):
"""
Assume separazione: S(q,t) = W(q) - E t
"""
E = sp.symbols('E')
W = sp.Function('W')(q)
S_sep = W - E*t
return S_sep, W, E
def hamilton_jacobi_equation(H, S, q, t):
"""
Costruisce l'equazione di Hamilton-Jacobi
"""
p = sp.diff(S, q)
dSdt = sp.diff(S, t)
H_sub = H.subs('p', p)
return sp.simplify(H_sub + dSdt)
def energy(H, q, t):
"""
Restituisce l'energia se H non dipende dal tempo
"""
if not H.has(t):
return H
else:
return None
def hamilton_jacobi_method(H, L, q, q_dot, t, alpha):
"""
Procedura completa del metodo HJ
"""
S = hamilton_jacobi_principal(L, q, q_dot, t)
S_sep, W, E = characteristic_function(H, q, S, t)
hj_eq = hamilton_jacobi_equation(H, S_sep, q, t)
print("Equazione di Hamilton-Jacobi:")
#sp.pprint(hj_eq)
display(hj_eq)
W_eq = sp.solve(hj_eq, sp.diff(W, q)**2)
print("\nEquazione per W(q):")
#sp.pprint(W_eq)
#display(W_eq)
return W_eq
def solve_characteristic_function(hj_eq, q, m, E):
"""
Risolve correttamente W(q) dall'equazione HJ
"""
dWdq = sp.sqrt(2*m*E)
W = sp.integrate(dWdq, q)
return W
m = sp.symbols('m', positive=True)
q, t = sp.symbols('q t')
p = sp.symbols('p')
q_dot = sp.symbols('q_dot')
alpha = sp.symbols('alpha')
E = sp.symbols('E', positive=True)
L = m*q_dot**2/2
H = p**2/(2*m)
W_eq = hamilton_jacobi_method(H, L, q, q_dot, t, alpha)
hj_eq = (sp.diff(sp.Function('W')(q), q)**2)/(2*m) - E
W = solve_characteristic_function(hj_eq, q, m, E)
display(W)
Equazione di Hamilton-Jacobi:
$\displaystyle - E + \frac{\left(\frac{d}{d q} W{\left(q \right)}\right)^{2}}{2 m}$
Equazione per W(q):
$\displaystyle \sqrt{2} \sqrt{E} \sqrt{m} q$
In [ ]: