我需要在Mathematica中創建一個3乘3的真正正交矩陣。 我該怎麼做?在mathematica中創建一個符號正交矩陣
回答
不是我推薦這個,但是......
m = Array[a, {3, 3}];
{q, r} = QRDecomposition[m];
q2 = Simplify[q /. Conjugate -> Identity]
所以Q2是一個象徵性的正交矩陣(假設我們在實數工作)。
Daniel,謝謝你的回答。你認爲有什麼方法可以「直接」施加正交性的六個條件和det = 1的條件,而不涉及QR分解?謝謝。 Marcello – marcellus
我想你似乎想在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
在各種柱(或行)點產品。
Leonid,謝謝你的回答。我實際上想要定義一個通用符號SO(3)矩陣,而不是像歐拉角那樣從歐拉角開始。基本上我想設置一個通用矩陣(例如,使用mat = Table [Subscript [m,i,j],{i,3},{j,3}]),並強制該矩陣的元素總是被視爲滿足正交性條件和行列式= 1的條件,而不需要稍後再說明。 Marcello – marcellus
@ user1087909然後,丹尼爾的答案應該是要走的路。 –
奇怪的是,在回答我的意見/問題時,我想說獅子座是合適的方式。 –
馬塞勒斯,你必須使用一些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
與輸出 比較我已經找到了「直接」的方式徵收特別正交性。 見下文。
(*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]]]
給出了一個零矩陣。
============================================== ==========================
這就是當我問我的問題時,我正在尋找! 但是,讓我知道你對這種方法的想法。
馬塞勒斯
雖然我很喜歡馬塞勒斯答案的想法告訴了自己的問題,這是不完全正確的。不幸的是,他到達的條件也導致
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
- 1. 創建NxN矩陣mathematica
- 2. 在Mathematica中創建一個「視覺噪聲矩陣」
- 3. 在MATLAB中創建符號矩陣R2009b
- 4. 最簡單的方法來創建符號正交矩陣
- 5. 創建功能元素符號矩陣
- 6. 自動創建大型符號矩陣
- 7. 創建一個矩陣
- 8. 創建一個子矩陣
- 9. 在matlab中創建一個給定向量的正交矩陣的問題
- 10. 假設在Mathematica的零空間命令符號矩陣
- 11. 在matlab中創建一個非正方形的滿秩矩陣
- 12. Mathematica附加矩陣
- 13. 在子類上創建一個矩陣
- 14. 我想在一個nxm矩陣中創建一個五列的矩陣R
- 15. 如何在MATLAB中動態創建符號矩陣?
- 16. 正交矩陣numpy
- 17. 如何在Mathematica中重塑矩陣
- 18. 在Mathematica中獲得矩陣輸入
- 19. 在一個結構中創建一個矩陣
- 20. 如何創建一個十字交叉的對角矩陣
- 21. 使用unix命令創建一個nxn交替矩陣
- 22. 創建矩陣?
- 23. 創建矩陣
- 24. 創建矩陣
- 25. 交叉產品的對面:如何從兩個矩陣的交集創建一個新的矩陣?
- 26. 從零之間的現有矩陣創建一個新矩陣
- 27. 並排把矩陣側創建另一個矩陣
- 28. 從一個矩陣創建許多矩陣與循環?
- 29. 從一個較小的「鑰匙」矩陣創建矩陣
- 30. 從雙列創建一個術語頻矩陣出現矩陣
什麼樣的矩陣? Mathematica已經構建了旋轉和反射矩陣的函數,都是正交的。 – Niki
我想要建立一個符號矩陣,使得矩陣在連續計算中總是被視爲正交矩陣。 mathematica中的命令RotationMatrix不會執行此操作。 – marcellus
有一個關於科學計算堆棧交換的相關問題http://scicomp.stackexchange.com/questions/74/symbolic-software-packages-for-matrix-expressions – MRocklin