EulerMatrix con assi diversi da X, Y e Z

Oct 07 2020

La funzione Mathematica EulerMatrix[{Alpha, Beta, Gamma},{a,b,c}]fornisce la matrice di Eulero per la rotazione attorno agli assi X, Y e Z. Qui scegliendo l'ordine di a, bec, possiamo cambiare l'ordine delle rotazioni rispetto ai tre assi.

La mia domanda è: come trovare la matrice di Eulero per una rotazione per la quale i "vecchi" assi non sono assi X, Y e Z. Ad esempio, desidero trovare una matrice di Eulero nel formato {3, 1, 3} per la quale gli assi vecchi sono, asse 1 = {1, -1, 0}, asse 2 = {1, 1, -2} e asse 3 = {1, 1, 1}.

Apprezzerò qualsiasi aiuto. Grazie

Risposte

2 DanielHuber Oct 07 2020 at 16:55

È più semplice lavorare con assi normalizzati. Se hai vecchi assi dati da: old = {{1,0,0}, {0,1,0}, 0,0,1}} e vuoi la rotazione di Eulero attorno a nuovi assi: new, puoi ruotare un vettore vec relativo al nuovo sistema trasformando prima il vettore nel nuovo sistema, applicare la rotazione di Eulero e trasformare il vettore nel vecchio sistema.

A tal fine, definiamo una matrice di rotazione (matrice di rotazione degli assi): braccio che ruota i vecchi assi in nuovi assi. Notare che le colonne di questa matrice sono il nuovo asse nel vecchio sistema. Inoltre, questa matrice trasforma le coordinate del vecchio sistema in coordinate nel nuovo sistema. Definiamo una seconda matrice di rotazione (matrice di rotazione vettoriale): vrm, che ruota un vettore vec = {1,1,1} / Sqrt [3] nel nuovo sistema. Ecco il codice e la grafica per questo:

old = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
orig = {0, 0, 0};
vec = {1, 1, 1}/Sqrt[3];
Row[{Red, "Vector   ", Green, "New Axes   ", Black, "Old Axes"}]
Manipulate[
 arm = EulerMatrix[{a, b, c}];
 vrm = EulerMatrix[{va, vb, vc}];
 rotvec = Inverse[arm].vrm.arm.vec;(*here is the vector rotated*)
 Graphics3D[{
   Arrow[{orig, #}] & /@ old
   , Green, Arrow[{orig, #}] & /@ Transpose@arm, 
   MapThread[Text[#2, 1.1 #1] &, {Transpose@arm, {"xn", "yn", "zn"}}]
   , Red, Arrow[{orig, #}] &[rotvec]
   }, SphericalRegion -> True, Axes -> True, BoxRatios -> {1, 1, 1}, 
  PlotRange -> {{-1, 1}, {-1, 1}, {-1, 1}}]
 , {{va, 0, "a-vec"}, 0, 2 Pi}, {{vb, 0, "b-vec"}, 0, 
  Pi}, {{vc, 0, "c-vec"}, 0, 2 Pi}, {{a, 0, "a-axes"}, 0, 
  2 Pi}, {{b, 0, "b-axes"}, 0, Pi}, {{c, 0, "c-axes"}, 0, 2 Pi}]

2 Ferca Oct 07 2020 at 16:41

Modificare:

Puoi usarlo RotationMatrixper costruire la tua EulerMatrix ruotando attorno ai tuoi assi personalizzati 1, 2 e 3.

Per prima cosa verifica di poter riprodurre EulerMatrix[{\[Alpha], \[Beta], \[Gamma]}, {3, 1, 3}]con RotationMatrix:

RotationMatrix[\[Alpha], {0, 0, 1}].RotationMatrix[\[Beta], {1, 0,0}].RotationMatrix[\[Gamma], {0, 0, 1}]
(* Check this is equivalent to EulerMatrix[{\[Alpha], \[Beta], \[Gamma]}, {3, 1, 3}] *)
EulerMatrix[{\[Alpha], \[Beta], \[Gamma]}, {3, 1, 3}] - % // Simplify 
(* {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}} *)

Ora ruota attorno ai tuoi assi personalizzati 1,2,3 nel formato 3-1-3:

(* Define custom axis *)
Axis1 = {1, -1, 0}; Axis2 = {1, 1, -2}; Axis3 = {1, 1, 1};
(* Euler Matrix in 3-1-3 format about the custom axis*)
RotationMatrix[\[Alpha], Axis3].RotationMatrix[\[Beta],Axis1].RotationMatrix[\[Gamma], Axis3]//Simplify