Dissipative Systems in Lagrangian Mechanics¶

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

La meccanica lagrangiana classica è formulata per sistemi conservativi, nei quali l'energia meccanica totale si conserva. Tuttavia, molti sistemi fisici reali presentano fenomeni dissipativi, come l'attrito viscoso o la resistenza dell'aria. In questa sezione si descrivono i principali approcci per includere la dissipazione nel formalismo lagrangiano.

Limiti del formalismo lagrangiano standard¶

Le equazioni di Eulero--Lagrange $$ \frac{d}{dt}\left(\frac{\partial L}{\partial \dot{q}^i}\right)-\frac{\partial L}{\partial q^i} = 0 $$ derivano da un principio variazionale basato su una azione $$ S = \int_{t_1}^{t_2} L(q,\dot{q},t), dt, $$ che presuppone forze conservative. Le forze dissipative non possono, in generale, essere ottenute da un potenziale scalare.

Forze generalizzate non conservative¶

Un primo approccio consiste nello introdurre forze generalizzate non conservative $Q_i^{(nc)}$, modificando le equazioni di Eulero--Lagrange: $$ \frac{d}{dt}\left(\frac{\partial L}{\partial \dot{q}^i}\right)-\frac{\partial L}{\partial q^i} = Q_i^{(nc)}. $$

Questo metodo mantiene la struttura lagrangiana per la parte conservativa del sistema.

Funzione di dissipazione di Rayleigh¶

Per forze dissipative lineari nelle velocità, come lo attrito viscoso, si introduce la funzione di dissipazione di Rayleigh: $$ \mathcal{F}(\dot{q}) = \frac{1}{2} \sum_{i,j} c_{ij} \dot{q}^i \dot{q}^j, $$ dove $c_{ij}$ sono coefficienti dissipativi simmetrici e positivi.

Le forze dissipative generalizzate sono date da:

$$ Q_i^{(d)} = -\frac{\partial \mathcal{F}}{\partial \dot{q}^i}. $$

Le equazioni del moto diventano: $$ \frac{d}{dt}\left(\frac{\partial L}{\partial \dot{q}^i}\right)-\frac{\partial L}{\partial q^i} +\frac{\partial \mathcal{F}}{\partial \dot{q}^i} = 0. $$

Esempio: oscillatore armonico smorzato¶

Si consideri un oscillatore armonico con smorzamento viscoso: $$ L = \frac{1}{2}m \dot{x}^2 - \frac{1}{2}k x^2, \quad \mathcal{F} = \frac{1}{2}\gamma \dot{x}^2. $$

La equazione del moto risultante è: $$ m \ddot{x} + b \dot{x} + \gamma x = 0. $$

Approccio con Lagrangiane efficaci¶

In alcuni casi è possibile costruire una Lagrangiana efficace dipendente esplicitamente dal tempo, ad esempio: $$ L = e^{\gamma t} \left( \frac{1}{2}m \dot{x}^2 - V(x) \right), $$ che produce equazioni del moto dissipative, ma al prezzo di perdere la conservazione della energia e la invarianza temporale.

Estensione con variabili ausiliarie¶

Un altro approccio consiste nello introdurre gradi di libertà ausiliari che rappresentano lo ambiente, rendendo il sistema esteso conservativo. La dissipazione emerge poi eliminando tali variabili (riduzione effettiva).

Implicazioni energetiche¶

In presenza di dissipazione, la derivata temporale della energia meccanica è: $$ \frac{dE}{dt} = - \sum_i \dot{q}^i \frac{\partial \mathcal{F}}{\partial \dot{q}^i} \leq 0, $$ che riflette la perdita irreversibile di energia.

Osservazioni finali¶

  • I sistemi dissipativi non ammettono in generale una formulazione variazionale standard.
  • La funzione di Rayleigh fornisce una descrizione efficace per dissipazioni lineari.
  • Approcci più avanzati includono formalismi non locali, contatti hamiltoniani e meccanica non conservativa.
In [7]:
import numpy as np 

def lagrangian(T, V):
    """
    Calculate the Lagrangian of a system.
        :param T: Kinetic energy.
        :param V: Potential energy.
    :return: 
        Lagrangian.
    """
    return T - V

def rayleigh_dissipation(velocities, coefficients):
    """
    Calculate the Rayleigh dissipation function.
    :param velocities: Generalized velocities.
    :param coefficients: Damping coefficients.
    :retum: 
        Rayleigh dissipation.
    """
    return 0.5 * np.sum(coefficients * velocities**2)

def harmonic_oscillator(m, k, gamma, x, v, dt):
    """
    Simulates a damped harmonic oscillator using the velocity Verlet method.
        :param m: Mass of the oscillator.
        :param k: Spring constant.
        :param gamma: Damping coefficient.
        :param x: Initial position.
        :param v: Initial velocity.
        :param dt: Time step.
    :return: 
        Simulated position and velocity over time.
    """
    # Initialize arrays to store position and velocity
    num_steps = 1000
    positions = np.zeros(num_steps)
    velocities = np.zeros(num_steps)
    positions[0] = x
    velocities [0] = v
    for n in range(1, num_steps):
        # Calculate acceleration from force terms
        a = -(k / m) * positions[n-1] - (gamma / m) * velocities [n-1]
        # Update position
        positions[n] = positions[n-1] + velocities[n-1] * dt + 0.5 * a * dt**2
        # Calculate new acceleration
        a_new = -(k / m) * positions[n] - (gamma / m) * velocities[n-1]
        # Update velocity
        velocities[n] = velocities[n-1] + 0.5 * (a + a_new) * dt
    return positions, velocities
    
# Simulation parameters
mass = 1.0
stiffness = 10.0
damping = 0.5
initial_position = 1.0
initial_velocity = 0.0
time_step = 0.1 # Run simulation

pos, vel = harmonic_oscillator(mass, stiffness, damping, initial_position, initial_velocity, time_step) 
print("Final position:", pos[-1])
print("Final velocity:", vel[-1])
Final position: 1.4012065282144866e-11
Final velocity: 7.488868522582272e-12
In [ ]: