Equazione Lagrangiana¶

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

Approccio simbolico¶

In [13]:
import sympy as sp
def kinetic_energy(mass_matrix, velocities):
    """
    Restituisce uno scalare sympy (non una Matrix).
    velocities deve essere un vettore colonna (Matrix(n,1)).
    """
    expr = (velocities.T * mass_matrix * velocities)[0]  # estrae il contenuto 1x1
    return sp.simplify(sp.Rational(1, 2) * expr)

def potential_energy(potential_function, coordinates=None, coords_symbols=None):
    """
    Se coords_symbols e coordinates sono forniti (liste), applica la sostituzione.
    Altrimenti restituisce l'espressione così com'è.
    """
    if coords_symbols is not None and coordinates is not None:
        subs_map = {sym: val for sym, val in zip(coords_symbols, coordinates)}
        return sp.simplify(potential_function.subs(subs_map))
    else:
        return sp.simplify(potential_function)

def lagrangian(kinetic_energy_expr, potential_energy_expr):
    return sp.simplify(kinetic_energy_expr - potential_energy_expr)
        
def euler_lagrange(lagrangian, coords, velocities):
    """
    Derive the Euler-Lagrange equations for given Lagrangian.
        :param lagrangian: The Lagrangian of the system.
        :param coords: Generalized coordinates.
        :param velocities: Generalized velocities.
    :return: 
        List of Euler-Lagrange equations.
    """
    el_eqns = []
    for q, dq in zip(coords, velocities):
        dL_dq = sp.diff(lagrangian, q)
        dL_ddq = sp.diff(lagrangian, dq)
        ddt_dL_ddq = sp.diff(dL_ddq, t)
        el_eqns.append(sp.Eq(ddt_dL_ddq - dL_dq, 0))
    return el_eqns

# Symbols for a single particle
m, t = sp.symbols('m t')
x = sp.Function('x')(t)
v = sp.diff(x, t)

# Define mass matrix and potential function
mass_matrix = sp.Matrix([[m]])
potential_func = sp.Function('V')(x)

# Compute energies and Lagrangian
T = kinetic_energy(mass_matrix, sp.Matrix([v]))
V = potential_energy(potential_func, [x])
L = lagrangian(T, V)

# Derive the Euler-Lagrange equation
coords = [x]
velocities = [v]
euler_eqns = euler_lagrange(L, coords, velocities) # Display results
print("Kinetic Energy: ", T)
print("Potential Energy: ", V)

print("Lagrangian:", L)  
for eqn in euler_eqns:  
    display(eqn) 
Kinetic Energy:  m*Derivative(x(t), t)**2/2
Potential Energy:  V(x(t))
Lagrangian: m*Derivative(x(t), t)**2/2 - V(x(t))
$\displaystyle m \frac{d^{2}}{d t^{2}} x{\left(t \right)} + \frac{d}{d x{\left(t \right)}} V{\left(x{\left(t \right)} \right)} = 0$

Partiamo dalla Lagrangiana $\mathcal{L}(x,\dot{x}) = \frac{1}{2} m \dot{x}^2 - V(x)$
L’equazione di Eulero--Lagrange è $$\frac{d}{dt}\left(\frac{\partial \mathcal{L}}{\partial \dot{x}}\right)- \frac{\partial \mathcal{L}}{\partial x} = 0$$

Calcoliamo i singoli termini:
$$\frac{\partial \mathcal{L}}{\partial \dot{x}} = m \dot{x} \qquad \frac{d}{dt}\left(m \dot{x}\right) = m \ddot{x}$$ $$\frac{\partial \mathcal{L}}{\partial x} = -\frac{dV}{dx}$$ Sostituendo nell’equazione di Eulero--Lagrange si ottiene: $$m \ddot{x} + \frac{dV}{dx} = 0$$ Questa equazione coincide con la seconda legge di Newton per un sistema conservativo, $$m \ddot{x} = -\frac{dV}{dx}$$

In [ ]: