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.
[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
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.
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]]
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.
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]
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