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