在mathematica中创建一个符号正交矩阵

时间:2011-12-08 14:16:41

标签: wolfram-mathematica

我需要在Mathematica中创建一个3乘3的实际正交符号矩阵。 我怎么能这样做?

5 个答案:

答案 0 :(得分:11)

不是我推荐这个,而是......

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

所以q2是一个符号正交矩阵(假设我们在实数上工作)。

答案 1 :(得分:4)

我认为你似乎想在Mathematica中进行一些SO(3)组参数化。你将只有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,可以检查矩阵是否是正交的。

答案 2 :(得分:4)

我找到了一种强加特殊正交性的“直接”方式。 见下文。

(*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]]]

给出零矩阵。

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

这是我在问我的问题时所寻找的! 但是,让我知道你对这种方法的想法。

马塞勒斯

答案 3 :(得分:3)

马塞勒斯,你必须使用SO(3)的一些参数化,因为你的一般矩阵必须反映RP3 topology of the group。没有多值或奇点,没有单一的参数化将涵盖整个群体。维基百科有一个很好的页面,关于各种charts on SO(3)

概念上最简单的一个是李代数的指数映射(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

答案 4 :(得分:2)

虽然我真的很喜欢马塞勒斯回答他自己的问题,但这并不完全正确。不幸的是,他到达的条件也导致了

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.