Euler's Equations for Rigid Body Rotation¶

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

L'esercizio simula la $\textbf{dinamica rotazionale di un corpo rigido}$ utilizzando le $\textbf{equazioni di Eulero}$ nel sistema solidale al corpo e ne integra numericamente l'evoluzione temporale.

Equazioni di Eulero¶

Per un corpo rigido con momenti di inerzia principali $I_1, I_2, I_3$, le equazioni di Eulero in presenza di momenti esterni $(N_1, N_2, N_3)$ sono: $$\large \begin{aligned} I_1 \dot{\omega}_1 &= (I_2 - I_3)\,\omega_2 \omega_3 + N_1, \\ I_2 \dot{\omega}_2 &= (I_3 - I_1)\,\omega_3 \omega_1 + N_2, \\ I_3 \dot{\omega}_3 &= (I_1 - I_2)\,\omega_1 \omega_2 + N_3. \end{aligned} $$

Nel codice queste equazioni vengono riscritte in forma esplicita come: $$\large \dot{\omega}_i = \frac{(I_j - I_k),\omega_j \omega_k}{I_i}

  • \frac{N_i}{I_i},

\quad (i,j,k)\ \text{ciclica}. $$

Integrazione numerica¶

Le equazioni di Eulero vengono integrate numericamente tramite il $\textbf{metodo di Eulero esplicito}$, che approssima l'evoluzione temporale della velocità angolare come: $$\large \boldsymbol{\omega}(t + \Delta t) = \boldsymbol{\omega}(t)

\dot{\boldsymbol{\omega}}(t),\Delta t. $$

La simulazione utilizza:

  • momenti di inerzia costanti $I_1 = 1$, $I_2 = 2$, $I_3 = 3$,
  • una velocità angolare iniziale $\boldsymbol{\omega}(0) = (0.1,\,0.2,\,0.3)$,
  • assenza di momenti esterni ($\mathbf{N} = \mathbf{0}$),
  • un passo temporale $\Delta t = 0.01$,
  • un tempo totale di simulazione $T = 10$.

Caso libero (assenza di coppie)¶

Poiché i momenti esterni sono nulli, il sistema descrive un $\textbf{corpo rigido libero}$. In questo caso:

  • l'energia cinetica rotazionale è costante,
  • il modulo del momento angolare è conservato,
  • le componenti della velocità angolare possono oscillare a causa dell'anisotropia del tensore di inerzia.

Analisi dei risultati¶

Durante la simulazione viene calcolato il modulo della velocità angolare: $$\large |\boldsymbol{\omega}(t)| = \sqrt{\omega_1^2(t) + \omega_2^2(t) + \omega_3^2(t)}. $$

Il codice produce un grafico di $|\boldsymbol{\omega}|$ in funzione del tempo, che permette di verificare qualitativamente la conservazione dell'energia e la stabilità della rotazione nel caso libero.

Conclusione¶

L'esercizio mostra come:

  • formulare le equazioni di Eulero per un corpo rigido,
  • integrarle numericamente,
  • analizzare l'evoluzione della velocità angolare,
  • visualizzare il comportamento dinamico del sistema.

Si tratta di un esempio didattico di dinamica rotazionale non lineare di un corpo rigido tridimensionale.

In [10]:
import numpy as np
import matplotlib.pyplot as plt

def euler_equations_omega_dot(I1, I2, I3, omega, torque):
    """
    Calculate the derivatives of the angular velocities using
    Euler's equations.
        :param I1: Moment of inertia about axis 1.
        :param I2: Moment of inertia about axis 2.
        :param I3: Moment of inertia about axis 3.
        :param omega: Current angular velocities [omegal, omega2, omega3].
        :param torque: External torques [Nl, N2, N3].
    :return: 
        Derivatives of angular velocities [domegal/dt, domega2/dt, domega3/dt].
    """
    omega1, omega2, omega3 = omega
    N1, N2, N3 = torque
    domega1_dt = (I2 - I3) * omega2 * omega3 / I1 + N1 / I1
    domega2_dt = (I3 - I1) * omega3 * omega1 / I2 + N2 / I2
    domega3_dt = (I1 - I2) * omega1 * omega2 / I3 + N3 / I3

    return np.array([domega1_dt, domega2_dt, domega3_dt])

def integrate_euler_equations(I1, I2, I3, omega0, torques, dt, T):
    """
    Numerically integrate Euler's equations over time using Euler's
    method.
        :param I1: Moment of inertia about axis 1.
        :param I2: Moment of inertia about axis 2.
        :param I3: Moment of inertia about axis 3.
        :param omega0: Initial angular velocities [omegal, omega2, omega3].
    :param torques: External torques [N1, N2, N3].
    :param dt: Time step for integration.
    :param T: Total simulation time.
    :return: 
        Array with angular velocities over time.
    """
    n_steps = int(T / dt)
    omega = np.zeros((n_steps, 3))
    omega[0] = omega0
    for step in range(1, n_steps):
        omega_dot = euler_equations_omega_dot(I1, I2, I3, omega[step-1], torques)
        omega[step] = omega[step-1] + omega_dot * dt
    return omega

# Simulation parameters
I1, I2, I3 = 1.0, 2.0, 3.0 # Moments of inertia
omega0 = np.array([0.1, 0.2, 0.3]) # Initial angular velocities
torques = np.array([0.0, 0.0, 0.0]) # External torques
dt = 0.01 # Time step
T = 10.0 # Total simulation time 

# Compute angular velocities over time
omega_timeline = integrate_euler_equations(I1, I2, I3, omega0, torques, dt, T) 

# Print results
#for i, omega in enumerate(omega_timeline):
#    print(f"Time {i*dt:.2f} s: Omega = {omega}")

# Time array
time = np.linspace(0, T, len(omega_timeline))

# |omega|
omega_magnitude = np.linalg.norm(omega_timeline, axis=1)

# Plot |omega| vs time
plt.figure()
plt.figure(figsize=(4, 4))
plt.plot(time, omega_magnitude)
plt.xlabel("Time [s]")
plt.ylabel("|ω| [rad/s]")
plt.title("Angular velocity magnitude vs time")
plt.grid(True)
plt.show()
<Figure size 640x480 with 0 Axes>
No description has been provided for this image
In [ ]: