4 votos

diagonalización simultánea de matrices de conjuntos

Tengo un conjunto de matrices integrales cuadradas invertibles simétricas $A_i$ con $A_i^2=I$ (así también $A_i A_i^T=I$ ). Las matrices conmutan. Me gustaría asignarlas simultáneamente a un conjunto de matrices diagonales $D_i$ utilizando una matriz $C : C A_i C^{T}= D_i$ . El $D_i$ son las diagonales de los valores propios de $A_i$ en algún orden particular (sé que el $D_i$ ya). Sé que la diagonalización simultánea no es en general fácil, pero tal vez este caso especial tiene una solución inteligente. También me interesa si hay algo en GAP que pueda ayudar.

En este post anterior https://mathematica.stackexchange.com/questions/46949/is-there-a-built-in-procedure-for-simultaneous-diagonalization-of-a-set-of-commu la respuesta aceptada dice que se pueden tomar los vectores propios de una "combinación lineal aleatoria" de las matrices. Mis matrices son diagonalizables, por lo que se aplica la parte de la multiplicidad geométrica/aritmética. Este enfoque no es suficiente para lo que estoy haciendo; no hay garantía de que la combinación lineal sea la correcta; además, la probabilidad de éxito no parece tan alta para lo que he intentado.

5voto

ahulpke Puntos 2612

La diagonalización simultánea de un conjunto de matrices conmutadas es bastante fácil, ya que las matrices conmutan y preservan los espacios de las otras. Por lo tanto, encontrar una base de vectores propios para la primera matriz, y luego dividir cada espacio propio utilizando la segunda matriz y así sucesivamente. El siguiente código GAP hace esto:

# Arguments: Field, matrixlist
SimultaneousDiagonalization:=function(F,mats)
local bas,m,nbas,b,c,start,j,ev,eigen,ran,block;
  # basis so far: List of eigenspace bases
  bas:=[IdentityMat(Length(mats[1]),F)];
  for m in mats do
    nbas:=[];
    #rewrite m wrt the eigenspaces so far
    b:=Concatenation(bas);
    c:=b*m/b;
    start:=0;
    for j in bas do
      # now split this eigenspace
      ran:=[start+1..start+Length(j)];
      block:=c{ran}{ran};
      ev:=Eigenvalues(F,block);
      eigen:=List(ev,x->NullspaceMat(block-x*block^0));
      # and store the new spaces to use instead
      Append(nbas,List(eigen,k->k*j));
      start:=start+Length(j);
    od;
    bas:=nbas;
  od;
  return bas;
end;

Devuelve una lista de bases de los eigenspaces comunes. Así, si el resultado es B entonces con C:=Concatenation(B) , tienes que $C\cdot A_i\cdot C^{-1}$ es diagonal. Para obtener una matriz ortogonal, basta con ejecutar la ortonormalización de Gram-Schmidt en cada una de estas bases del eigespacio.

El resultado a menudo será feo, ya que GAP no trabaja naturalmente con números reales, por lo que no intento hacerlo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X