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