En álgebra lineal numérica , el algoritmo de valores propios de Jacobi es un método iterativo para el cálculo de los valores y vectores propios de una matriz simétrica real (un proceso conocido como diagonalización ). Recibe su nombre de Carl Gustav Jacob Jacobi , quien propuso el método por primera vez en 1846, [ 1 ] pero no se popularizó hasta la década de 1950 con la llegada de las computadoras. [ 2 ]
Este algoritmo es intrínsecamente un algoritmo para matrices densas : obtiene poca o ninguna ventaja al aplicarse a una matriz dispersa, y destruirá la dispersión al generar relleno. Del mismo modo, no preservará estructuras como la disposición en bandas de la matriz sobre la que opera.
Descripción
Dejarsea una matriz simétrica ySea una matriz de rotación de Givens . Entonces:
es simétrico y similar a.
Además,tiene entradas:
dóndey.
Desdees ortogonal,ytienen la misma norma de Frobenius(la raíz cuadrada de la suma de los cuadrados de todos los componentes), sin embargo podemos elegirde tal manera que, en cuyo casotiene una suma de cuadrados mayor en la diagonal:
Establezca esto igual a 0 y reorganice:
si
Para optimizar este efecto, S ij debe ser el elemento fuera de la diagonal con el mayor valor absoluto , llamado pivote .
El método de valores propios de Jacobi realiza rotaciones repetidamente hasta que la matriz se vuelve casi diagonal. Entonces , los elementos de la diagonal son aproximaciones de los valores propios (reales) de S.
Convergencia
Si es un elemento pivote , entonces por definición para . Dejardenota la suma de los cuadrados de todas las entradas fuera de la diagonal de. Desdetiene exactamente elementos fuera de la diagonal, tenemos o. AhoraEsto implica o ; es decir, la secuencia de rotaciones de Jacobi converge al menos linealmente por un factor a una matriz diagonal .
Una serie deLas rotaciones de Jacobi se llaman barrido;denotemos el resultado. La estimación anterior arroja
- ;
es decir, la secuencia de barridos converge al menos linealmente con un factor ≈.
Sin embargo, el siguiente resultado de Schönhage [ 3 ] produce una convergencia cuadrática local. Para ello, supongamos que S tiene m autovalores distintos. con multiplicidades y sea d > 0 la distancia más pequeña entre dos autovalores diferentes. Llamemos a un número de
Jacobi gira un barrido de Schönhage. Si denota el resultado entonces
- :=\Gamma (S)} .
Por lo tanto, la convergencia se vuelve cuadrática tan pronto como
Costo
Cada rotación de Givens se puede realizar enpasos cuando se conoce el elemento pivote p . Sin embargo , la búsqueda de p requiere la inspección de todos los N ≈ 1 / 2 n 2 elementos fuera de la diagonal, lo que significa que esta búsqueda domina la complejidad general y empuja la complejidad computacional de un barrido en el algoritmo clásico de Jacobi a . Los algoritmos competidores alcanzancomplejidad para una diagonalización completa.
Máximos de filas en caché
Podemos reducir la complejidad de encontrar el elemento pivote de O( N ) a O( n ) si introducimos un array de índices adicional. con la propiedad que es el índice del elemento más grande en la fila i , ( i = 1, ..., n − 1) de la S actual . Entonces los índices del pivote ( k , l ) deben ser uno de los pares . Además, la actualización del array de índices se puede realizar con una complejidad promedio de O( n ) : Primero, se puede encontrar la entrada máxima en las filas actualizadas k y l en O( n ) pasos. En las demás filas i , solo cambian las entradas en las columnas k y l . Iterando sobre estas filas, sino es ni k ni l , basta con comparar el antiguo máximo ena las nuevas entradas y actualizaciónsi es necesario. Sidebe ser igual a k o l y la entrada correspondiente disminuyó durante la actualización, el máximo sobre la fila i debe encontrarse desde cero con una complejidad de O( n ). Sin embargo, esto sucederá en promedio solo una vez por rotación. Por lo tanto, cada rotación tiene una complejidad de O( n ) y un barrido de O( n³ ) en el caso promedio, lo que equivale a una multiplicación de matrices . Además , debe inicializarse antes de que comience el proceso, lo cual se puede hacer en n 2 pasos.
Normalmente, el método de Jacobi converge dentro de la precisión numérica después de un pequeño número de barridos. Tenga en cuenta que los valores propios múltiples reducen el número de iteraciones ya que.
Jacobi cíclico y paralelo
Un enfoque alternativo consiste en prescindir por completo de la búsqueda y simplemente hacer que cada barrido pivote cada elemento fuera de la diagonal una vez, en un orden predeterminado. Se ha demostrado que este algoritmo de Jacobi cíclico alcanza la convergencia cuadrática, [ 4 ] [ 5 ] al igual que el algoritmo de Jacobi clásico.
La oportunidad de paralelización que es particular de Jacobi se basa en combinar Jacobi cíclico con la observación de que las rotaciones de Givens para conjuntos disjuntos de índices conmutan, de modo que se pueden aplicar varias en paralelo. Concretamente, sipivotes entre índicesypivotes entre índices, luego desigueporque en informáticaoelLa rotación solo necesita acceder a las filas.y elLa rotación solo necesita acceder a las filas.Dos procesadores pueden realizar ambas rotaciones en paralelo, ya que no se accede a ningún elemento de la matriz en ambas.
La partición del conjunto de pares de índices de un barrido en clases disjuntas por pares es equivalente a particionar el conjunto de aristas de un grafo completo en emparejamientos , lo que es lo mismo que colorear sus aristas; cada clase de color se convierte entonces en una ronda dentro del barrido. El número mínimo de rondas es el índice cromático del grafo completo, y es igual apara imparperoinclusoUna regla simple para números impares.es manejar los paresyen la misma ronda si. Inclusouno puede crearrondasdonde un parparaentra en ronday además un parparaentra en rondaEsto reduce la complejidad temporal de un barrido.a, siHay procesadores disponibles.
Una ronda consistiría en que cada procesador primero calcularapara su rotación, y luego aplicando la rotación desde la izquierda (rotando entre filas). A continuación, los procesadores se sincronizan antes de aplicar la rotación transpuesta desde la derecha (rotando entre columnas), y finalmente se sincronizan de nuevo. Dos procesadores pueden acceder a un elemento de la matriz durante una ronda, pero no ambos durante la misma mitad de dicha ronda.
Es posible lograr una mayor paralelización dividiendo el trabajo de una sola rotación entre varios procesadores, pero eso podría resultar demasiado complejo para ser práctico.
Algoritmo
El siguiente algoritmo es una descripción del método de Jacobi en notación matemática. Calcula un vector e que contiene los valores propios y una matriz E que contiene los vectores propios correspondientes; es decir, es un valor propio y la columna un vector propio ortonormal para, i = 1, ..., n .
procedimiento jacobi( S ∈ R n × n ; salida e ∈ R n ; salida E ∈ R n × n ) var i , k , l , m , estado ∈ N s , c , t , p , y , d , r ∈ R ind ∈ N n cambiado ∈ L nfunción maxind( k ∈ N ) ∈ N ! índice del elemento fuera de la diagonal más grande en la fila k m := k +1 para i := k +2 hasta n hacer si │ S ki │ > │ S km │ entonces m := i fin si fin para devolver m fin funciónprocedimiento update( k ∈ N ; t ∈ R ) ! actualizar e k y su estado y := e k ; e k := y + t si ha cambiado k y ( y = e k ) entonces ha cambiado k := falso; estado := estado −1 si no si (no ha cambiado k ) y ( y ≠ e k ) entonces ha cambiado k := verdadero; estado := estado +1 fin si finprocprocedimiento rotate( k , l , i , j ∈ N ) ! realizar rotación de S ij , S kl ┌ ┐ ┌ ┐┌ ┐ │ S kl │ │ c − s ││ S kl │ │ │ := │ ││ │ │ S ij │ │ s c ││ S ij │ └ ┘ └ ┘└ ┘ proceso final ! inicializar e, E y los arreglos ind, cambiado E := I ; estado := n para k := 1 a n hacer ind k := maxind( k ); e k := S kk ; cambiado k := verdadero fin para mientras estado ≠0 hacer ! siguiente rotación m := 1 ! encontrar índice (k,l) del pivote p para k := 2 a n −1 hacer si │ S k ind k │ > │ S m ind m │ entonces m := k fin si fin para k := m ; l := ind m ; p := S kl ! calcular c = cos φ, s = sin φ y := ( e l − e k )/2; d := │ y │+√( p 2 + y 2 ) r := √( p 2 + d 2 ); c := d / r ; s := p / r ; t := p 2 / d if y <0 then s := − s ; t := − t endif S kl := 0.0; update( k ,− t ); update( l , t ) ! rotar filas y columnas k y l para i := 1 a k −1 hacer rotate( i , k , i , l ) fin para para i := k +1 a l −1 hacer rotate( k , i , i , l ) fin para para i := l +1 a n hacer rotate( k , i , l , i ) fin para ! rotar vectores propios para i := 1 a n hacer ┌ ┐ ┌ ┐┌ ┐ │ E ik │ │ c − s ││ E ik │ │ │ := │ ││ │ │ E il │ │ s c ││ E il │ └ ┘ └ ┘└ ┘ fin del bucle ! actualizar todos los ind i potencialmente cambiados para i := 1 a n hacer ind i := maxind( i ) fin del bucle fin del proceso
Notas
1. El arreglo lógico cambiado contiene el estado de cada valor propio. Si el valor numérico de o cambios durante una iteración, el componente correspondiente de cambiado se establece en verdadero , de lo contrario en falso . El estado entero cuenta el número de componentes de cambiado que tienen el valor verdadero . La iteración se detiene tan pronto como estado = 0. Esto significa que ninguna de las aproximaciones Su valor ha cambiado recientemente, por lo que es poco probable que esto ocurra si la iteración continúa. Aquí se asume que las operaciones de punto flotante se redondean de forma óptima al número de punto flotante más cercano.
2. El triángulo superior de la matriz S se destruye mientras que el triángulo inferior y la diagonal permanecen sin cambios. Por lo tanto, es posible restaurar S si es necesario de acuerdo con
para k := 1 a n −1 hacer ! restaurar matriz S para l := k +1 a n hacer S kl := S lk fin para fin para
3. Los valores propios no tienen por qué estar en orden descendente. Esto se puede lograr mediante un algoritmo de ordenación sencillo.
para k := 1 a n −1 hacer m := k para l := k +1 a n hacer si e l > e m entonces m := l fin si fin para si k ≠ m entonces intercambiar e m , e k intercambiar E m , E k fin si fin para
4. El algoritmo está escrito utilizando notación matricial (matrices basadas en 1 en lugar de basadas en 0).
5. Al implementar el algoritmo, la parte especificada mediante notación matricial debe realizarse simultáneamente.
6. Esta implementación no contempla correctamente el caso en que una dimensión sea un subespacio independiente. Por ejemplo, si se proporciona una matriz diagonal, la implementación anterior nunca terminará, ya que ninguno de los valores propios cambiará. Por lo tanto, en implementaciones reales, se debe agregar lógica adicional para tener en cuenta este caso.
Ejemplo
Dejar
Luego, Jacobi produce los siguientes valores propios y vectores propios después de 3 barridos (19 iteraciones) :
Aplicaciones para matrices simétricas reales
Cuando se conocen los valores propios (y los vectores propios) de una matriz simétrica, los siguientes valores se calculan fácilmente.
- Valores singulares
- Los valores singulares de una matriz (cuadrada)son las raíces cuadradas de los valores propios (no negativos) deEn caso de una matriz simétricatenemos de, por lo tanto los valores singulares deson los valores absolutos de los valores propios de.
- norma 2 y radio espectral
- La norma 2 de una matriz A es la norma basada en la norma vectorial euclidiana; es decir, el valor más grandecuando x recorre todos los vectores conEs el valor singular más grande de. En el caso de una matriz simétrica, es el mayor valor absoluto de sus autovectores y, por lo tanto, igual a su radio espectral .
- Número de condición
- El número de condición de una matriz no singularse define como En el caso de una matriz simétrica, es el valor absoluto del cociente del mayor y el menor valor propio. Las matrices con números de condición grandes pueden causar resultados numéricamente inestables: una pequeña perturbación puede generar grandes errores. Las matrices de Hilbert son las matrices mal condicionadas más conocidas. Por ejemplo, la matriz de Hilbert de cuarto orden tiene una condición de 15514, mientras que para el orden 8 es 2,7 × 10⁸ .
- Rango
- Una matriztiene rangosi tienecolumnas que son linealmente independientes mientras que las columnas restantes dependen linealmente de estas. De manera equivalente,es la dimensión del rango de Además, es el número de valores singulares distintos de cero.
- En el caso de una matriz simétrica, r representa el número de autovalores distintos de cero. Desafortunadamente, debido a errores de redondeo, las aproximaciones numéricas de autovalores cero pueden no serlo (también puede ocurrir que una aproximación numérica sea cero mientras que el valor real no lo sea). Por lo tanto, solo se puede calcular el rango numérico decidiendo cuáles de los autovalores están lo suficientemente cerca de cero.
- Pseudoinversa
- La pseudoinversa de una matrizes la matriz únicapara quéyson simétricas y para las cualesse sostiene. Sies no singular, entonces.
- Cuando se llama al procedimiento jacobi (S, e, E), entonces la relacióndonde Diag( e ) denota la matriz diagonal con el vector e en la diagonal. Seadenotemos el vector donde es reemplazado porsi y por 0 si es (numéricamente cercano a) cero. Dado que la matriz E es ortogonal, se deduce que la pseudoinversa de S viene dada por .
- Solución de mínimos cuadrados
- Si matriz no tiene rango completo, puede que no haya solución del sistema lineal . Sin embargo, se puede buscar un vector x para el cual es mínimo. La solución es. En el caso de una matriz simétrica S como antes, se tiene.
- exponencial matricial
- Deuno encuentradonde exp es el vector dondees reemplazado por. Del mismo modo, se puede calcular de forma obvia para cualquier función (analítica).
- Ecuaciones diferenciales lineales
- La ecuación diferencial tiene la soluciónPara una matriz simétricaDe ello se deduce que . Si es la expansión de por los autovectores de, entonces.
- Dejar sea el espacio vectorial generado por los autovectores deque corresponden a un valor propio negativo yDe forma análoga para los autovalores positivos. Si entonces; es decir, el punto de equilibrio 0 es atractivo para. Sientonces; es decir, 0 es repulsivo a .yse denominan variedades estables e inestables para. SiSi tiene componentes en ambas variedades, entonces un componente es atraído y el otro repelido. Por lo tantoaprochescomo.
Implementación de Julia
El siguiente código es una implementación directa de la descripción matemática del algoritmo de valores propios de Jacobi en el lenguaje de programación Julia .
usando Álgebra Lineal , Pruebafunción find_pivot ( Sprime ) n = tamaño ( Sprime , 1 ) pivot_i = pivot_j = 0 pivot = 0.0para j = 1 : n para i = 1 : ( j - 1 ) si abs ( Sprime [ i , j ]) > pivote pivote_i = i pivote_j = j pivote = abs ( Sprime [ i , j ]) fin fin findevolver ( pivot_i , pivot_j , pivot ) fin# En la práctica, no se debe instanciar explícitamente la función de matriz de rotación de Givens givens_rotation_matrix ( n , i , j , θ ) G = Matrix { Float64 }( I ,( n , n )) G [ i , i ] = G [ j , j ] = cos ( θ ) G [ i , j ] = sin ( θ ) G [ j , i ] = - sin ( θ ) return G end# S es una matriz simétrica n por n n = 4 sqrtS = randn ( n , n ); S = sqrtS * sqrtS ' ;# el elemento fuera de la diagonal más grande permitido de U' * S * U # donde U son los vectores propios tol = 1e-14Sprime = copiar ( S ) U = Matriz { Float64 }( I ,( n , n ))mientras sea verdadero ( pivot_i , pivot_j , pivot ) = encontrar_pivote ( Sprime )si pivot < tol break finθ = atan ( 2 * Sprime [ pivote_i , pivot_j ] / ( Sprime [ pivote_j , pivot_j ] - Sprime [ pivote_i , pivot_i ] )) / 2G = givens_rotation_matrix ( n , pivot_i , pivot_j , θ )# actualizar Sprime y U Sprime .= G '* Sprime * G U .= U * G fin# Sprime ahora es (casi) una matriz diagonal # extraer valores propios λ = diag ( Sprime )# Ordenar los valores propios (y los vectores propios correspondientes U) por valores crecientes i = sortperm ( λ ) λ = λ [ i ] U = U [ : , i ]# S debería ser igual a U * diagm(λ) * U' @test S ≈ U * diagm ( λ ) * U 'Generalizaciones
El método de Jacobi se ha generalizado a matrices hermíticas complejas , matrices reales y complejas no simétricas generales, así como a matrices por bloques.
Dado que los valores singulares de una matriz real son las raíces cuadradas de los valores propios de la matriz simétricaTambién se puede utilizar para el cálculo de estos valores. Para este caso, el método se modifica de tal manera que S no debe calcularse explícitamente, lo que reduce el peligro de errores de redondeo . Tenga en cuenta que con .
Referencias
- ↑ Jacobi, CGJ (1846). "Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen" . Diario de Crelle (en alemán). 1846 (30): 51– 94. doi : 10.1515/crll.1846.30.51 . S2CID 199546177 .
- ↑ Golub, GH ; van der Vorst, HA (2000). "Cálculo de valores propios en el siglo XX" . Journal of Computational and Applied Mathematics . 123 ( 1–2 ): 35–65 . doi : 10.1016/S0377-0427(00)00413-1 .
- ^ Schönhage, A. (1964). "Zur quadratischen Konvergenz des Jacobi-Verfahrens". Numerische Mathematik (en alemán). 6 (1): 410– 412. doi : 10.1007/BF01386091 . SEÑOR 0174171 . S2CID 118301078 .
- ↑ Wilkinson, JH (1962). "Nota sobre la convergencia cuadrática del proceso cíclico de Jacobi". Numerische Mathematik . 6 : 296– 300. doi : 10.1007/BF01386321 .
- ↑ van Kempen, HPM (1966). "Sobre la convergencia cuadrática del método cíclico especial de Jacobi". Numerische Mathematik . 9 : 19– 22. doi : 10.1007/BF02165225 .
Lecturas adicionales
- Press, WH; Teukolsky, SA; Vetterling, WT; Flannery, BP (2007), "Sección 11.1. Transformaciones de Jacobi de una matriz simétrica" , Numerical Recipes: The Art of Scientific Computing (3.ª ed.), Nueva York: Cambridge University Press, ISBN 978-0-521-88068-8Archivado del original el 11 de agosto de 2011 , consultado el 13 de agosto de 2011.
- Rutishauser, H. (1966). "Serie de manuales de álgebra lineal: el método de Jacobi para matrices simétricas reales". Matemática numérica . 9 (1): 1– 10. doi : 10.1007/BF02165223 . SEÑOR 1553948 . S2CID 120520713 .
- Sameh, AH (1971). "Sobre los algoritmos de Jacobi y similares a Jacobi para una computadora paralela" . Matemáticas de la Computación . 25 (115): 579– 590. doi : 10.1090/s0025-5718-1971-0297131-6 . JSTOR 2005221. MR 0297131 .
- Shroff, Gautam M. (1991). "Un algoritmo paralelo para los valores propios y vectores propios de una matriz compleja general". Numerische Mathematik . 58 (1): 779– 805. CiteSeerX 10.1.1.134.3566 . doi : 10.1007/BF01385654 . MR 1098865 . S2CID 13904356 .
- Veselić, K. (1979). "Sobre una clase de procedimientos tipo Jacobi para diagonalizar matrices reales arbitrarias". Numerische Mathematik . 33 (2): 157– 172. doi : 10.1007/BF01399551 . MR 0549446 . S2CID 119919630 .
- Veselić, K.; Wenzel, HJ (1979). "Un método tipo Jacobi de convergencia cuadrática para matrices reales con valores propios complejos". Numerische Mathematik . 33 (4): 425– 435. doi : 10.1007/BF01399324 . MR 0553351 . S2CID 119554420 .
- Yousef Saad: "Revisando el método de rotación de subespacios de Jacobi (en bloques) para el problema de valores propios simétricos", Numerical Algorithms, vol. 92 (2023), pp. 917-944. https://doi.org/10.1007/s11075-022-01377-w .
Enlaces externos
- Implementación en Matlab del algoritmo de Jacobi que evita las funciones trigonométricas.
- Implementación en C++11
- Álgebra lineal numérica