Кажется, вам нужна групповая параметризация SO(3)
в Mathematica.У вас будет только 3 независимых символа (переменных), поскольку у вас есть 6 ограничений взаимной ортогональности векторов и норм, равных 1. Один из способов - построить независимые повороты вокруг 3 осей и умножить эти матрицы.Вот (возможно, слишком сложный) код для этого:
makeOrthogonalMatrix[p_Symbol, q_Symbol, t_Symbol] :=
Module[{permute, matrixGeneratingFunctions},
permute = Function[perm, Permute[Transpose[Permute[#, perm]], perm] &];
matrixGeneratingFunctions =
Function /@ FoldList[
permute[#2][#1] &,
{{Cos[#], 0, Sin[#]}, {0, 1, 0}, {-Sin[#], 0, Cos[#]}},
{{2, 1, 3}, {3, 2, 1}}];
#1.#2.#3 & @@ MapThread[Compose, {matrixGeneratingFunctions, {p, q, t}}]];
Вот как это работает:
In[62]:= makeOrthogonalMatrix[x,y,z]
Out[62]=
{{Cos[x] Cos[z]+Sin[x] Sin[y] Sin[z],Cos[z] Sin[x] Sin[y]-Cos[x] Sin[z],Cos[y] Sin[x]},
{Cos[y] Sin[z],Cos[y] Cos[z],-Sin[y]},
{-Cos[z] Sin[x]+Cos[x] Sin[y] Sin[z],Cos[x] Cos[z] Sin[y]+Sin[x] Sin[z],Cos[x] Cos[y]}}
Вы можете проверить, что матрица ортонормирована, используя Simplify
над различными точками столбцов (или строк).