我需要在Mathematica中创建一个3乘3的实际正交符号矩阵。 我怎么能这样做?
答案 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)
概念上最简单的一个是李代数的指数映射(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.