2011-12-08 26 views
6

我需要在Mathematica中創建一個3乘3的真正正交矩陣。 我該怎麼做?在mathematica中創建一個符號正交矩陣

+2

什麼樣的矩陣? Mathematica已經構建了旋轉和反射矩陣的函數,都是正交的。 – Niki

+0

我想要建立一個符號矩陣,使得矩陣在連續計算中總是被視爲正交矩陣。 mathematica中的命令RotationMatrix不會執行此操作。 – marcellus

+0

有一個關於科學計算堆棧交換的相關問題http://scicomp.stackexchange.com/questions/74/symbolic-software-packages-for-matrix-expressions – MRocklin

回答

11

不是我推薦這個,但是......

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

所以Q2是一個象徵性的正交矩陣(假設我們在實數工作)。

+0

Daniel,謝謝你的回答。你認爲有什麼方法可以「直接」施加正交性的六個條件和det = 1的條件,而不涉及QR分解?謝謝。 Marcello – marcellus

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在各種柱(或行)點產品。

+0

Leonid,謝謝你的回答。我實際上想要定義一個通用符號SO(3)矩陣,而不是像歐拉角那樣從歐拉角開始。基本上我想設置一個通用矩陣(例如,使用mat = Table [Subscript [m,i,j],{i,3},{j,3}]),並強制該矩陣的元素總是被視爲滿足正交性條件和行列式= 1的條件,而不需要稍後再說明。 Marcello – marcellus

+0

@ user1087909然後,丹尼爾的答案應該是要走的路。 –

+1

奇怪的是,在回答我的意見/問題時,我想說獅子座是合適的方式。 –

3

馬塞勒斯,你必須使用一些SO(3)的參數化,因爲你的一般矩陣必須反映RP3 topology of the group。沒有一個單一的參數化將覆蓋整個組,沒有多值性或奇異點。維基百科有關各種charts on SO(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 
+0

明確但真實 – acl

+0

優秀的答案。但是,我更喜歡直接定義一個滿足SO(3)條件的矩陣......請參閱上面的我的答案,並讓我知道您的想法。馬塞勒斯 – marcellus

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

給出了一個零矩陣。

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

這就是當我問我的問題時,我正在尋找! 但是,讓我知道你對這種方法的想法。

馬塞勒斯

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