Создать символьную ортонормированную матрицу в mathematica - PullRequest
6 голосов
/ 08 декабря 2011

Мне нужно создать вещественную ортонормированную матрицу 3 на 3 в Mathematica. Как я могу это сделать?

Ответы [ 5 ]

11 голосов
/ 08 декабря 2011

Не то чтобы я это рекомендовал, но ...

m = Array[a, {3, 3}];
{q, r} = QRDecomposition[m];
q2 = Simplify[q /. Conjugate -> Identity]

Таким образом, q2 является символической ортогональной матрицей (при условии, что мы работаем над реалами).

4 голосов
/ 10 декабря 2011

Я нашел «прямой» способ навязывания особой ортогональности. Смотри ниже.

(*DEFINITION OF ORTHOGONALITY AND SELF ADJUNCTNESS CONDITIONS:*) 
MinorMatrix[m_List?MatrixQ] := Map[Reverse, Minors[m], {0, 1}] 
CofactorMatrix[m_List?MatrixQ] := MapIndexed[#1 (-1)^(Plus @@ #2) &, MinorMatrix[m], {2}] 
UpperTriangle[ m_List?MatrixQ] := {m[[1, 1 ;; 3]], {0, m[[2,   2]], m[[2, 3]]}, {0, 0, m[[3, 3]]}}; 
FlatUpperTriangle[m_List?MatrixQ] := Flatten[{m[[1, 1 ;; 3]], m[[2, 2 ;; 3]], m[[3, 3]]}];
Orthogonalityconditions[m_List?MatrixQ] := Thread[FlatUpperTriangle[m.Transpose[m]] == FlatUpperTriangle[IdentityMatrix[3]]]; 
Selfadjunctconditions[m_List?MatrixQ] := Thread[FlatUpperTriangle[CofactorMatrix[m]] == FlatUpperTriangle[Transpose[m]]]; 
SO3conditions[m_List?MatrixQ] := Flatten[{Selfadjunctconditions[m], Orthogonalityconditions[m]}]; 

(*Building of an SO(3) matrix*) 
mat = Table[Subscript[m, i, j], {i, 3}, {j, 3}]; 
$Assumptions = SO3conditions[mat]

Тогда

Simplify[Det[mat]] 

дает 1; ... и

MatrixForm[Simplify[mat.Transpose[mat]]

дает единичную матрицу; ... наконец

MatrixForm[Simplify[CofactorMatrix[mat] - Transpose[mat]]]

дает нулевую матрицу.

=============================================== =========================

Это то, что я искал, когда задавал свой вопрос! Однако, дайте мне знать вашу мысль об этом методе.

Марцелл

4 голосов
/ 08 декабря 2011

Кажется, вам нужна групповая параметризация 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 над различными точками столбцов (или строк).

3 голосов
/ 10 декабря 2011

Марцелл, вы должны использовать некоторую параметризацию SO (3), поскольку ваша общая матрица должна отражать топологию RP 3 группы .Ни одна параметризация не охватит всю группу без многозначности или особых точек.В Википедии есть хорошая страница о различных диаграммах SO (3) .

Возможно, одним из концептуально самых простых является экспоненциальное отображение из алгебры Ли so (3).Определите антисимметричное, действительное A (которое охватывает (3))

A = {{0, a, -c},
     {-a, 0, b},
     {c, -b, 0}};

Тогда MatrixExp[A] является элементом SO(3).Мы можем проверить, что это так, используя

Transpose[MatrixExp[A]].MatrixExp[A] == IdentityMatrix[3] // Simplify

Если мы напишем t^2 = a^2 + b^2 + c^2, мы можем упростить экспоненциальную матрицу до

{{   b^2 + (a^2 + c^2) Cos[t]  , b c (1 - Cos[t]) + a t Sin[t], a b (1 - Cos[t]) - c t Sin[t]}, 
 {b c (1 - Cos[t]) - a t Sin[t],    c^2 + (a^2 + b^2) Cos[t]  , a c (1 - Cos[t]) + b t Sin[t]}, 
 {a b (1 - Cos[t]) + c t Sin[t], a c (1 - Cos[t]) - b t Sin[t],    a^2 + (b^2 + c^2) Cos[t]}} / t^2

Обратите внимание, что это в основном та же самая параметризациякак RotationMatrix дает.Сравните с выводом из

RotationMatrix[s, {b, c, a}] // ComplexExpand // Simplify[#, Trig -> False] &;
% /. a^2 + b^2 + c^2 -> 1
2 голосов
/ 31 марта 2013

Хотя мне действительно нравится идея ответа Марцелла на его собственный вопрос, это не совсем правильно. К сожалению, условия, к которым он приходит, также приводят к

Simplify[Transpose[mat] - mat]

оценка до нулевой матрицы! Это явно не правильно. Вот правильный и более прямой подход:

OrthogonalityConditions[m_List?MatrixQ] := Thread[Flatten[m.Transpose[m]] == Flatten[IdentityMatrix[3]]];
SO3Conditions[m_List?MatrixQ] := Flatten[{OrthogonalityConditions[m], Det[m] == 1}];

т.е. умножение матрицы вращения на результаты транспонирования в единичной матрице, и определитель матрицы вращения равен 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...