Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Строка 22: Строка 22:
 
<math>
 
<math>
 
\begin{align}
 
\begin{align}
J_i = \begin{matrix} \\ \\ j \\ \\ \\ \\ \\k  \\ \\ \end{matrix}  \begin{bmatrix} & 1 & & & & & & & & \\ & & 1 & & & & & & & \\ & & & \ddots & & & & & & \\ & & & & \cos(\theta) & & -\sin(\theta) & & & \\ & & & & & \ddots & & & & \\ & & & & \sin(\theta) & & \cos(\theta) & & & \\ & & & & & & & \ddots & & \\ & & & & & & & & 1 & \\ & & & & & & & & & 1 \\ \end{bmatrix}
+
J_i = R(j,k,\theta) = \begin{matrix} \\ \\ j \\ \\ \\ \\ \\k  \\ \\ \end{matrix}  \begin{bmatrix} & 1 & & & & & & & & \\ & & 1 & & & & & & & \\ & & & \ddots & & & & & & \\ & & & & \cos(\theta) & & -\sin(\theta) & & & \\ & & & & & \ddots & & & & \\ & & & & \sin(\theta) & & \cos(\theta) & & & \\ & & & & & & & \ddots & & \\ & & & & & & & & 1 & \\ & & & & & & & & & 1 \\ \end{bmatrix}
 
\end{align}
 
\end{align}
 
</math>
 
</math>
Строка 47: Строка 47:
 
Решая квадратное уравнение, получим:
 
Решая квадратное уравнение, получим:
 
<math>t=\dfrac{\operatorname{sign}\tau}{\left|\tau\right|+\sqrt{1+\tau^2}}, c=\dfrac{1}{\sqrt{1+t^2}}, s=t\cdot c.</math>
 
<math>t=\dfrac{\operatorname{sign}\tau}{\left|\tau\right|+\sqrt{1+\tau^2}}, c=\dfrac{1}{\sqrt{1+t^2}}, s=t\cdot c.</math>
 +
 
== Вычислительное ядро алгоритма ==
 
== Вычислительное ядро алгоритма ==
 +
Вычислительное ядро состоит из вычислений элементов матрицы <math>a_{jl}^{(i+1)} = a_{lj}^{(i+1)}</math>  и  <math>a_{kl}^{(i+1)} = a_{lk}^{(i+1)}</math>  в процессе применения матрицы поворота  <math>J</math> к матрице  <math>A</math>:
 +
 +
<math>a_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k</math>
 +
 +
<math>a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k,
 +
</math>
 +
 +
каждое из которых повторяется по  <math>(n-2)</math>  раза.
 
== Макроструктура алгоритма ==
 
== Макроструктура алгоритма ==
 +
Макроструктуру алгоритма можно описать следующим образом:
 +
 +
repeat
 +
  выбрать пару индексов j, k
 +
  обратиться к процедуре JacobiRotation(A,j,k)
 +
пока А не станет достаточно близка к диагональной матрице
 +
 
==Схема реализации последовательного алгоритма==
 
==Схема реализации последовательного алгоритма==
 +
В классическом алгоритме Якоби для обнуления на текущей итерации выбирался наибольший элемент <math>a_{jk}</math>. Поиск наибольшего элемента слишком замедляет процесс вычислений (нужно провести поиск среди <math>\dfrac{n^2-n}{2}</math> элементов, прежде чем выполнить вращение стоимостью в <math>O(n)</math> флопов), поэтому для практических вычислений выбор параметров <math>j</math> и <math>k</math> производится путем построчного циклического обхода внедиагональных элементов матрицы <math>A</math>.
 +
 +
Таким образом, алгоритм можно описать так:
 +
 +
repeat
 +
    for j=1 to n-1
 +
        for k=j+1 to n
 +
            выполнить процедуру '''''JacobiRotation'''(A, j, k)''
 +
        end for
 +
    end for
 +
пока A не достаточно близка к диагональной матрице
 +
 +
Процедура '''''JacobiRotation'''(A, j, k)'':
 +
 +
if <math>|a_{jk}|</math> не слишком мал
 +
    <math>\begin{align}
 +
      \tau &= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\
 +
      t &= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\
 +
      c &= \frac{1}{\sqrt{1+t^2}} \\
 +
      s &= c\cdot t \\
 +
      A &= J_i^T\cdot A\cdot J_i, \qquad
 +
      J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta
 +
    \end{align}
 +
</math>
 +
end if
 
==Последовательная сложность алгоритма==
 
==Последовательная сложность алгоритма==
 +
Для вычисления собственных значений вещественной симметричной матрицы порядка <math>n</math> методом Якоби требуется:
 +
 +
Для вычислительного ядра:
 +
 +
<math>2\,n(n-1)(n-2)</math> умножений,
 +
 +
<math>n(n-1)(n-2)</math> сложений.
 +
 +
Для остальной части алгоритма:
 +
 +
<math>\frac{3\,n(n-1)}{2}</math>  умножений,
 +
 +
