Перейти к содержанию

Поворот Гивенса

Материал из Мегавики — свободной энциклопедии

Поворот Гивенса — в линейной алгебре линейный оператор поворота вектора на некоторый заданный угол.

Матрица Гивенса[1][2][3][править]

Матрица Гивенса Gkl имеет следующий вид:

Gkl=[10000cosϕsinϕ00sinϕcosϕ00001]

Данная матрица отличается от единичной матрицы только подматрицей

M(ϕ)=[cosϕsinϕsinϕcosϕ]

расположенной на строках и столбцах с номерами k и l. Является ортогональной.

Если дан вектор a=[a1an]Tn, s=ak2+al20, то выбрав

cosϕ=akak2+al2 sinϕ=alak2+al2

можно обнулить l-ую компоненту вектора a:[cosϕsinϕsinϕcosϕ][akal]=[cosϕaksinϕalsinϕak+cosϕal]=[ak2+al2ak2+al2alak+akalak2+al2]=[ak2+al20]

С помощью поворотов Гивенса можно вычислять QR-разложение матриц и приводить эрмитовы матрицы к диагональной форме, а матрицы общего вида к трёхдиагональной, треугольной или хессенберговской форме.

Использование матриц Гивенса для трёхдиагонализации[править]

Пусть хотим привести к трёхдиагональному виду симметричную матрицу: A=[a11a1pa1qa1nap1appapqapnaq1aqpaqqaqnan1anpanqann]

Где apq=aqp. Тогда домножим её на матрицу вращения Гивенса: G'pq(θ)AGpq(θ). G — транспонированная матрица. При этом изменятся только элементы app, apq и aqq

a'pp=c2app+2csapq+s2aqq

a'pq=sc(aqqapp)+(c2s2)apq

a'qq=s2app2csapq+c2aqq

Здесь штрих обозначает элемент возникающий после вращения. Выберем коэффициенты c и s так, чтобы обнулить недиагональный элемент и сохранить связь c и s с cosϕ и sinϕ

Тогда: ϕ=1/2tan1(2apq/(appaqq))

c=cosϕ

s=sinϕ

Такое вращение применяют последовательно, чтобы обнулить все элементы первой строки, кроме двух первых. То есть (1,2), (1,3), (1,4)...(1,n) Потом ко-второй строке (2,3),(2, 4)...(2,n)

Код на C++:

for (unsigned int i=0; i<N-1; ++i) 
    {
    for (unsigned int j=i+2; j<N; ++j)               
        {
            t = 2*matr[i][j]/(matr[i][i] - matr[j][j]);
            phi = 0.5 * atan(t);
            c = cos(phi);
            s = sin(phi);
 
            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[i][i] = bii;
            matr[i][j] = bij;
            matr[j][i] = bji;
            matr[j][j] = bjj;
        }
    }

Примечания[править]

  1. Тыртышников Е. Е. Методы численного анализа. — М., 2006. — С. 73-74.
  2. Björck, Åke, 1934-. Numerical methods for least squares problems. — Philadelphia: SIAM, 1996. — С. 121-123. — xvii, 408 pages с. — ISBN 0-89871-360-9, 978-0-89871-360-2.
  3. Demmel, James W. Applied numerical linear algebra. — Philadelphia: Society for Industrial and Applied Mathematics, 1997. — С. 53-56. — xi, 419 pages с. — ISBN 0-89871-389-7, 978-0-89871-389-3, 0-89871-361-7, 978-0-89871-361-9.