[PYTHON] Trouvez la broche inertielle et le moment d'inertie principal à partir du tenseur inertiel avec NumPy

Pour obtenir l'axe d'inertie principal et le moment d'inertie principal à partir du tenseur d'inertie, l'opération de diagonalisation de la matrice est effectuée. Je pense qu'il est assez difficile d'écrire un programme de diagonalisation, mais l'utilisation de NumPy le rend étonnamment facile à trouver. Je lirai l'histoire théorique ailleurs, et n'expliquerai que la procédure de calcul utilisant NumPy.

référence:

[Moment d'inertie-Wikipedia](https://ja.wikipedia.org/wiki/%E6%85%A3%E6%80%A7%E3%83%A2%E3%83%BC%E3%83%A1% E3% 83% B3% E3% 83% 88 # .E6.85.A3.E6.80.A7.E4.B8.BB.E8.BB.B8.E3.81.A8.E4.B8.BB.E6 .85.A3.E6.80.A7.E3.83.A2.E3.83.BC.E3.83.A1.E3.83.B3.E3.83.88) Conversion de coordonnées du tenseur d'inertie

Procédure de calcul

  1. Créez une matrice $ I $ qui représente le tenseur d'inertie.
  2. Utilisez numpy.linalg.eig pour trouver la matrice $ P $ qui regroupe les valeurs propres et les vecteurs propres.
  3. Diagonaliser le tenseur inertiel $ I $ en utilisant la matrice $ P $. (Optionnel)

0. Préparation

Définissez la sortie de NumPy pour qu'elle soit facile à lire. Ici, il est réglé pour être fixe et affiché avec 4 chiffres après la virgule décimale.

import numpy as np
np.set_printoptions(precision=4, suppress=True)

En particulier, la lisibilité de la valeur minimale est très différente. -2.86013404e-15 → 0.

1. Créez une matrice_I_ qui représente le tenseur inertiel.

Définissez une matrice représentant le tenseur d'inertie sous la forme d'un ndarray. Cependant, comme le tenseur d'inertie est une matrice symétrique, rendez-le symétrique.

I = np.array([[30, 5, 5],
              [5, 20, 5],
              [5, 5, 10]])
print(I)

output


[[30  5  5]
 [ 5 20  5]
 [ 5  5 10]]

2. Utilisez numpy.linalg.eig pour trouver la matrice P qui regroupe les valeurs propres et les vecteurs propres.

numpy.linalg.eig est une fonction pour trouver des valeurs propres et des vecteurs propres. Cela peut être utilisé pour déterminer le moment d'inertie principal et la broche d'inertie.

I_p, P = np.linalg.eig(I)
print('Moment d'inertie principal: \n', I_p)
print('Broche inertielle: \n', P.T)

output


Moment d'inertie principal: 
 [ 33.8923  18.5542   7.5536]
Broche inertielle: 
 [[ 0.8716  0.4103  0.2683]
 [ 0.4706 -0.8535 -0.2238]
 [-0.1371 -0.3213  0.937 ]]

La première valeur de retour est un tableau de valeurs uniques. C'est le moment d'inertie principal. La deuxième valeur de retour est un agencement de trois vecteurs propres en tant que vecteurs de colonne, et chaque vecteur sert d'axe principal d'inertie. Le vecteur de ligne étant plus facile à comprendre tel qu'il apparaît, il est transposé et produit.

3. Diagonaliser le tenseur inertiel_I_ à l'aide de la matrice P. (Optionnel)

Nous avons déjà obtenu ce dont nous avons besoin, mais confirmons que la diagonalisation fournit le moment d'inertie principal. Le moment d'inertie principal peut être obtenu en diagonalisant le tenseur d'inertie $ I $ à l'aide de la matrice $ P $. Matrice diagonale du moment d'inertie principal = $ P ^ {-1} I P $ Référence: Diagonalization \ -Wikipedia

numpy.linalg.inv est une fonction pour trouver la matrice inverse. L'opérateur «@» représente le produit des matrices. (Notez que dans NumPy, l'opérateur * est le produit des éléments.)

I_p = np.linalg.inv(P) @ I @ P
print(I_p)

output


[[ 33.8923  -0.       0.    ]
 [ -0.      18.5542   0.    ]
 [ -0.      -0.       7.5536]]

La composante diagonale ainsi obtenue est le moment d'inertie principal. Seules les composantes diagonales peuvent être extraites à l'aide de la fonction diag.

print(np.diag(I_p))

output


[ 33.8923  18.5542   7.5536]

Remarques

Comme l'opérateur @ qui calcule le produit des matrices peut être utilisé dans Python 3.5 et versions ultérieures, la fonction numpy.dot est utilisée à la place dans Python 3.4 et versions antérieures.

Recommended Posts

Trouvez la broche inertielle et le moment d'inertie principal à partir du tenseur inertiel avec NumPy
Découvrez la puissance de l'accélération avec NumPy / SciPy
Trouvez la distance (en tenant compte de la rondeur de la terre) de la latitude et de la longitude.
Trouvez le waypoint à partir de la latitude et de la longitude (en tenant compte de la rondeur de la terre).
Retrouvez les termes généraux de la séquence de Tribonacci en algèbre linéaire et Python
Trouvez la position au-dessus du seuil avec NumPy
Deep Learning from scratch La théorie et la mise en œuvre de l'apprentissage profond appris avec Python Chapitre 3
Découvrez le jour par date / heure
Extraire des images et des tableaux de pdf avec python pour réduire la charge de reporting
Transposons la matrice et multiplions les matrices par numpy.
Apprenez Nim avec Python (dès le début de l'année).
Calculer la somme des valeurs uniques par tabulation croisée des pandas
Visualisez la gamme d'insertions internes et externes avec python
Découvrez l'emplacement des packages installés avec pip
Trouvez la «note de passage minimale» à partir de la «note moyenne des candidats», de la «note moyenne des candidats retenus» et de «l'agrandissement» de l'examen d'entrée
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Une histoire sur la prédiction des préfectures à partir des noms de villes avec Jubatus
Trouvez le chemin critique de PERT en utilisant la recherche de priorité de largeur et la recherche de priorité de profondeur
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
Découvrez l'âge et le nombre de gains des gouverneurs de préfecture dans tout le pays
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
Trouvez la fonction de transfert du système à un degré de liberté avec PythonControl.
Capturer GeneratorQuitter et détecter la fin de l'itération du côté du générateur
Trouvez la solution numérique de l'équation différentielle ordinaire du second ordre avec scipy
[Objet obligatoire DI] Implémenter et comprendre le mécanisme de DI avec Go
Trouvez le plus petit index qui atteint le seuil de somme cumulée avec numpy
Pour améliorer la réutilisabilité et la maintenabilité des flux de travail créés avec Luigi
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
Utilisez Firefox avec Selenium depuis python et enregistrez la capture d'écran
Trouver l'intersection d'un cercle et d'une droite (matrice sympy)
Ce que j'ai fait quand je ne pouvais pas trouver le point caractéristique avec le flux optique d'opencv et quand je l'ai perdu
[Version terminée] Essayez de connaître le nombre d'habitants de la ville à partir de la liste d'adresses avec Python