Метод вращения применяют тогда, когда нужно найти собственные значения симметричной матрицы без составления характеристического уравнения. Идея метода довольно простая: шаг за шагом преобразовывать исходную матрицу так, чтобы она становилась всё ближе к диагональной.
В результате в качестве приближённых собственных значений можно взять диагональные элементы полученной матрицы. Кроме того, этот метод позволяет найти и соответствующие собственные векторы, что делает его удобным для решения полной проблемы собственных значений.
Собственные Значения Симметричной Матрицы: Условие Применения и Идея Метода
Начнём с основного. Метод вращения в таком виде применяют к действительным симметричным матрицам. То есть к матрицам \( A \), для которых выполняется условие
\[
A=A^T.
\]
Иначе говоря, элементы матрицы симметрично расположены относительно главной диагонали:
\[
a_{ij}=a_{ji},\qquad i,j=1,2,\dots,n.
\]
Почему это условие так важно? Потому что именно для симметричных матриц ортогональные вращения работают особенно удобно. После таких преобразований матрица остаётся симметричной, а её собственные значения не изменяются.
Этот метод также часто называют методом вращений Якоби. В курсе численных методов такое название встречается очень часто, поэтому его стоит запомнить.
Пусть задана матрица
\[
A=
\begin{pmatrix}
a_{11} & a_{12} & \dots & a_{1n}\\
a_{21} & a_{22} & \dots & a_{2n}\\
\vdots & \vdots & \ddots & \vdots\\
a_{n1} & a_{n2} & \dots & a_{nn}
\end{pmatrix},
\qquad A=A^T.
\]
Нужно найти её собственные значения
\[
\lambda_1,\lambda_2,\dots,\lambda_n.
\]
Но метод вращения позволяет сделать немного больше. Он находит не только собственные значения, но и соответствующие собственные векторы. Именно поэтому говорят, что метод позволяет решить полную проблему собственных значений.
Конечно, можно было бы составить характеристическое уравнение. Но всегда ли это удобно? Нет. Для матриц большого порядка характеристический многочлен может быть громоздким, а его корни не всегда легко найти.
Поэтому метод вращения действует иначе. Исходную матрицу постепенно преобразуют в диагональную или почти диагональную матрицу. Для несимметричных матриц этот подход обычно не используют без дополнительных изменений, потому что его главное преимущество проявляется именно благодаря симметрии матрицы.
Итак, цель метода такая: вместо сложного нахождения корней характеристического уравнения постепенно уменьшать внедиагональные элементы матрицы. Когда они станут достаточно малыми, собственные значения можно будет считать с главной диагонали.
Преобразование Подобия: Почему Собственные Значения не Изменяются
Теперь перейдём к основе метода. Как можно изменять матрицу, но при этом не изменять её собственные значения? Для этого используют преобразование подобия.
Пусть матрицу \( A \) преобразуют в матрицу \( \Lambda \) по формуле
\[
\Lambda=U^{-1}\cdot A\cdot U,
\]
где \( U \) — невырожденная матрица.
Матрицы \( A \) и \( \Lambda \), связанные таким преобразованием, имеют одинаковые собственные значения. То есть внешний вид матрицы меняется, но её спектр сохраняется.
В методе вращения матрицу \( U \) выбирают ортогональной. Для ортогональной матрицы выполняется равенство
\[
U^{-1}=U^T.
\]
Поэтому преобразование подобия можно записать так:
\[
\Lambda=U^T\cdot A\cdot U.
\]
Это удобно с вычислительной точки зрения. Ведь вместо нахождения обратной матрицы достаточно взять транспонированную.
Метод вращения не ищет сразу одну матрицу \( U \), которая сделает матрицу \( A \) диагональной. Обычно это сложно. Поэтому процесс строят постепенно.
Обозначим начальную матрицу так:
\[
A^{(0)}=A.
\]
Далее строим последовательность матриц
\[
A^{(0)}, A^{(1)}, A^{(2)},\dots,A^{(k)}.
\]
Каждая следующая матрица получается из предыдущей с помощью ортогонального преобразования подобия. Поэтому все эти матрицы имеют одинаковые собственные значения.
В конце нужно получить матрицу, близкую к диагональной:
\[
A^{(k)}\approx
\begin{pmatrix}
\lambda_1 & 0 & \dots & 0\\
0 & \lambda_2 & \dots & 0\\
\vdots & \vdots & \ddots & \vdots\\
0 & 0 & \dots & \lambda_n
\end{pmatrix}.
\]
Именно поэтому метод работает логично. Мы не изменяем собственные значения, но постепенно изменяем форму матрицы. В результате она становится такой, из которой эти значения легко считываются.
Матрица Вращения: Как Выполняется Один Шаг Метода
Теперь нужно понять, с помощью какой матрицы выполняется один шаг метода. На каждой итерации используют специальную ортогональную матрицу вращения. Её обозначают так:
\[
U_{i_kj_k}(\phi_k).
\]
Здесь \( k \) — номер итерации, \( i_k \) и \( j_k \) — индексы выбранного внедиагонального элемента, а \( \phi_k \) — угол вращения.
Матрица \( U_{i_kj_k}(\phi_k) \) почти совпадает с единичной матрицей. Она отличается от неё только четырьмя элементами:
\[
\begin{gathered}
u_{i_ki_k}=\cos(\phi_k),
\qquad
u_{i_kj_k}=-\sin(\phi_k),\\[4pt]
u_{j_ki_k}=\sin(\phi_k),
\qquad
u_{j_kj_k}=\cos(\phi_k).
\end{gathered}
\]
Все остальные диагональные элементы равны единице, а остальные внедиагональные элементы равны нулю.
Для удобства введём обозначения
\[
c_k=\cos(\phi_k),
\qquad
s_k=\sin(\phi_k).
\]
Тогда матрицу вращения можно представить схематически:
\[
U_{i_kj_k}(\phi_k)=
\begin{pmatrix}
1 & \dots & 0 & \dots & 0 & \dots & 0\\
\vdots & \ddots & \vdots & & \vdots & & \vdots\\
0 & \dots & c_k & \dots & -s_k & \dots & 0\\
\vdots & & \vdots & \ddots & \vdots & & \vdots\\
0 & \dots & s_k & \dots & c_k & \dots & 0\\
\vdots & & \vdots & & \vdots & \ddots & \vdots\\
0 & \dots & 0 & \dots & 0 & \dots & 1
\end{pmatrix}.
\]
Что делает такая матрица? Она изменяет только две строки и два столбца, связанные с индексами \( i_k \) и \( j_k \). Остальная структура матрицы остаётся неизменной.
На \( k \)-м шаге метода выполняется преобразование
\[
A^{(k)}
=
U_{i_kj_k}^{T}(\phi_k)\cdot
A^{(k-1)}\cdot
U_{i_kj_k}(\phi_k),
\qquad k=1,2,3,\dots.
\]
Из предыдущего раздела уже понятно, почему такое преобразование не изменяет собственные значения. Теперь важно другое: именно оно позволяет постепенно уменьшать внедиагональные элементы.
Если нужно подробно выполнить один шаг метода или реализовать его в программе, преобразование удобно разбить на два действия. Сначала вводят вспомогательную матрицу \( B \):
\[
B=A^{(k-1)}\cdot U_{i_kj_k}(\phi_k).
\]
Затем находят новую матрицу
\[
A^{(k)}=U_{i_kj_k}^{T}(\phi_k)\cdot B.
\]
То есть полное преобразование
\[
A^{(k)}
=
U_{i_kj_k}^{T}(\phi_k)\cdot
A^{(k-1)}\cdot
U_{i_kj_k}(\phi_k)
\]
можно выполнить как два последовательных умножения. Сначала умножаем текущую матрицу справа на матрицу вращения, а затем результат умножаем слева на транспонированную матрицу вращения.
При первом умножении изменяются только \( i_k \)-й и \( j_k \)-й столбцы. Для них имеем
\[
\begin{gathered}
b_{zi_k}
=
a_{zi_k}^{(k-1)}\cdot c_k
+
a_{zj_k}^{(k-1)}\cdot s_k,
\qquad z=1,2,\dots,n,\\[4pt]
b_{zj_k}
=
-a_{zi_k}^{(k-1)}\cdot s_k
+
a_{zj_k}^{(k-1)}\cdot c_k,
\qquad z=1,2,\dots,n.
\end{gathered}
\]
Далее, при втором умножении, изменяются только \( i_k \)-я и \( j_k \)-я строки. Для них получим
\[
\begin{gathered}
a_{i_kz}^{(k)}
=
b_{i_kz}\cdot c_k
+
b_{j_kz}\cdot s_k,
\qquad z=1,2,\dots,n,\\[4pt]
a_{j_kz}^{(k)}
=
-b_{i_kz}\cdot s_k
+
b_{j_kz}\cdot c_k,
\qquad z=1,2,\dots,n.
\end{gathered}
\]
Итак, один шаг метода имеет чёткую структуру. Сначала выполняется умножение справа, которое изменяет два столбца. Затем выполняется умножение слева, которое изменяет две строки. В результате изменяются именно те элементы, которые связаны с выбранными индексами.
Но теперь появляется следующий вопрос: как выбрать индексы \( i_k \), \( j_k \) и сам угол \( \phi_k \)? Именно это определяет, какой элемент будет занулён на текущем шаге.
Собственные Значения Симметричной Матрицы: Выбор Элемента и Угла Вращения
На каждом шаге нужно выбрать внедиагональный элемент, который будем занулять. Поскольку матрица симметричная, достаточно рассматривать элементы, которые лежат, например, над главной диагональю.
Чаще всего выбирают наибольший по модулю внедиагональный элемент матрицы \( A^{(k-1)} \). То есть индексы \( i_k \) и \( j_k \) определяют из условия
\[
\left|a_{i_kj_k}^{(k-1)}\right|
=
\max_{1\leq i<j\leq n}
\left|a_{ij}^{(k-1)}\right|.
\]
Почему выбирают именно наибольший элемент? Потому что так на каждом шаге наиболее активно уменьшается внедиагональная часть матрицы. А именно её мы и хотим постепенно убрать.
После выбора индексов \( i_k \) и \( j_k \) нужно найти угол \( \phi_k \). Его подбирают так, чтобы после преобразования выбранный элемент стал нулевым:
\[
a_{i_kj_k}^{(k)}=0.
\]
Теперь запишем формулу для этого элемента после вращения. С учётом симметричности матрицы \( A^{(k-1)} \) имеем
\[
a_{i_kj_k}^{(k)}
=
a_{i_kj_k}^{(k-1)}\cdot \cos(2\cdot\phi_k)
+
\frac{
a_{j_kj_k}^{(k-1)}-a_{i_ki_k}^{(k-1)}
}{2}
\cdot \sin(2\cdot\phi_k).
\]
По условию метода этот элемент должен быть равен нулю. Поэтому получаем уравнение
\[
a_{i_kj_k}^{(k-1)}\cdot \cos(2\cdot\phi_k)
+
\frac{
a_{j_kj_k}^{(k-1)}-a_{i_ki_k}^{(k-1)}
}{2}
\cdot \sin(2\cdot\phi_k)
=
0.
\]
Отсюда следует
\[
\tan(2\cdot\phi_k)
=
\frac{
2\cdot a_{i_kj_k}^{(k-1)}
}{
a_{i_ki_k}^{(k-1)}-a_{j_kj_k}^{(k-1)}
}.
\]
Итак, если
\[
a_{i_ki_k}^{(k-1)}\neq a_{j_kj_k}^{(k-1)},
\]
то угол вращения можно найти по формуле
\[
\phi_k
=
\frac{1}{2}\cdot
\arctan\left(
\frac{
2\cdot a_{i_kj_k}^{(k-1)}
}{
a_{i_ki_k}^{(k-1)}-a_{j_kj_k}^{(k-1)}
}
\right).
\]
Если же
\[
a_{i_ki_k}^{(k-1)}=a_{j_kj_k}^{(k-1)},
\]
то берут
\[
\phi_k=\frac{\pi}{4}.
\]
Вместе это можно записать так:
\[
\phi_k=
\begin{cases}
\dfrac{1}{2}\cdot \arctan\left(
\dfrac{
2\cdot a_{i_kj_k}^{(k-1)}
}{
a_{i_ki_k}^{(k-1)}-a_{j_kj_k}^{(k-1)}
}
\right),
& a_{i_ki_k}^{(k-1)}\neq a_{j_kj_k}^{(k-1)}, \\[12pt]
\dfrac{\pi}{4},
& a_{i_ki_k}^{(k-1)}=a_{j_kj_k}^{(k-1)}.
\end{cases}
\]
Итак, логика итерации понятна. Сначала выбираем наибольший внедиагональный элемент. Затем находим угол вращения. Далее выполняем преобразование, после которого этот элемент становится нулевым.
Конечно, после одного шага вся матрица ещё не станет диагональной. Кроме того, некоторые другие внедиагональные элементы могут измениться. Но в целом после многих таких вращений внедиагональная часть матрицы становится всё меньше.
Именно поэтому метод вращения является итерационным. Он постепенно приближает матрицу к виду, из которого легко получить собственные значения.
Завершение Метода: Собственные Значения и Собственные Векторы
Теперь осталось понять, когда нужно останавливать итерационный процесс. Поскольку метод вращения является приближённым, заранее задают точность \( \varepsilon \).
Итерации продолжают до тех пор, пока сумма квадратов внедиагональных элементов матрицы \( A^{(k)} \) не станет меньше либо равной заданной точности:
\[
\sum_{\substack{i,j=1\ i\neq j}}^{n}
\left(a_{ij}^{(k)}\right)^2
\leq
\varepsilon.
\]
Это условие означает, что внедиагональные элементы уже достаточно малы. То есть матрица \( A^{(k)} \) стала близкой к диагональной.
После этого приближённые собственные значения исходной матрицы \( A \) берут с диагонали матрицы \( A^{(k)} \):
\[
\lambda_1\approx a_{11}^{(k)},
\qquad
\lambda_2\approx a_{22}^{(k)},
\qquad
\lambda_3\approx a_{33}^{(k)},
\qquad
\dots,
\qquad
\lambda_n\approx a_{nn}^{(k)}.
\]
Здесь важно помнить одну деталь. Эти значения не обязательно располагаются по возрастанию или убыванию. Их порядок зависит от хода итераций.
Именно так находят собственные значения симметричной матрицы методом вращения. Мы не составляем характеристическое уравнение. Вместо этого постепенно уменьшаем внедиагональные элементы и получаем приближённые собственные значения с диагонали.
Теперь вернёмся к собственным векторам. На каждом шаге мы используем определённую матрицу вращения:
\[
U_{i_1j_1}(\phi_1),
\qquad
U_{i_2j_2}(\phi_2),
\qquad
\dots,
\qquad
U_{i_kj_k}(\phi_k).
\]
Если перемножить все эти матрицы, получим матрицу
\[
Q^{(k)}
=
U_{i_1j_1}(\phi_1)\cdot
U_{i_2j_2}(\phi_2)\cdot
\dots
\cdot
U_{i_kj_k}(\phi_k).
\]
Эта матрица накапливает все выполненные вращения. Поэтому она связывает исходную матрицу \( A \) с приближённо диагональной матрицей \( A^{(k)} \):
\[
A^{(k)}
\approx
\left(Q^{(k)}\right)^T\cdot A\cdot Q^{(k)}.
\]
Столбцы матрицы \( Q^{(k)} \) являются приближёнными собственными векторами исходной матрицы \( A \). Каждый такой столбец соответствует определённому собственному значению, которое стоит на диагонали матрицы \( A^{(k)} \).
Итак, метод вращения позволяет найти не только собственные значения, но и собственные векторы. Это одна из главных причин, почему он полезен для полной проблемы собственных значений симметричной матрицы.
Подытожим общую схему. Сначала проверяем, является ли заданная матрица симметричной. Далее выбираем наибольший по модулю внедиагональный элемент. Затем находим угол вращения и зануляем этот элемент. После этого повторяем процесс до заданной точности.
В результате диагональные элементы дают приближённые собственные значения, а произведение матриц вращения даёт приближённые собственные векторы.
Практическая Часть: Примеры Вычисления Методом Вращения
Теперь рассмотрим, как метод вращения работает на конкретных матрицах. В каждом примере будем постепенно занулять наибольшие внедиагональные элементы и проверять, стала ли матрица достаточно близкой к диагональной. Это поможет увидеть, как из теоретических формул получаются приближённые собственные значения и собственные векторы.
Пример 1. Найти собственные значения симметричной матрицы и соответствующие им собственные векторы методом вращения с точностью \( \varepsilon=0.1 \):
\[
A=
\begin{pmatrix}
4 & 1\\
1 & 3
\end{pmatrix}.
\]
Имеем симметричную матрицу второго порядка. Обозначим
\[
A^{(0)}=A=
\begin{pmatrix}
4 & 1\\
1 & 3
\end{pmatrix}.
\]
Сначала проверим сумму квадратов внедиагональных элементов:
\[
S^{(0)}=1^2+1^2=2.
\]
Поскольку
\[
2>0.1,
\]
нужно выполнить преобразование.
В матрице второго порядка есть только один внедиагональный элемент над главной диагональю \( a_{12}^{(0)}=1 \), поэтому берём \( i_1=1 \) и \( j_1=2 \). Найдём угол вращения:
\[
\tan(2\cdot\phi_1)
=
\frac{2\cdot a_{12}^{(0)}}{a_{11}^{(0)}-a_{22}^{(0)}}
=
\frac{2\cdot 1}{4-3}
=
2.
\]
Отсюда
\[
\phi_1=\frac{1}{2}\cdot\arctan(2)\approx 0.5536.
\]
Тогда
\[
c_1=\cos(\phi_1)\approx 0.8507,
\qquad
s_1=\sin(\phi_1)\approx 0.5257.
\]
Матрица вращения имеет вид
\[
U_{12}(\phi_1)=
\begin{pmatrix}
0.8507 & -0.5257\\
0.5257 & 0.8507
\end{pmatrix}.
\]
Тогда транспонированная матрица вращения равна
\[
U_{12}^{T}(\phi_1)=
\begin{pmatrix}
0.8507 & 0.5257\\
-0.5257 & 0.8507
\end{pmatrix}.
\]
Выполняем преобразование
\[
A^{(1)}
=
U_{12}^{T}(\phi_1)\cdot A^{(0)}\cdot U_{12}(\phi_1).
\]
Подставим найденные матрицы:
\[
A^{(1)}
=
\begin{pmatrix}
0.8507 & 0.5257\\
-0.5257 & 0.8507
\end{pmatrix}
\cdot
\begin{pmatrix}
4 & 1\\
1 & 3
\end{pmatrix}
\cdot
\begin{pmatrix}
0.8507 & -0.5257\\
0.5257 & 0.8507
\end{pmatrix}.
\]
Выполнив умножение, получаем
\[
A^{(1)}
\approx
\begin{pmatrix}
4.618 & 0\\
0 & 2.382
\end{pmatrix}.
\]
Теперь снова проверим сумму квадратов внедиагональных элементов:
\[
S^{(1)}=0.
\]
Поскольку
\[
0\leq 0.1,
\]
итерационный процесс останавливаем.
Итак, в качестве приближённых собственных значений берём диагональные элементы матрицы \( A^{(1)} \):
\[
\lambda_1\approx 4.618,
\qquad
\lambda_2\approx 2.382.
\]
Теперь найдём приближённые собственные векторы. Поскольку было выполнено только одно вращение, то
\[
Q^{(1)}=U_{12}(\phi_1).
\]
Отсюда
\[
Q^{(1)}
=
\begin{pmatrix}
0.8507 & -0.5257\\
0.5257 & 0.8507
\end{pmatrix}.
\]
Столбцы этой матрицы являются приближёнными собственными векторами исходной матрицы. Поэтому
\[
v_1\approx
\begin{pmatrix}
0.8507\\
0.5257
\end{pmatrix},
\qquad
v_2\approx
\begin{pmatrix}
-0.5257\\
0.8507
\end{pmatrix}.
\]
Первый столбец соответствует собственному значению \( \lambda_1\approx 4.618 \), а второй столбец — собственному значению \( \lambda_2\approx 2.382 \).
Пример 2. Найти собственные значения симметричной матрицы и соответствующие им собственные векторы методом вращения с точностью \( \varepsilon=0.1 \):
\[
A=
\begin{pmatrix}
4 & 1 & 1\\
1 & 3 & 0\\
1 & 0 & 2
\end{pmatrix}.
\]
Обозначим
\[
A^{(0)}=
\begin{pmatrix}
4 & 1 & 1\\
1 & 3 & 0\\
1 & 0 & 2
\end{pmatrix}.
\]
Сначала найдём сумму квадратов внедиагональных элементов:
\[
S^{(0)}
=
1^2+1^2+1^2+1^2=4.
\]
Поскольку
\[
4>0.1,
\]
начинаем итерационный процесс.
Наибольший по модулю внедиагональный элемент имеет модуль \( 1 \). Можем выбрать, например, \( a_{12}^{(0)}=1 \). Тогда \( i_1=1 \) и \( j_1=2 \). Найдём угол вращения:
\[
\tan(2\cdot\phi_1)
=
\frac{2\cdot a_{12}^{(0)}}{a_{11}^{(0)}-a_{22}^{(0)}}
=
\frac{2\cdot 1}{4-3}
=
2.
\]
Поэтому
\[
\phi_1=\frac{1}{2}\cdot\arctan(2)\approx 0.5536.
\]
Отсюда
\[
c_1\approx 0.8507,
\qquad
s_1\approx 0.5257.
\]
Матрица вращения в плоскости индексов \( 1 \) и \( 2 \) имеет вид
\[
U_{12}(\phi_1)=
\begin{pmatrix}
0.8507 & -0.5257 & 0\\
0.5257 & 0.8507 & 0\\
0 & 0 & 1
\end{pmatrix}.
\]
Тогда
\[
U_{12}^{T}(\phi_1)=
\begin{pmatrix}
0.8507 & 0.5257 & 0\\
-0.5257 & 0.8507 & 0\\
0 & 0 & 1
\end{pmatrix}.
\]
Выполняем преобразование
\[
A^{(1)}
=
U_{12}^{T}(\phi_1)\cdot A^{(0)}\cdot U_{12}(\phi_1).
\]
Подставим матрицы в эту формулу:
\[
A^{(1)}
=
\begin{pmatrix}
0.8507 & 0.5257 & 0\\
-0.5257 & 0.8507 & 0\\
0 & 0 & 1
\end{pmatrix}
\cdot
\begin{pmatrix}
4 & 1 & 1\\
1 & 3 & 0\\
1 & 0 & 2
\end{pmatrix}
\cdot
\begin{pmatrix}
0.8507 & -0.5257 & 0\\
0.5257 & 0.8507 & 0\\
0 & 0 & 1
\end{pmatrix}.
\]
В результате умножения получим
\[
A^{(1)}
\approx
\begin{pmatrix}
4.618 & 0 & 0.8507\\
0 & 2.382 & -0.5257\\
0.8507 & -0.5257 & 2
\end{pmatrix}.
\]
Теперь проверим сумму квадратов внедиагональных элементов:
\[
S^{(1)}
=
2\cdot\left(0.8507^2+(-0.5257)^2\right)
\approx 2.
\]
Поскольку
\[
2>0.1,
\]
нужно продолжать вычисления.
Теперь наибольший по модулю внедиагональный элемент равен \( a_{13}^{(1)}\approx 0.8507 \). Поэтому берём \( i_2=1 \) и \( j_2=3 \). Вычисляем угол:
\[
\tan(2\cdot\phi_2)
=
\frac{2\cdot a_{13}^{(1)}}{a_{11}^{(1)}-a_{33}^{(1)}}
=
\frac{2\cdot 0.8507}{4.618-2}
\approx 0.65.
\]
Тогда
\[
\phi_2\approx 0.2881,
\qquad
c_2\approx 0.9588,
\qquad
s_2\approx 0.2842.
\]
Матрица вращения в плоскости индексов \( 1 \) и \( 3 \) равна
\[
U_{13}(\phi_2)=
\begin{pmatrix}
0.9588 & 0 & -0.2842\\
0 & 1 & 0\\
0.2842 & 0 & 0.9588
\end{pmatrix}.
\]
Поэтому
\[
U_{13}^{T}(\phi_2)=
\begin{pmatrix}
0.9588 & 0 & 0.2842\\
0 & 1 & 0\\
-0.2842 & 0 & 0.9588
\end{pmatrix}.
\]
Выполняем следующее преобразование:
\[
A^{(2)}
=
U_{13}^{T}(\phi_2)\cdot A^{(1)}\cdot U_{13}(\phi_2).
\]
Подставляем соответствующие матрицы:
\[
A^{(2)}
=
\begin{pmatrix}
0.9588 & 0 & 0.2842\\
0 & 1 & 0\\
-0.2842 & 0 & 0.9588
\end{pmatrix}
\cdot
\begin{pmatrix}
4.618 & 0 & 0.8507\\
0 & 2.382 & -0.5257\\
0.8507 & -0.5257 & 2
\end{pmatrix}
\cdot
\begin{pmatrix}
0.9588 & 0 & -0.2842\\
0 & 1 & 0\\
0.2842 & 0 & 0.9588
\end{pmatrix}.
\]
После выполнения умножения имеем
\[
A^{(2)}
\approx
\begin{pmatrix}
4.8701 & -0.1494 & 0\\
-0.1494 & 2.382 & -0.5041\\
0 & -0.5041 & 1.7479
\end{pmatrix}.
\]
Проверим сумму квадратов внедиагональных элементов:
\[
S^{(2)}
=
2\cdot\left((-0.1494)^2+(-0.5041)^2\right)
\approx 0.5528.
\]
Поскольку
\[
0.5528>0.1,
\]
выполняем следующее преобразование.
Наибольший по модулю внедиагональный элемент теперь равен \( a_{23}^{(2)}\approx -0.5041 \). Следовательно, \( i_3=2 \) и \( j_3=3 \). Найдём угол вращения:
\[
\tan(2\cdot\phi_3)
=
\frac{2\cdot a_{23}^{(2)}}{a_{22}^{(2)}-a_{33}^{(2)}}
=
\frac{2\cdot(-0.5041)}{2.382-1.7479}
\approx -1.5899.
\]
Тогда
\[
\phi_3\approx -0.5047,
\qquad
c_3\approx 0.8753,
\qquad
s_3\approx -0.4835.
\]
Матрица вращения в плоскости индексов \( 2 \) и \( 3 \) имеет вид
\[
U_{23}(\phi_3)=
\begin{pmatrix}
1 & 0 & 0\\
0 & 0.8753 & 0.4835\\
0 & -0.4835 & 0.8753
\end{pmatrix}.
\]
Поэтому
\[
U_{23}^{T}(\phi_3)=
\begin{pmatrix}
1 & 0 & 0\\
0 & 0.8753 & -0.4835\\
0 & 0.4835 & 0.8753
\end{pmatrix}.
\]
Выполняем преобразование
\[
A^{(3)}
=
U_{23}^{T}(\phi_3)\cdot A^{(2)}\cdot U_{23}(\phi_3).
\]
После подстановки получаем такое произведение:
\[
A^{(3)}
=
\begin{pmatrix}
1 & 0 & 0\\
0 & 0.8753 & -0.4835\\
0 & 0.4835 & 0.8753
\end{pmatrix}
\cdot
\begin{pmatrix}
4.8701 & -0.1494 & 0\\
-0.1494 & 2.382 & -0.5041\\
0 & -0.5041 & 1.7479
\end{pmatrix}
\cdot
\begin{pmatrix}
1 & 0 & 0\\
0 & 0.8753 & 0.4835\\
0 & -0.4835 & 0.8753
\end{pmatrix}.
\]
Отсюда после умножения
\[
A^{(3)}
\approx
\begin{pmatrix}
4.8701 & -0.1308 & -0.0722\\
-0.1308 & 2.6604 & 0\\
-0.0722 & 0 & 1.4695
\end{pmatrix}.
\]
Теперь проверим условие остановки:
\[
S^{(3)}
=
2\cdot\left((-0.1308)^2+(-0.0722)^2\right)
\approx 0.0446.
\]
Поскольку
\[
0.0446\leq 0.1,
\]
итерационный процесс останавливаем.
Итак, в качестве приближённых собственных значений берём диагональные элементы матрицы \( A^{(3)} \):
\[
\lambda_1\approx 4.8701,
\qquad
\lambda_2\approx 2.6604,
\qquad
\lambda_3\approx 1.4695.
\]
Обратите внимание. Матрица \( A^{(3)} \) ещё не является полностью диагональной. Но её внедиагональные элементы уже достаточно малы для заданной точности.
Теперь найдём приближённые собственные векторы. Для этого перемножаем все матрицы вращения, которые использовались во время итераций:
\[
Q^{(3)}
=
U_{12}(\phi_1)\cdot
U_{13}(\phi_2)\cdot
U_{23}(\phi_3).
\]
Подставим найденные матрицы:
\[
Q^{(3)}
=
\begin{pmatrix}
0.8507 & -0.5257 & 0\\
0.5257 & 0.8507 & 0\\
0 & 0 & 1
\end{pmatrix}
\cdot
\begin{pmatrix}
0.9588 & 0 & -0.2842\\
0 & 1 & 0\\
0.2842 & 0 & 0.9588
\end{pmatrix}
\cdot
\begin{pmatrix}
1 & 0 & 0\\
0 & 0.8753 & 0.4835\\
0 & -0.4835 & 0.8753
\end{pmatrix}.
\]
После умножения этих матриц получаем
\[
Q^{(3)}
\approx
\begin{pmatrix}
0.8156 & -0.3433 & -0.4658\\
0.5041 & 0.8168 & 0.2805\\
0.2842 & -0.4636 & 0.8392
\end{pmatrix}.
\]
Столбцы этой матрицы являются приближёнными собственными векторами исходной матрицы. Поэтому
\[
v_1\approx
\begin{pmatrix}
0.8156\\
0.5041\\
0.2842
\end{pmatrix},
\qquad
v_2\approx
\begin{pmatrix}
-0.3433\\
0.8168\\
-0.4636
\end{pmatrix},
\qquad
v_3\approx
\begin{pmatrix}
-0.4658\\
0.2805\\
0.8392
\end{pmatrix}.
\]
Пример 3. Найти собственные значения симметричной матрицы и соответствующие им собственные векторы методом вращения с точностью \( \varepsilon=0.1 \):
\[
A=
\begin{pmatrix}
5 & 1.4 & 0.1 & 0\\
1.4 & 4 & 0 & 0.1\\
0.1 & 0 & 3 & 0.2\\
0 & 0.1 & 0.2 & 2
\end{pmatrix}.
\]
Обозначим
\[
A^{(0)}=
\begin{pmatrix}
5 & 1.4 & 0.1 & 0\\
1.4 & 4 & 0 & 0.1\\
0.1 & 0 & 3 & 0.2\\
0 & 0.1 & 0.2 & 2
\end{pmatrix}.
\]
Найдём начальную сумму квадратов внедиагональных элементов. Поскольку матрица симметричная, каждый элемент над главной диагональю имеет соответствующий такой же элемент под главной диагональю:
\[
S^{(0)}
=
2\cdot\left(1.4^2+0.1^2+0.1^2+0.2^2\right)
=
4.04.
\]
Поскольку
\[
4.04>0.1,
\]
начинаем итерационный процесс.
Наибольший по модулю внедиагональный элемент равен \( a_{12}^{(0)}=1.4 \). Поэтому выбираем \( i_1=1 \) и \( j_1=2 \). Найдём угол вращения:
\[
\tan(2\cdot\phi_1)
=
\frac{2\cdot a_{12}^{(0)}}{a_{11}^{(0)}-a_{22}^{(0)}}
=
\frac{2\cdot 1.4}{5-4}
=
2.8.
\]
Итак,
\[
\phi_1=\frac{1}{2}\cdot\arctan(2.8)\approx 0.6139.
\]
Тогда
\[
c_1\approx 0.8174,
\qquad
s_1\approx 0.576.
\]
Матрица вращения имеет вид
\[
U_{12}(\phi_1)=
\begin{pmatrix}
0.8174 & -0.576 & 0 & 0\\
0.576 & 0.8174 & 0 & 0\\
0 & 0 & 1 & 0\\
0 & 0 & 0 & 1
\end{pmatrix}.
\]
Тогда
\[
U_{12}^{T}(\phi_1)=
\begin{pmatrix}
0.8174 & 0.576 & 0 & 0\\
-0.576 & 0.8174 & 0 & 0\\
0 & 0 & 1 & 0\\
0 & 0 & 0 & 1
\end{pmatrix}.
\]
Выполняем преобразование
\[
A^{(1)}
=
U_{12}^{T}(\phi_1)\cdot A^{(0)}\cdot U_{12}(\phi_1).
\]
Подставляем матрицы:
\[
A^{(1)}
=
\begin{pmatrix}
0.8174 & 0.576 & 0 & 0\\
-0.576 & 0.8174 & 0 & 0\\
0 & 0 & 1 & 0\\
0 & 0 & 0 & 1
\end{pmatrix}
\cdot
\begin{pmatrix}
5 & 1.4 & 0.1 & 0\\
1.4 & 4 & 0 & 0.1\\
0.1 & 0 & 3 & 0.2\\
0 & 0.1 & 0.2 & 2
\end{pmatrix}
\cdot
\begin{pmatrix}
0.8174 & -0.576 & 0 & 0\\
0.576 & 0.8174 & 0 & 0\\
0 & 0 & 1 & 0\\
0 & 0 & 0 & 1
\end{pmatrix}.
\]
После умножения матрица принимает вид
\[
A^{(1)}
\approx
\begin{pmatrix}
5.9866 & 0 & 0.0817 & 0.0576\\
0 & 3.0134 & -0.0576 & 0.0817\\
0.0817 & -0.0576 & 3 & 0.2\\
0.0576 & 0.0817 & 0.2 & 2
\end{pmatrix}.
\]
Теперь проверим сумму квадратов внедиагональных элементов:
\[
S^{(1)}
=
2\cdot\left(
0.0817^2+
0.0576^2+
(-0.0576)^2+
0.0817^2+
0.2^2
\right)
\approx 0.12.
\]
Поскольку
\[
0.12>0.1,
\]
нужно выполнить ещё одно преобразование.
Теперь наибольший по модулю внедиагональный элемент равен \( a_{34}^{(1)}=0.2 \). Следовательно, \( i_2=3 \) и \( j_2=4 \). Найдём угол:
\[
\tan(2\cdot\phi_2)
=
\frac{2\cdot a_{34}^{(1)}}{a_{33}^{(1)}-a_{44}^{(1)}}
=
\frac{2\cdot 0.2}{3-2}
=
0.4.
\]
Поэтому
\[
\phi_2=\frac{1}{2}\cdot\arctan(0.4)\approx 0.1903.
\]
Отсюда
\[
c_2\approx 0.982,
\qquad
s_2\approx 0.1891.
\]
Матрица вращения в плоскости индексов \( 3 \) и \( 4 \) равна
\[
U_{34}(\phi_2)=
\begin{pmatrix}
1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 0.982 & -0.1891\\
0 & 0 & 0.1891 & 0.982
\end{pmatrix}.
\]
Поэтому
\[
U_{34}^{T}(\phi_2)=
\begin{pmatrix}
1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 0.982 & 0.1891\\
0 & 0 & -0.1891 & 0.982
\end{pmatrix}.
\]
Выполняем преобразование
\[
A^{(2)}
=
U_{34}^{T}(\phi_2)\cdot A^{(1)}\cdot U_{34}(\phi_2).
\]
После подстановки имеем
\[
A^{(2)}
=
\begin{pmatrix}
1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 0.982 & 0.1891\\
0 & 0 & -0.1891 & 0.982
\end{pmatrix}
\cdot
\begin{pmatrix}
5.9866 & 0 & 0.0817 & 0.0576\\
0 & 3.0134 & -0.0576 & 0.0817\\
0.0817 & -0.0576 & 3 & 0.2\\
0.0576 & 0.0817 & 0.2 & 2
\end{pmatrix}
\cdot
\begin{pmatrix}
1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 0.982 & -0.1891\\
0 & 0 & 0.1891 & 0.982
\end{pmatrix}.
\]
Выполнив умножение, получаем
\[
A^{(2)}
\approx
\begin{pmatrix}
5.9866 & 0 & 0.0912 & 0.0411\\
0 & 3.0134 & -0.0411 & 0.0912\\
0.0912 & -0.0411 & 3.0385 & 0\\
0.0411 & 0.0912 & 0 & 1.9615
\end{pmatrix}.
\]
Проверим условие остановки:
\[
S^{(2)}
=
2\cdot\left(
0.0912^2+
0.0411^2+
(-0.0411)^2+
0.0912^2
\right)
\approx 0.04.
\]
Поскольку
\[
0.04\leq 0.1,
\]
итерационный процесс останавливаем.
Итак, в качестве приближённых собственных значений берём диагональные элементы матрицы \( A^{(2)} \):
\[
\lambda_1\approx 5.9866,
\qquad
\lambda_2\approx 3.0134,
\qquad
\lambda_3\approx 3.0385,
\qquad
\lambda_4\approx 1.9615.
\]
Эти значения не обязательно упорядочены по возрастанию или убыванию. Они просто стоят на диагонали полученной почти диагональной матрицы.
Теперь найдём приближённые собственные векторы. Для этого перемножаем матрицы вращения:
\[
Q^{(2)}
=
U_{12}(\phi_1)\cdot
U_{34}(\phi_2).
\]
Подставим соответствующие матрицы:
\[
Q^{(2)}
=
\begin{pmatrix}
0.8174 & -0.576 & 0 & 0\\
0.576 & 0.8174 & 0 & 0\\
0 & 0 & 1 & 0\\
0 & 0 & 0 & 1
\end{pmatrix}
\cdot
\begin{pmatrix}
1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 0.982 & -0.1891\\
0 & 0 & 0.1891 & 0.982
\end{pmatrix}.
\]
После умножения получаем
\[
Q^{(2)}
\approx
\begin{pmatrix}
0.8174 & -0.576 & 0 & 0\\
0.576 & 0.8174 & 0 & 0\\
0 & 0 & 0.982 & -0.1891\\
0 & 0 & 0.1891 & 0.982
\end{pmatrix}.
\]
Столбцы матрицы \( Q^{(2)} \) являются приближёнными собственными векторами исходной матрицы. Поэтому
\[
v_1\approx
\begin{pmatrix}
0.8174\\
0.576\\
0\\
0
\end{pmatrix},
\qquad
v_2\approx
\begin{pmatrix}
-0.576\\
0.8174\\
0\\
0
\end{pmatrix},
\qquad
v_3\approx
\begin{pmatrix}
0\\
0\\
0.982\\
0.1891
\end{pmatrix},
\qquad
v_4\approx
\begin{pmatrix}
0\\
0\\
-0.1891\\
0.982
\end{pmatrix}.
\]
Рекомендуемые Темы: Куда Двигаться Дальше
После метода вращения стоит рассмотреть ещё несколько подходов к работе с собственными значениями. Они помогают увидеть, как меняется идея вычислений в зависимости от типа матрицы и цели задачи.
- Метод половинного деления: Как найти собственные значения трёхдиагональной матрицы — В статье пойдёт речь о поиске собственных значений симметричной трёхдиагональной матрицы через деление промежутка и проверку знаков.
- Степенной метод: Как найти наибольшее собственное значение — В статье будет показано, как через последовательное умножение матрицы на вектор находить наибольшее по модулю собственное значение.
- Метод исчерпывания: Как найти следующее собственное значение — В статье пойдёт речь о случае, когда первое собственное значение уже известно, а дальше нужно перейти к следующему.
Собственные Значения Симметричной Матрицы: Алгоритм Для Программной Реализации
Если вам интересно программирование, метод вращения можно воспринимать не только как набор формул, но и как готовую основу для небольшого вычислительного алгоритма. Блок-схема ниже показывает логику программы для нахождения собственных значений симметричной матрицы второго порядка: от ввода элементов матрицы до проверки симметричности, вычисления угла вращения и вывода финального результата.
Попробуйте реализовать этот алгоритм на своём любимом языке программирования — Pascal, Python, C++, JavaScript или любом другом. Так вы лучше увидите, как теоретический метод превращается в практический инструмент для численных вычислений.
