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.
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)