2011-12-08 23 views
6

Necesito crear una matriz simbólica ortonormal real de 3 por 3 en Mathematica. ¿Cómo puedo hacerlo?Crear una matriz ortonormal simbólica en mathematica

+2

¿Qué tipo de matriz? Mathematica ha incorporado funciones para matrices de rotación y reflexión, ambas son ortonormales. – Niki

+0

Quiero construir una matriz simbólica, de modo que la matriz siempre se tratará como una matriz ortonormal, en cálculos sucesivos. El comando RotationMatrix en mathematica NO hace esto. – marcellus

+0

Hay una pregunta relacionada en el stackcchange de computación científica http://scicomp.stackexchange.com/questions/74/symbolic-software-packages-for-matrix-expressions – MRocklin

Respuesta

11

No es que me recomiendan esto, pero ...

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

Así Q2 es una matriz ortogonal simbólica (suponiendo que trabajamos más reales).

+0

Daniel, gracias por su respuesta. ¿Ves alguna forma de "directamente" imponer las seis condiciones de ortonormalidad y la condición de det = 1, sin involucrar QRDecomposition? Gracias. Marcello – marcellus

4

Parece que quiere un poco de parametrización de grupo SO(3) en Mathematica, creo. Solo tendrá 3 símbolos independientes (variables), ya que tiene 6 restricciones de la ortogonalidad mutua de vectores y las normas iguales a 1. Una forma es construir rotaciones independientes alrededor de los 3 ejes y multiplicar esas matrices. Aquí está el (tal vez demasiado complejo) código para hacer que:

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

aquí es cómo funciona esto:

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

se puede comprobar que la matriz es ortonormal, utilizando Simplify sobre los diferentes columna (o fila) dot productos.

+0

Leonid, gracias por su respuesta. De hecho, quiero definir una matriz simbólica SO (3) genérica, sin comenzar desde los ángulos de Euler como lo hace. Básicamente, quiero establecer una matriz genérica (por ejemplo, usando mat = Table [Subíndice [m, i, j], {i, 3}, {j, 3}]) e imponer que los elementos de esta matriz se tratarán siempre como satisfaciendo las condiciones de ortonormalidad y la condición determinante = 1, sin la necesidad de especificar esto más adelante. Marcello – marcellus

+0

@ user1087909 Entonces, la respuesta de Daniel debería ser el camino a seguir. –

+1

Por extraño que parezca, respondiendo al comentario/pregunta debajo de la mía, iba a decir que Leonid era la manera apropiada. –

3

Marcellus, tiene que usar alguna parametrización de SO (3), ya que su matriz general tiene que reflejar el RP3 topology of the group. Ninguna parametrización única cubrirá a todo el grupo sin valores múltiples o puntos singulares. Wikipedia tiene una buena página sobre los diversos charts on SO(3).

Tal vez uno de los conceptualmente más simple es el mapa exponencial del álgebra de Lie así que (3). definir un antisimétrica, bienes A (que se extiende de modo (3))

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

Entonces MatrixExp[A] es un elemento de SO(3). Podemos comprobar que esto es así, el uso de

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

Si escribimos t^2 = a^2 + b^2 + c^2, podemos simplificar la matriz exponencial hasta

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

Tenga en cuenta que esto es básicamente la misma parametrización como RotationMatrix da. Comparar con la salida de

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

Explícito pero verdadero – acl

+0

Excelente respuesta. Sin embargo, prefiero definir una matriz que satisfaga las condiciones SO (3) de manera más directa ... vea mi respuesta anterior, y dígame qué opina. Marcellus – marcellus

4

he encontrado una manera "directa" para imponer ortogonalidad especial. Ver a continuación.

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

Entonces

Simplify[Det[mat]] 

da 1; ... y

MatrixForm[Simplify[mat.Transpose[mat]] 

da la matriz de identidad; ... finalmente

MatrixForm[Simplify[CofactorMatrix[mat] - Transpose[mat]]] 

da una matriz cero.

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

¡Esto es lo que estaba buscando cuando hice mi pregunta! Sin embargo, déjame saber tu opinión sobre este método.

Marcelo

2

Aunque me gusta mucho la idea de la respuesta de Marcelo a su propia pregunta, no es del todo correcta. Lamentablemente, las condiciones a las que llega también dan como resultado

Simplify[Transpose[mat] - mat] 

evaluando a una matriz cero! Esto claramente no es correcto. He aquí un enfoque que a la vez correcta y más directo:

OrthogonalityConditions[m_List?MatrixQ] := Thread[Flatten[m.Transpose[m]] == Flatten[IdentityMatrix[3]]]; 
SO3Conditions[m_List?MatrixQ] := Flatten[{OrthogonalityConditions[m], Det[m] == 1}]; 

es decir, la multiplicación de una matriz de rotación por sus resultados de transposición de la matriz identidad, y el determinante de una matriz de rotación es de 1.