Moment of Inertia Tensor¶

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

L'esercizio calcola il $\textbf{tensore di inerzia}$ di un sistema discreto di masse puntiformi e ne determina gli $\textbf{assi principali di inerzia}$.

Tensore di inerzia¶

Dato un insieme di masse $m_i$ localizzate nelle posizioni $\mathbf{r}_i = (x_i, y_i, z_i)$ rispetto a un'origine fissata, il tensore di inerzia è definito come: $$\large \mathbf{I} = \begin{pmatrix} \sum_i m_i (y_i^2 + z_i^2) & -\sum_i m_i x_i y_i & -\sum_i m_i x_i z_i \\ -\sum_i m_i x_i y_i & \sum_i m_i (x_i^2 + z_i^2) & -\sum_i m_i y_i z_i \\ -\sum_i m_i x_i z_i & -\sum_i m_i y_i z_i & \sum_i m_i (x_i^2 + y_i^2) \end{pmatrix}. $$

Il codice costruisce esplicitamente questa matrice sommando i contributi di ciascun elemento di massa.

Assi e momenti principali di inerzia¶

Il tensore di inerzia è una matrice simmetrica reale; pertanto può essere diagonalizzato tramite una trasformazione ortogonale. Gli $\textbf{assi principali di inerzia}$ sono ottenuti risolvendo il problema agli autovalori: $$\large \mathbf{I} \, \mathbf{e}_k = \lambda_k \, \mathbf{e}_k, $$ dove:

  • $\lambda_k$ sono i $\textbf{momenti principali di inerzia}$,
  • $\mathbf{e}_k$ sono i versori degli $\textbf{assi principali}$.

Il codice utilizza una decomposizione spettrale per ottenere autovalori e autovettori del tensore di inerzia.

Esempio numerico¶

L'esempio considera tre masse puntiformi: $$\large m_1 = 1, \quad m_2 = 2, \quad m_3 = 3, $$ poste rispettivamente lungo gli assi cartesiani nelle posizioni: $$\large (1,0,0), \quad (0,1,0), \quad (0,0,1). $$

Per questo sistema vengono calcolati:

  • il tensore di inerzia rispetto all'origine,
  • i momenti principali di inerzia,
  • l'orientazione degli assi principali.

Conclusione¶

L’esercizio mostra come:

  • costruire il tensore di inerzia di un sistema discreto,
  • sfruttarne la simmetria,
  • determinarne gli assi e i momenti principali,
  • collegare la descrizione geometrica alla dinamica rotazionale.

Si tratta di un esempio fondamentale per lo studio della dinamica dei corpi rigidi e della meccanica razionale.

In [ ]:
import numpy as np

def inertia_tensor(masses, positions):
    """
    Calculate the inertia tensor for a discrete set of mass
    elements.
        :param masses: A list of masses m_i.
        :param positions: A list of position vectors for 
         each mass element.
    :return: 
        Inertia tensor as a 3x3 numpy array.
    """
    I = np.zeros((3, 3))
    for m, (x, y, z) in zip(masses, positions):
        I[0, 0] += m * (y**2 + z**2)
        I[1, 1] += m * (x**2 + z**2)
        I[2, 2] += m * (x**2 + y**2)

        I[0, 1] -= m * x * y
        I[0, 2] -= m * x * z
        I[1, 2] -= m * y * z
        I[1, 0] = I[0, 1]
        I[2, 0] = I[0, 2]
        I[2, 1] = I[1, 2]
    return I 
    
def principal_axes(I):
    """
    Find the principal axes and moments of inertia.
        :param I: Inertia tensor.
    :return: 
        Eigenvalues and eigenvectors corresponding 
        to the principal axes.
    """
    eigenvalues, eigenvectors = np.linalg.eigh(I)
    return eigenvalues, eigenvectors 
    
# Example usage
masses = [1, 2, 3]
positions = [(1, 0, 0), (0, 1, 0), (0, 0, 1)]

I = inertia_tensor(masses, positions)
eigenvalues, eigenvectors = principal_axes(I)

print("Inertia Tensor:\n", I)
print("Principal Moments of Inertia:", eigenvalues)
print("Principal Axes:\n", eigenvectors)
In [ ]: