- •§ 4. Алгебра матриц
- •4.2. Вычисление собственных векторов и собственных значений матриц по методу данилевского
- •4.3. Вычисление собственных векторов и собственных значений симметрической матрицы методом якоби
- •4.4. Задача обращения матриц и вычисления главного определителя по схеме гаусса
- •4.5. Обращение симметрической матрицы методом квадратных корней
- •4.6. Обращение матрицы и решение системы линейных алгебраических уравнений
- •4.7. Умножение уплотненной симметрической матрицы на прямоугольную
- •4.8. Корректировка обратной матрицы после изменения одного элемента в прямой матрице
- •4.9. Матрица причинно-следственных отношений
4.3. Вычисление собственных векторов и собственных значений симметрической матрицы методом якоби
Всякая симметричная матрица A может быть записана в виде
A = V*DV, (1.43)
где V*- ортогональная матрица; D - диагональная с элементами m - собственными значениями матрицы A. После умножения (1.43) слева на V* получим AV* = V*D, и если расписать это матричное равенство по столбцам, то окажется, что каждый i-й столбец матрицы V* является собственным вектором, отвечающим собственному значению i [Бахвалов, 1973а]. Преобразуя систему (1.43) к виду
VAV*= D,
построим последовательность
ортогональных матриц V1,
...., Vn
так, чтобы при Wn=Vn...V,
иметь Wn
AWn*
D.
Если теперь
обозначить через Vkl(
матрицу с элементами
vkk = vll = cos
vkl = -vlk =
sin vii
= 1 при i
k, i,
vij = 0 при остальных
(i, j), то она будет ортогональной.
Построим последовательность матриц
Vn и a(n)
=
по следующему правилу:
А(1) = V A V* , ..., A(n) = V nA(n-1) Vn* . (1.44)
Матрица
строится в зависимости от матрицы A(n) так, чтобы выполнялось неравенство [Бахвалов, 1973а]
.
(1.45)
Выражая каждую матрицу A(n) через предыдущую, будем строить итерационную последовательность A(n) = WAWn*. Согласно оценке (1.45), имеем
.
Пусть матрица D(n) получена из A(n) простой заменой всех недиагональных элементов на нули. Тогда нетрудно доказать [Бахвалов, 1973а], что
,
(1.46)
откуда вытекает |n(n) - n| £ n при всех n, гдеi - собственные значения матрицы A(n) (значит, и матрицы A), занумерованные в порядке убывания, а n(n)- собственные значения матрицы D(n), т.е. ее диагональные элементы, также занумерованные в порядке убывания; rn - верхняя оценка погрешности.
Столбцы матрицы W(n) оказываются приближениями к собственным векторам матрицы A(n). Все столбцы произведения матриц V(kl) и Akl, кроме k-го и первого, совпадают с соответствующими столбцами матрицы A(n), k-й и первый столбцы новой матрицы являются линейными комбинациями этих же столбцов матрицы A. Такого же количества действий потребует дальнейшее умножение на матрицу V*(kl) в соответствии с формулами (1.44), когда происходит изменение k-й и первой строк.
Общее количество арифметических операций для получения каждой последующей матрицы A(n) составит при этом ~ 6n.
Рассмотренный алгоритм (с некоторой модификацией, предложенной в работе [Greenstadt, 1961]) реализован в процедуре eigjac, используя которую можно вычислить все собственные значения и собственные векторы заданной симметричной матрицы a[1:n, 1:n]. На выходе из процедуры l-й столбец матрицы S (начальное значение массива S несущественно) содержит первый из n собственных векторов данной матрицы, диагональный элемент a[l, l] массива A соответствует первому собственному значению. Итерационный процесс заканчивается, когда для каждого недиагонального элемента a[i, j] выполняется неравенство
,
где параметр связанный с оценкой погрешности rn в формуле (1.46) и введенный вместо rn для оценки качества решения в работе [Greenstadt, 1961], и есть задаваемая точность.
Формальные параметры процедуры. Входные: n (тип integer) - порядок матрицы A; eps (тип real) - задаваемая точность; a[1:n,1:n] (тип real) - исходная симметричная матрица. Выходные: a[1:n, 1:n] (тип real) - матрица, диагональные элементы которой a[i, i] являются соответственно -ми собственными значениями; s[1:n, 1:n] (тип real) - матрица, k-й столбец которой содержит k-й из n собственных векторов исходной матрицы A.
procedure eigjac (n:integer;eps:real;
var a, s:mas1);
var norm1,norm2,thr,mu,omega,sint,cost,
int1,v1, v2,v3,t : real;
i,j,p,q,ind : integer;
label main, main1;
begin
{ *** формирование в массиве s
единичной матрицы *** }
for i:=1 to n do
for j:=1 to i do
if i=j then
s[i,j]:=1
else
begin
s[i,j]:=0;
s[j,i]:=0;
end;
{ *** вычисление начальной нормы norm1,
конечной нормы norm2 и порога thr *** };
int1:=0;
for i:=2 to n do
for j:=1 to i-1 do
int1:=int1+2*a[i,j]*a[i,j];
if int1=0 then
exit;
norm1:=sqrt(int1);
thr:=sqrt(int1);
norm2:=(eps/n)*norm1;
ind:=0;
main:
thr:=thr/n;
{**начало обработки недиагональных элементов**};
main1:
for q:=2 to n do
for p:=1 to q-1 do
if abs(a[p,q]) >= thr then
begin
ind:=1;
v1:=a[p,p];
v2:=a[p,q];
v3:=a[q,q];
mu:=0.5*(v1-v3);
if mu=0 then
omega:=-1
else
omega:=-sign(mu)*
v2/sqrt(v2*v2+mu*mu);
sint:=omega/sqrt(2*(1+
sqrt(1-omega*omega));
cost:=sqrt(1-sint*sint);
for i:=1 to n do
begin
if i<>p AND i<>q then
begin
int1:=a[i,p];
mu:=a[i,q];
a[q,i]:=int1*sint+mu*cost;
a[i,q]:=int1*sint+mu*cost;
a[p,i]:=int1*cost-mu*sint;
a[i,p]:=int1*cost-mu*sint;
end;
int1:=s[i,p];
mu:=s[i,q];
s[i,q]:=int1*sint+mu*cost;
s[i,p]:=int1*cost-mu*sint
end {***i***};
mu:=sint*sint;
omega:=cost*cost;
int1:=sint*cost;
t:=2*v2*int1;
a[p,p]:=v1*omega+v3*mu-t;
a[p,p]:=v1*mu+v3*omega+t;
a[p,q]:=(v1-v3)*int1+v2*(omega-mu);
a[q,p]:=(v1-v3)*int1+v2*(omega-mu);
end ;
{***проверка достижения заданной
точности***};
if ind=1 then
begin
ind:=0;
go to main1
end;
if thr > norm2 then go to main;
end.
Процедура eigjac получена из процедуры jacobi [Агеев, 1976] переводом последней с языка ALGOL на язык PASCAL, при этом было сделано несколько тождественных преобразований, оптимизирующих затраты машинного времени. Процедура eigjac была проверена для тех же исходных данных, что и процедура jacobi [Агеев, 1976]: n = 4, eps=10-8 и
.
Вычисления, выполненные на IBM PC/AT-386 с частотой 40 МГц, дали следующие результаты, которые совпадают с результатами тестирования
;
,
приведенными в работе Агеева [Агеев и др., 1976], и имеют максимальную погрешность по отношению к собственным значениям iи собственным векторам X исходной матрицы [в сравнении с их величинами из работы Фадеева и др. (1963) ] max ri = 4*10-8, maxSi = 3*10-6.
