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
Respuesta
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).
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
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.
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
@ user1087909 Entonces, la respuesta de Daniel debería ser el camino a seguir. –
Por extraño que parezca, respondiendo al comentario/pregunta debajo de la mía, iba a decir que Leonid era la manera apropiada. –
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
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
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.
- 1. ¿Cómo declaro una matriz simbólica en Octave?
- 2. crear una referencia simbólica git en el repositorio remoto
- 3. muy bien imprimir una matriz en mathematica
- 4. Cómo rastrear una ruta gráficamente en una matriz en mathematica
- 5. Ordenar una matriz por columna de fecha textual en Mathematica
- 6. Python matemática simbólica?
- 7. Evaluar la expresión simbólica
- 8. Cambiar las diagonales de una matriz con Mathematica
- 9. Cómo crear libretas con pestañas de Mathematica
- 10. Suposiciones en el comando NullSpace de Mathematica para matrices simbólicas
- 11. Inverso de una matriz en SymPy?
- 12. Crear una matriz de símbolos
- 13. Cómo crear una matriz dinámica
- 14. Cómo crear una matriz JSON en Java
- 15. Crear dinámicamente una matriz en C#
- 16. Crear (y acceder) una matriz en MIPS
- 17. ¿Cómo crear una matriz en JSF EL?
- 18. Crear una matriz multidimensional en vb.net
- 19. crear una matriz multidimensional en un bucle
- 20. Crear una lista/matriz en XSLT
- 21. ¿Crear una matriz en plantilla inteligente?
- 22. Crear una matriz de objetos en jQuery
- 23. Mezclar una lista en Mathematica
- 24. Integración simbólica en Python usando Sympy
- 25. Representación semántica (o simbólica) de la música
- 26. Obtener matriz del archivo de texto en Mathematica
- 27. Obteniendo una imagen de Mathematica en Java
- 28. Cómo remodelar matrices en Mathematica
- 29. Mathematica .Net/Link en una aplicación Asp.Net
- 30. Redefinir no conmutativa multiplicación en Mathematica Mathematica
¿Qué tipo de matriz? Mathematica ha incorporado funciones para matrices de rotación y reflexión, ambas son ortonormales. – Niki
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
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