<math>\frac{3\,n(n-1)}{2}</math>  делений,
 +
 +
<math>\frac{5\,n(n-1)}{2}</math>  сложений (вычитаний),
 +
 +
<math>n(n-1)</math>  операций извлечения квадратного корня.
 +
Умножения и сложения (вычитания) составляют основную часть алгоритма.
 +
 +
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с ''кубической сложностью''.
 
==Информационный граф==
 
==Информационный граф==
 
==Ресурс параллелизма алгоритма==
 
==Ресурс параллелизма алгоритма==
Строка 59: Строка 120:
 
'''Объём входных данных:'''<math>\frac{n (n + 1)}{2}</math> (в силу симметричности достаточно хранить только диагональ и над- или поддиагональные элементы). В разных реализациях эта экономия хранения может быть выполнена разным образом.
 
'''Объём входных данных:'''<math>\frac{n (n + 1)}{2}</math> (в силу симметричности достаточно хранить только диагональ и над- или поддиагональные элементы). В разных реализациях эта экономия хранения может быть выполнена разным образом.
  
'''Выходные данные:''' диагональная матрица <math>\Lambda=\{\lambda_{ii}\}</math>, где <math>\lambda_{ii}</math> — собственные значения матрицы <math>A</math>.
+
'''Выходные данные:''' вектор собственных значений <math>\lambda_{i}</math> длины <math>n</math>.
  
'''Объём выходных данных:''' <math>n</math> (достаточно хранить только диагональные элементы).
+
'''Объём выходных данных:''' <math>n</math>  
 
==Свойства алгоритма==
 
==Свойства алгоритма==
 
=ЧАСТЬ. Программная реализация алгоритма=
 
=ЧАСТЬ. Программная реализация алгоритма=
 
=Литература=
 
=Литература=

Версия 20:08, 12 октября 2016

1 ЧАСТЬ. Свойства и структура алгоритмов

1.1 Общее описание алгоритма

Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его в 1846 году Карла Густава Якоба Якоби. Исторически старейший метод для решения проблемы собственных значений получил широкое применение только в 1950-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.

Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.

1.2 Математическое описание алгоритма

Исходные данные: симметрическая матрица [math]A=\{a_{ij}\}[/math].

Вычисляемые данные: диагональная матрица [math]\Lambda=\{\lambda_{ii}\}[/math]. Диагональные элементы [math]\Lambda[/math] — собственные значения матрицы [math]A[/math], столбцы — приближенные собственные вектора.

По заданной матрице [math]A=A_0[/math] строится последовательность ортогонально подобных матриц [math]A_1, A_2,\ldots, A_m[/math], сходящихся к [math]\Lambda[/math].

[math]A_{i+1}={J_i}^TA_iJ_i[/math], где [math] J_i[/math] — ортогональная матрица, называемая вращением Якоби.

Матрица [math]J_i[/math] выбирается так, чтобы обнулить элементы [math](j,k)[/math] и [math](k,j)[/math] матрицы [math]A_{i+1}[/math]:

[math] \begin{matrix}j & & & & & & & & k \end{matrix}[/math]

[math] \begin{align} J_i = R(j,k,\theta) = \begin{matrix} \\ \\ j \\ \\ \\ \\ \\k \\ \\ \end{matrix} \begin{bmatrix} & 1 & & & & & & & & \\ & & 1 & & & & & & & \\ & & & \ddots & & & & & & \\ & & & & \cos(\theta) & & -\sin(\theta) & & & \\ & & & & & \ddots & & & & \\ & & & & \sin(\theta) & & \cos(\theta) & & & \\ & & & & & & & \ddots & & \\ & & & & & & & & 1 & \\ & & & & & & & & & 1 \\ \end{bmatrix} \end{align} [/math]

Для угла вращения [math]\theta[/math]:

[math]\begin{bmatrix}a^{(i+1)}_{jj} & a^{(i+1)}_{jk} \\ a^{(i+1)}_{kj} & a^{(i+1)}_{kk}\end{bmatrix}= \begin{bmatrix}\cos\theta & -\sin\theta \\ \sin\theta &\cos\theta\end{bmatrix}^{T} \begin{bmatrix}a^{(i)}_{jj} & a^{(i)}_{jk} \\ a^{(i)}_{kj} & a^{(i)}_{kk}\end{bmatrix} \begin{bmatrix}\cos\theta & -\sin\theta \\ \sin\theta &\cos\theta\end{bmatrix}= \begin{bmatrix}\lambda_1 & 0 \\ 0 & \lambda_2 \end{bmatrix},[/math] где [math]\lambda_1[/math] и [math]\lambda_2[/math] — собственные значения подматрицы [math]\begin{bmatrix}a^{(i)}_{jj} & a^{(i)}_{jk} \\ a^{(i)}_{kj} & a^{(i)}_{kk}\end{bmatrix}[/math].

Вычислим [math]s = \sin \theta[/math] и [math]c = \cos \theta[/math], исходя из предыдущего матричного равенства:

