2011-12-08 20 views
6

में एक प्रतीकात्मक ऑर्थोनॉर्मल मैट्रिक्स बनाएं, मुझे गणित में 3 से 3 वास्तविक ऑर्थोनॉर्मल प्रतीकात्मक मैट्रिक्स बनाने की आवश्यकता है। मैं ऐसा कैसे कर सकता हूं?गणित

+2

मैट्रिक्स किस तरह का है: यहाँ एक दृष्टिकोण है कि दोनों सही और अधिक प्रत्यक्ष है? गणित रोटेशन और प्रतिबिंब मैट्रिस के लिए कार्यों में बनाया गया है, दोनों ऑर्थोनॉर्मल हैं। – Niki

+0

मैं एक प्रतीकात्मक मैट्रिक्स बनाना चाहता हूं, जैसे मैट्रिक्स को लगातार गणनाओं में हमेशा ऑर्थोनॉर्मल मैट्रिक्स के रूप में माना जाएगा। गणित में 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 एक प्रतीकात्मक orthogonal मैट्रिक्स है (यह मानते हुए हम reals से अधिक काम करते हैं)।

+0

डैनियल, आपके उत्तर के लिए धन्यवाद। क्या आप QRDecomposition को शामिल किए बिना, ऑर्थोनर्मलिटी की छः स्थितियों और det = 1 की स्थिति को "सीधे" लगाने का कोई तरीका देखते हैं? धन्यवाद। मार्सेलो – marcellus

4

आपको लगता है कि गणित में कुछ SO(3) समूह पैरामीट्रिजेशन चाहिए। आपके पास केवल 3 स्वतंत्र प्रतीकों (चर) होंगे, क्योंकि आपके पास वैक्टरों की आपसी औपचारिकता और 1 के बराबर मानदंडों से 6 बाधाएं हैं। एक तरीका है 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}}]]; 

यह इस तरह होता है: विभिन्न स्तंभ पर Simplify का उपयोग करके

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

आप देख सकते हैं कि मैट्रिक्स orthonormal है, (यहाँ (शायद बहुत जटिल) ऐसा करने के लिए कोड है या पंक्ति) डॉट उत्पादों।

+0

लियोनिद, आपके उत्तर के लिए धन्यवाद। मैं वास्तव में यूलर कोण से शुरू किए बिना, एक सामान्य प्रतीकात्मक SO (3) मैट्रिक्स को परिभाषित करना चाहता हूं। असल में मैं एक जेनेरिक मैट्रिक्स सेट करना चाहता हूं (उदाहरण के लिए मैट = टेबल [सब्सक्रिप्शन [एम, आई, जे], {i, 3}, {j, 3}] का उपयोग करना) और इस मैट्रिक्स के तत्वों को हमेशा के रूप में माना जाएगा बाद में इसे निर्दिष्ट करने की आवश्यकता के बिना, औपचारिकता की स्थिति और निर्धारक = 1 शर्त को संतुष्ट करना। मार्सेलो – marcellus

+0

@ user1087909 फिर, डैनियल का जवाब जाने का रास्ता होना चाहिए। –

+1

मेरे नीचे टिप्पणी/प्रश्न का जवाब देने में आश्चर्यजनक रूप से पर्याप्त, मैं यह कहने जा रहा था कि लियोनिद उचित तरीका था। –

3

मार्सेलस, आपको SO (3) के कुछ पैरामीट्रिजेशन का उपयोग करना होगा, क्योंकि आपके सामान्य मैट्रिक्स को RP3 topology of the group को प्रतिबिंबित करना होगा। कोई एकल पैरामीट्रिजेशन पूरे समूह को बहुविकल्पीयता या एकवचन बिंदुओं के बिना कवर नहीं करेगा। विकिपीडिया के विभिन्न charts on SO(3) के बारे में एक अच्छा पृष्ठ है।

शायद अवधारणात्मक रूप से सबसे सरल लेई बीजगणित से घातीय नक्शा है (3)। एक antisymmetric को परिभाषित करें, असली A (जो spans तो (3))

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

फिर MatrixExp[A]SO(3) का एक तत्व है। हम जांच कर सकते हैं कि यह ऐसा है, अगर हम t^2 = a^2 + b^2 + c^2 लिखने

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

का उपयोग कर, हम नीचे

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

को नोट मैट्रिक्स घातीय को आसान बनाने में कर सकते हैं कि इस मूलतः एक ही parametrization है RotationMatrix देता है के रूप में। उत्पादन के साथ तुलना करें से

RotationMatrix[s, {b, c, a}] // ComplexExpand // Simplify[#, Trig -> False] &; 
% /. a^2 + b^2 + c^2 -> 1 
+0

स्पष्ट लेकिन सही – acl

+0

उत्कृष्ट उत्तर। हालांकि, मैं एसओ (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.