- •§ 4. Алгебра матриц
- •4.2. Вычисление собственных векторов и собственных значений матриц по методу данилевского
- •4.3. Вычисление собственных векторов и собственных значений симметрической матрицы методом якоби
- •4.4. Задача обращения матриц и вычисления главного определителя по схеме гаусса
- •4.5. Обращение симметрической матрицы методом квадратных корней
- •4.6. Обращение матрицы и решение системы линейных алгебраических уравнений
- •4.7. Умножение уплотненной симметрической матрицы на прямоугольную
- •4.8. Корректировка обратной матрицы после изменения одного элемента в прямой матрице
- •4.9. Матрица причинно-следственных отношений
4.2. Вычисление собственных векторов и собственных значений матриц по методу данилевского
Очень простой и экономичный способ решения проблемы собственных значений был предложен в конце 30-х гг. А.М.Данилевским1. Этот метод основан на известном из линейной алгебры факте [Крылов и др., 1972; Курош, 1962], что подобные преобразования матрицыА не изменяют ее собственного многочлена. В самом деле, еслиВ = S -1АS, то
|В - lЕ| = |S -1АS - lS -1ЕS| = |S -1| |А - lЕ| |S| = |А - lS| ,
поэтому, удачно подобрав матрицу подобия, можно привести А к такой форме, что собственныймногочлен будет строиться только по виду самой матрицы. А.М. Данилевский предложил приводить исходную матрицуАк канонической форме Фробениуса
Ф=. (1.37)
Характеристический полином матрицы Фробениуса есть
|Ф - l Е| ==
= ... = (p1 - l)(-ln-1)- p2 (-ln-2) - ... - pn-1l1 - p n =
= (-1)n Pn (l) .
Иными словами, элементы первой строки матрицыФробениуса (1.37) есть соответствующие коэффициенты ее собственного многочлена (1.34). ЕслиФполучена из матрицыАподобными преобразованиями, то собственный многочлен матрицыАсовпадает с собственным многочленом матрицыФ. Больше того оказывается, что найденная матрица подобияSв выраженииФ = S-1АS может быть использована для нахождения собственных векторов матрицыА[Крылов и др., 1972].
Таким образом, основная задача сводится к отысканию матрицы подобия S. A.M. Данилевский в своем алгоритме предложил строить матрицуS, начиная процесс с последнейстроки. При этом последовательно, строка за строкой, исходная матрица приводится к форме Фробениуса. Рассмотрим эту вычислительную схему.
Предположим, что элемент матрицы аn n-1 № 0 (если это не так, то простой перестaновкой столбцов можно всегда добиться выполнения условия),тогда разделим на негоn(n-1)-й столбец матрицыА. Полученный столбец умножим нааni и вычтем изi-го столбца. Проделав эту процедуру дляi= 1, 2, ...,n-1,n, приведем последнюю строку к виду Фробениуса. Однако это равносильно умножению матрицыА на матрицуМn-1 вида
.(1.38)
Но чтобы выполнить преобразование подобия, надо матрицу Адомножить слева на матрицу (Мn-1) -1, которая, как легко убедиться, имеет вид
. (1.39)
Аналогично строится последовательностьматриц
,
и если при этом все аii-1 № 0, то после n -1 шага метода Данилевского будем иметь
.
Если теперь обозначить
то равенство, полученное на n-1 шагe,может быть представленов формеA(Ф) = S -1 A S . Когдаисходная матрица А приведена к канонической форме Фробениуса, то только по виду первой строки можно выписать собственный многочлен матрицы А.
Наши рассуждения относились к случаю, когда все коэффициенты аii-1№0, который называетсярегулярным. Рассмотримнерегулярныйслучай.
Предположим, что процесс приведения Ак виду Фробениуса доведен доk-й строки и выполненоn - k шагов преобразований. Следующийn - k + 1 шаг не может быть выполнен, так как элемент аkk-1равен нулю. Дальнейшие действия зависят от существования в строкеk-го номера слева от элемента с номером (k, k - 1) отличного от нуля элемента. Пустьаki№0 при (i < k - 1). Тогда простой перестановкой столбцов можно вновь перейти к регулярному случаюTA(n - k), где
Легко убедиться, что ТА(n-k) Тесть преобразование подобия, так как (Т)2 = Е; (Т)-1 = Т.После этого преобразования вычисления продолжаются, как и в регулярном случае.
Более интересен случай, когда все элементы строки k, левееаkk -1 на (n-k) шаге равны нулю, т.е. невозможно подобрать очередной элемент непреобразованной части строки, на который будет выполняться деление.
Матрица, которая должна быть преобразована на очередном шаге вычислительной схемы, условно делится на четыре блока, причем в силу особенностей строения этой матрицы один из блоков будет состоять исключительно из нулевых членов, т.е. будет нулевой матрицей О, второй будет матрицей ФробениусаФ, а два оставшихся - обычными матрицами, которые обозначимВиС(очевидно, что все матрицы рангаn - k):
=.
|A(n-k) - lE| = |B(n-k)- lEk-1| |Ф(n-k) - lEn-k+1|.
A так как Ф(n-k)есть матрица Фробениуса, то ее характеристический многочлен выписывается повиду первой строки.Остается только привести B(n-k) к каноническому виду Фробениуса уже изложенным методом.
Можно подсчитать, что в регулярном случае необходимо для вычисления характеристического многочлена выполнить n3действий, поэтому метод Данилевского относят к самымэффективным.
Для повышения точности вычислений на каждом шаге преобразований при помощи перестановки строк или столбцов выбирают наибольший элемент. Для контроля вычислений на каждом шаге проверяют след матрицы, который не должен изменяться.
Если найдены все собственные значения li матрицыА и известна неособенная матрицаS, то в методе Данилевского, как и в методе Крылова, для определения собственных значений матрицыАможно обойтись без решения системы однородных линейных алгебраических уравненийA(Ф)X = liX и использовать уже известную матрицуS:
S = М n-1 М n-2 ... М2 М1. (1.40)
И хотя собственные значения матрицы A(Ф)иАразличны, они имеют одинаковый спектр[Курош, 1962], следовательно, между собственными значениями матрицыA(Ф)иАсуществует связь, основанная на преобразовании подобия матриц [Курош, 1962]. Если векторXесть собственный вектор матрицыA(Ф), принадлежащий собственному значениюli, а вектор Y- собственный вектор подобной ей матрицыФ = S-1АS,принадлежащий тому же собственному значениюli, то векторSYтакже будет собственным вектором матpицыА, соответствующим собственному значениюli.
В этом утверждении можно легко убедиться. Пусть Y- собственный вектор матрицыФ, тогда
ФY = l Y ; S-1АS Y = l Y ;
S S-1АS Y = S l Y; АS Y = S l Y ;
АS Y = lS Y; A X = l X.
Таким образом, собственные векторы исходной матрицы Алегко находятся по собственным значениям матрицы ФробениусаФY = lY или, записав непосредственно, получим:
(1.41)
И так как собственный вектор определяется с точностью до полиномного множителя, положим уn =1. Тогда из системы (1.41) легко найти векторY, а первое уравнение при этом используют исключительно для контроля вычислений. ВекторXматрицыАвычисляется по формуле
X= SY = М n-1 М n-2 ... М2 М1 Y. (1.42)
Заметим, что не обязательно предварительно перемножать матрицы М, удобнее последовательно умножатьYна М1 , М2, ...,Мn-1, при этом от умножения на Мiу вектораY будет изменяться толькоi-я координата.
Если же случай нерегулярный, то этим приемом непосредственно пользоваться нельзя, надо предварительно вычислить матрицу S полностью.
Подпрограмма Danil предназначена для вычисления собственных значенийliматрицыА, положительно определенной, эрмитовой по методу Данилевского. Собственные значения liне упорядочены по возрастанию. ПодпрограммаVectdпредназначена для вычисления собственных векторовXматрицыA, соответствующих собственным значениямli. Векторы записывают в столбцы матрицыХ, они также не упорядочены по возрастаниюli.
Вычислительный алгоритм подпрограммыDanilследующий:
Строится единичная матрица.
Определяется очередной номер строки (последняя строка предыдущего преобразования). Для первого шага iполагается равнымn, а далее уменьшается на единицу с каждым шагом.
Формируется (i - 1)-я строка матрицыSкак результат деленияаij/аij-1, гдеj- номер столбца,i- номер строки (по формуле 1.40).
Формируется (i - 1)-я строка матрицыМ какаij(по формуле 1.38).
умножается Аслева наМi,справа наМi-1, т.е.Аi =Мi-1АМ.
формируется (i - 1)-я строка матрицыS (по формуле 1.40) как (i - 1)-я строка матрицыМ(так как не умножается!).
Если i> 1, то повторить с шага 1.
Решаем характеристическое уравнение (можно воспользоваться программой из п. 4.1).
procedure Danil (const n:integer;
var a,m:mas1; var b: mas11);
type mas = array [1..N] of real;
mas1 = array [1..N] of mas;
var i, j, ns,nsp1, k : integer;
x : mas11; aij : real;
r, E, S, S1, A1 : mas1;
begin
for i := 1 to n do
{ ПРИСВОЕНИЕ НАЧАЛЬНЫХ ЗНАЧЕНИЙ}
for j := 1 to n do { МАССИВАМ }
begin
if i=j then
s[i,j] := 1
else
s[i,j] := 0.0;
if i=j then
m[i,j] := 1
else
m[i,j] := 0.0;
a1[i,j] := a[i,j];
end;
{ОПРЕДЕЛЕНИЕ ЕДИНИЧНОЙ МАТРИЦЫ}
ns := n- 1;
e:= s;
repeat
s := e;
NSP1 := NS + 1;
S1 := E;
for i := 1 to N do
S[NS,i] := -a1[NSP1,i] / a1[NSP1,NS];
S[NS,NS] := 1 / a1[NSP1,NS];
for i := 1 to n do
begin
m[ns,i] := s[ns,i];
s1[ns,i] := a1[nsp1,i];
end;
for i := 1 to N do
{ ФОРМИРОВАНИЕ МАТРИЦЫ А }
for j := 1 to N do
begin
Aij := 0.0;
for k := 1 to N do
Aij := Aij + a1[i,k] * S[k,j];
r[i,j] := Aij;
end;
for i := 1 to N do
for j := 1 to N do
begin
AIJ := 0.0;
for k := 1 to N do
Aij := Aij + S1[i,k]*r[K,J];
a1[i,j] := Aij;
end;
Dec (NS);
UNTIL NS = 0;
{ ОПРЕДЕЛЕНИЕ СОБСТВЕННЫХ ВЕКТОРОВ }
for i := 2 to n+1 do
b[i] :=-a1 [1,i-1];
b[1] := 1.0;
lambda (4,0.0000001,b,x);
b := x;
end.
Формальные параметры процедуры. Входные:N (типinteger) - размерность матрицыА, для которой ищутся собственные значения l;А (типreal) - матрицаА(исходная) размером (n´n).Выходные:А(типreal) - матрица Фробениуса;М (типreal) - массив, содержащий строки, отличные от нуля и единицы матрицы преобразованийМn-1;В (типreal) - массив собственных значений матрицыА.ПроцедураDanil в работе обращается к подпрограммеLambda, описанной в п. 4.1.
Вычислительный алгоритм процедуры Vect:
Вычисляется вспомогательный вектор Y, соответствующий oчередному значениюl (по формуле 1.41).
Вычисляется собственный вектор матрицы Аи заносится в соответствующий столбец массиваV (по формуле 1.42).
Если выбраны не все значения l, то переход на шаг 1, иначе - конец подпрограммы.
procedure Vect (const n: integer; x: mas11;
m:mas1; var v : mas1);
type mas = array [1..n] of real;
var y : mas; i,j, k, NS : integer; sum : real;
begin
NS := 1;
repeat
y[n] := 1;
for i := n-1 downto 1 do
y[i] := y[i+1]*x[ns];
for i := 1 to n do
begin
sum := 0.0;
for j := 1 to n do
sum := sum + m[i,j]*y[j];
y[i] := sum;
end;
for i := 1 to n do
v[i,ns] := y[i];
Inc (ns);
until ns>n;
end.
Формальные параметры процедуры.Входные:М1 (типinteger) - начальный номер собственного значения lматрицы А, начиная с которого надо искать собственные векторы матрицы А;М2 (типinteger) - последний номер собственного значенияlматрицыА,до которого надо искать собственные векторы (очевидно, чтоМ1 < М2);М(типreal) - вспомогательный массив, содержащий строки матрицы преобразованийМ,используемый для пересчета собственного вектора матрицы Фробениуса в собственный вектор матрицы А;В(типreal) - массив собственных значений матрицыА.Выходные:V (типreal) - массив собственных векторов матрицыА. Если определяются не всеl, то собственные векторы располагаются сМ1 поМ2 столбец, а остальные значения массиваVне определены.
Примечание. В процедуреVectотсутствует контроль вычислений собственных значений.
Для проверки работы программы (см. табл. 1.19) собственные значения и собственные векторы матрицы, взятой из п. 4.1, находятся с точностью до 0.0001. Все промежуточные матрицы для контроля за работой программы выписаны.
Таблица 1.19
|
Номер элемента | |||
Параметр |
[ 1 ] |
[ 2 ] |
[ 3 ] |
[ 4 ] |
|
Итерация первая | |||
Матрица |
0.533333 |
-1.416667 |
1.833333 |
-0.140000 |
А |
-0.310000 |
-3.470000 |
4.500000 |
0.260000 |
|
-0.221133 |
-3.097133 |
4.146667 |
0.166800 |
|
0.000000 |
0.000000 |
1.000000 |
0.000000 |
Матрица |
1.000000 |
0.000000 |
0.000000 |
0.000000 |
(М3)-1 |
0.000000 |
1.000000 |
0.000000 |
0.000000 |
|
0.080000 |
0.080000 |
0.060000 |
0.120000 |
|
0.000000 |
0.000000 |
0.000000 |
1.000000 |
Матрица |
1.000000 |
0.000000 |
0.000000 |
0.000000 |
М3 |
0.000000 |
1.000000 |
0.000000 |
0.000000 |
|
-1.333333 |
-13.333333 |
16.666667 |
-2.000000 |
|
0.000000 |
0.000000 |
0.000000 |
1.000000 |
|
Итерация вторая | |||
Матрица |
0.634482 |
0.457412 |
-0.063403 |
-0.2162961 |
А |
0.052473 |
0.575518 |
0.632654 |
-0.178628 |
|
0.000000 |
1.000000 |
0.000000 |
0.000000 |
|
0.000000 |
0.000000 |
1.000000 |
0.000000 |
|
1.000000 |
0.000000 |
0.000000 |
0.000000 |
Матрица |
-0.221133 |
-3.097133 |
4.146667 |
0.166800 |
(М2)-1 |
0.000000 |
0.000000 |
1.000000 |
0.000000 |
|
0.000000 |
0.000000 |
0.000000 |
1.000000 |
Матрица |
1.000000 |
0.000000 |
0.000000 |
0.000000 |
М2 |
-0.071399 |
-0.322879 |
1.338873 |
0.053856 |
|
0.000000 |
0.000000 |
1.000000 |
0.000000 |
|
0.000000 |
0.000000 |
0.000000 |
1.000000 |
|
Итерация третья | |||
Матрица |
1.210000 |
0.291500 |
-0.583363 |
0.101987 |
А |
1.000000 |
0.000000 |
0.000000 |
0.000000 |
|
0.000000 |
1.000000 |
0.000000 |
0.000000 |
|
0.000000 |
0.000000 |
1.000000 |
0.000000 |
Окончание таблицы 1.19
|
Номер элемента | |||
Параметр |
[ 1 ] |
[ 2 ] |
[ 3 ] |
[ 4 ] |
Матрица |
0.052473 |
0.575518 |
0.632654 |
-0.178628 |
(М1)-1 |
0.000000 |
1.000000 |
0.000000 |
0.000000 |
|
0.000000 |
0.000000 |
1.000000 |
0.000000 |
|
0.000000 |
0.000000 |
0.000000 |
1.000000 |
Матрица |
19.057255 |
-10.967785 |
-12.056645 |
3.404166 |
М1 |
0.000000 |
1.000000 |
0.000000 |
0.000000 |
|
0.000000 |
0.000000 |
1.000000 |
0.000000 |
|
0.000000 |
0.000000 |
0.000000 |
1.000000 |
|
|
|
|
|
Собственные |
0.214779 |
-0.699093 |
1.043229 |
0.651085 |
значения матрицы А |
|
|
|
|
|
0.497526 |
-0.038678 |
0.526914 |
-3.835256 |
Собственные |
0.291000 |
-1.037180 |
1.061588 |
1.062538 |
векторы матрицы А |
-2.963725 |
0.229082 |
0.530102 |
-0.202091 |
(не нормированные) |
1.000000 |
1.000000 |
1.000000 |
1.000000 |
|
-0.167872 |
0.037291 |
0.496345 |
1.000000 |
Собственные |
-0.098187 |
1.000000 |
1.000000 |
-0.277045 |
векторы матрицы А |
1.000000 |
-0.220871 |
0.499348 |
0.052693 |
(нормированные) |
-0.337413 |
-0.964153 |
0.941985 |
-0.260739 |