[math]\begin{bmatrix}\lambda_1 & 0 \\ 0 & \lambda_2 \end{bmatrix}= \begin{bmatrix}a_{jj}c^2+a_{kk}s^2+2sca_{jk} & sc(a_{kk} - a_{jj}) + a_{jk}(c^2-s^2) \\ sc(a_{kk} - a_{jj}) + a_{jk}(c^2-s^2) & a_{jj}s^2+a_{kk}c^2 - 2sca_{jk} \end{bmatrix}[/math].

Приравняем внедиагональный элемент нулю: [math]\dfrac{a_{jj}-a_{kk}}{2a_{jk}}=\dfrac{c^2-s^2}{2sc}=\dfrac{\cos2\theta}{\sin2\theta}=\operatorname{ctg}2\theta\equiv\tau[/math]

Положим [math]tg\theta=t=\dfrac{s}{c}[/math]. Тогда [math]t^2+2t\tau-1=0[/math].

Решая квадратное уравнение, получим: [math]t=\dfrac{\operatorname{sign}\tau}{\left|\tau\right|+\sqrt{1+\tau^2}}, c=\dfrac{1}{\sqrt{1+t^2}}, s=t\cdot c.[/math]

1.3 Вычислительное ядро алгоритма

Вычислительное ядро состоит из вычислений элементов матрицы [math]a_{jl}^{(i+1)} = a_{lj}^{(i+1)}[/math] и [math]a_{kl}^{(i+1)} = a_{lk}^{(i+1)}[/math] в процессе применения матрицы поворота [math]J[/math] к матрице [math]A[/math]:

[math]a_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)} - s \, a_{kl}^{(i)}, l \ne j,k[/math]

[math]a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)} + c \, a_{kl}^{(i)}, l \ne j,k, [/math]

каждое из которых повторяется по [math](n-2)[/math] раза.

1.4 Макроструктура алгоритма

Макроструктуру алгоритма можно описать следующим образом:

repeat
 выбрать пару индексов j, k
 обратиться к процедуре JacobiRotation(A,j,k)
пока А не станет достаточно близка к диагональной матрице

1.5 Схема реализации последовательного алгоритма

В классическом алгоритме Якоби для обнуления на текущей итерации выбирался наибольший элемент [math]a_{jk}[/math]. Поиск наибольшего элемента слишком замедляет процесс вычислений (нужно провести поиск среди [math]\dfrac{n^2-n}{2}[/math] элементов, прежде чем выполнить вращение стоимостью в [math]O(n)[/math] флопов), поэтому для практических вычислений выбор параметров [math]j[/math] и [math]k[/math] производится путем построчного циклического обхода внедиагональных элементов матрицы [math]A[/math].

Таким образом, алгоритм можно описать так:

repeat
   for j=1 to n-1
       for k=j+1 to n
           выполнить процедуру JacobiRotation(A, j, k)
       end for
   end for
пока A не достаточно близка к диагональной матрице

Процедура JacobiRotation(A, j, k):

if [math]|a_{jk}|[/math] не слишком мал
   [math]\begin{align}
      \tau &= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\
      t &= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\
      c &= \frac{1}{\sqrt{1+t^2}} \\
      s &= c\cdot t \\
      A &= J_i^T\cdot A\cdot J_i, \qquad
      J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta 
     \end{align}
[/math]
end if

1.6 Последовательная сложность алгоритма

Для вычисления собственных значений вещественной симметричной матрицы порядка [math]n[/math] методом Якоби требуется:

Для вычислительного ядра:

[math]2\,n(n-1)(n-2)[/math] умножений,

[math]n(n-1)(n-2)[/math] сложений.

Для остальной части алгоритма:

[math]\frac{3\,n(n-1)}{2}[/math] умножений,

[math]\frac{3\,n(n-1)}{2}[/math] делений,

[math]\frac{5\,n(n-1)}{2}[/math] сложений (вычитаний),

[math]n(n-1)[/math] операций извлечения квадратного корня. Умножения и сложения (вычитания) составляют основную часть алгоритма.

Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.

1.7 Информационный граф

1.8 Ресурс параллелизма алгоритма

1.9 Входные и выходные данные алгоритма

Входные данные: плотная матрица [math]A=\{a_{ij}\}, A\in\R^{n\times n}[/math]. Дополнительные ограничения: [math]A[/math] — симметрическая матрица, т. е. [math]a_{ij}= a_{ji}, i, j = 1, \ldots, n[/math].

Объём входных данных:[math]\frac{n (n + 1)}{2}[/math] (в силу симметричности достаточно хранить только диагональ и над- или поддиагональные элементы). В разных реализациях эта экономия хранения может быть выполнена разным образом.

Выходные данные: вектор собственных значений [math]\lambda_{i}[/math] длины [math]n[/math].

Объём выходных данных: [math]n[/math]

1.10 Свойства алгоритма

2 ЧАСТЬ. Программная реализация алгоритма

3 Литература