Rotación dada : en álgebra lineal , un operador lineal para rotar un vector en un ángulo dado .
La matriz de Givens tiene la siguiente forma:
Esta matriz difiere de la matriz identidad solo por la submatriz
ubicado en filas y columnas con números y . es ortogonal.
Si se da un vector , entonces eligiendo
porque ϕ = a k a k 2 + a yo 2 {\displaystyle \cos {\phi }={\frac {a_{k}}{\sqrt {a_{k}^{2}+a_{l}^{2))))} pecado ϕ = − a yo a k 2 + a yo 2 {\displaystyle \sin {\phi }={\frac {-a_{l}}{\sqrt {a_{k}^{2}+a_{l}^{2))))}puede establecer el componente th del vector a cero :
[ porque ϕ − pecado ϕ pecado ϕ porque ϕ ] [ a k a yo ] = [ porque ϕ ⋅ a k − pecado ϕ ⋅ a yo pecado ϕ ⋅ a k + porque ϕ ⋅ a yo ] = [ a k 2 + a yo 2 a k 2 + a yo 2 − a yo ⋅ a k + a k ⋅ a yo a k 2 + a yo 2 ] = [ a k 2 + a yo 2 0 ] {\displaystyle {\begin{bmatrix}\cos {\phi }&-\sin {\phi }\\\sin {\phi }&\cos {\phi }\end{bmatrix)){\begin{bmatrix} a_{k}\\a_{l}\end{bmatriz}}={\begin{bmatriz}\cos {\phi }\cdot a_{k}-\sin {\phi }\cdot a_{l}\\ \sin {\phi }\cdot a_{k}+\cos {\phi }\cdot a_{l}\end{bmatrix))={\begin{bmatrix}{\frac {a_{k}^{2} +a_{l}^{2}}{\sqrt {a_{k}^{2}+a_{l}^{2}}}}\\{\frac {-a_{l}\cdot a_{k }+a_{k}\cdot a_{l}}{\sqrt {a_{k}^{2}+a_{l}^{2}}}}\end{bmatrix}}={\begin{bmatrix} {\sqrt {a_{k}^{2}+a_{l}^{2}}}\\0\end{bmatriz}}}Usando las rotaciones de Givens, se puede calcular la descomposición QR de matrices y dibujar matrices hermitianas en una forma tridiagonal .
Queremos reducir una matriz simétrica a una forma tridiagonal:
donde _ Luego lo multiplicamos por la matriz de rotación de Givens: . es la matriz transpuesta. Esto cambiará solo los elementos , y
Aquí el primo denota el elemento que aparece después de la rotación. Elijamos los coeficientes y para que el elemento fuera de la diagonal se haga cero y la relación entre y con y
Después:
Tal rotación se aplica secuencialmente para poner a cero todos los elementos de la primera fila, excepto los dos primeros. Es decir, (1,2), (1,3), (1,4)...(1,n) Entonces la co-segunda línea (2,3),(2, 4)...(2 ,n)
Código C++:
para ( sin signo int i = 0 ; i < N -1 ; ++ i ) { for ( sin signo int j = i + 2 ; j < N ; ++ j ) { t = 2 * matr [ i ][ j ] / ( matr [ i ][ i ] - matr [ j ][ j ]); phi = 0.5 * atán ( t ); c = cos ( fi ); s = pecado ( fi ); bii = c * c * matr [ i ][ i ] + 2 * c * s * matr [ i ][ j ] + s * s * matr [ j ][ j ]; bij = s * c * ( matr [ j ][ j ] - matr [ i ][ i ]) + matr [ i ][ j ] * ( c * c - s * s ); bjj = s * s * matr [ i ][ i ] + c * c * matr [ j ][ j ] - 2 * c * s * matr [ i ][ j ]; bji = bij ; matr [ yo ][ yo ] = bii ; matr [ yo ] [ j ] = bij ; matr [ j ][ i ] = bji ; matr [ j ][ j ] = bjj ; } }