Funzione Hamiltoniana¶

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

Due oscillatori armonici indipendenti - Approccio simbolico¶

In [9]:
import sympy as sp

# Define symbols for time, position, and velocity
t = sp.Symbol('t')
q = sp.Function('q')(t)
p = sp.Symbol('p')
m = sp.Symbol('m') # mass
V = sp. Function('W')(q) # Potential energy

# Define kinetic energy
T = (1/2) * m * sp.diff(q, t)**2

# Lagrangian
L = T - V

## Calculate momentum
p_momentum = sp.diff(L, sp.diff(q, t))

# Legendre transformation to find Hamiltonian
H = p_momentum * sp.diff(q, t) - L

H = H.subs(sp.diff(q, t) , p/m) # Express Hamiltonian as a function of p

# Hamilton's equations of motion
Hamiltons_eq1 = sp.Eq(sp.diff(q, t), sp.diff(H, p))
Hamiltons_eq2 = sp.Eq(sp.diff(p, t), -sp.diff(H, q))

def legendre_transform(lagrangian, q_dot, q, p):
    """
    Calculate the Hamiltonian via Legendre transformation.
        :param lagrangian: Lagrangian of the system.
        :param q_dot: Generalized velocity (dq/dt).
        :param q: Generalized position (q).
        :param p: Generalized momentum (p).
    :return: 
        Hamiltonian expression.
    """
    momentum = sp.diff(lagrangian, q_dot)
    hamiltonian = momentum * q_dot - lagrangian
    hamiltonian = hamiltonian.subs(q_dot, p/m)
    return hamiltonian

def hamiltons_equations(hamiltonian, q, p):
    """
    Derive Hamilton's equations from the Hamiltonian.
        :param hamiltonian: Hamiltonian of the system.
        :param q: Generalized position (q).
        :param p: Generalized momentum (p).
    :return: 
        Hamilton's equations.
    """
    dq_dt = sp.Eq(sp.diff(q, t), sp.diff(hamiltonian, p))
    dp_dt = sp.Eq(sp.diff(p, t), -sp.diff(hamiltonian, q))
    return dq_dt, dp_dt

# Demonstration with example values
lagrangian = L
hamiltonian = legendre_transform(lagrangian, sp.diff(q, t), q, p)
hamiltons_eqs = hamiltons_equations(hamiltonian, q, p)
print("Hamiltonian Function:")
display(hamiltonian)
print("Hamilton's Equation for dq/dt:")
display(hamiltons_eqs[0])
print("Hamilton's Equation for dp/dt:")
display(hamiltons_eqs[1])
Hamiltonian Function:
$\displaystyle W{\left(q{\left(t \right)} \right)} + \frac{0.5 p^{2}}{m}$
Hamilton's Equation for dq/dt:
$\displaystyle \frac{d}{d t} q{\left(t \right)} = \frac{1.0 p}{m}$
Hamilton's Equation for dp/dt:
$\displaystyle 0 = - \frac{d}{d q{\left(t \right)}} W{\left(q{\left(t \right)} \right)}$
In [ ]: