Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Литература / Козин Р.Г. Алгоритмы численных методов линейной алгебры и их программная реализация

.pdf
Скачиваний:
4
Добавлен:
07.09.2025
Размер:
4.33 Mб
Скачать

/* формируем подматрицу для сингулярного случая */ /* удаляем лишние нижние строки и правые столбцы */ reform(k):=block

(

for i:n-k thru n-1 do a:submatrix(i+1,a,i+1), n:n-k

); /* тестирование */

n:3; a:matrix([1,2,3],[2,3,4],[3,4,5]); genCC(n); c;c1; doCC(n); c; c1; n:3; a:matrix([1,2,0],[3,4,5],[6,7,8]); k:1; select(k,n); a;

n:3; a:matrix([1,2,0],[3,4,5],[6,7,8]); mod_danil(n); a; n:2; a:matrix([1,2],[3,4]); mod_danil(n); a;

/* Случай 1 */

n:4; a:matrix([1,2,3,0],[4,5,6,7],[2,3,4,0],[5,6,7,8]); mod_danil(n); a; if cod=1 then

(

b:copy(a), reform(s), mod_danil(n)

);

a;

for i thru n do for j thru n do b[i,j]:a[i,j]; /* Случай 2 */

print("Сингулярная матрица Фробениуса - ",b); n:4; a:matrix([1,2,3,4],[5,6,7,8],[0,0,9,10],[0,0,11,12]); print("Исходная матрица -",a);

mod_danil(n); if cod=1 then

(

reform(s), mod_danil(n)

);

print("Приведеннная матрица -",a);

Приведем некоторые результаты, выводимые программой. Исходная матрица:

Шаблоны для матриц С,C 1 :

171

Матрицы С,C 1 на первом шаге:

Исходная матрица:

После выбора ведущего элемента переставлены столбцы и строки:

Матрица Фробениуса для этой матрицы:

Исходная матрица – случай 1:

172

Сингулярный случай на шаге 2:

Вырезанная матрица и ее матрица Фробениуса:

Сингулярная матрица Фробениуса:

Случай 2. Исходная матрица:

Приведенная матрица:

173

Обратите внимание, что в случае 1 след исходной матрицы (= 18) равен сумме следов составляющих матриц Фробениуса (= 6 + 12). Последнее свидетельствует о достоверности полученных результатов.

Наконец, сингулярный вариант основного метода Данилевского, представленный на рис. 3.6, согласно результатам, полученным для случая 2, не является сингулярным для модифицированного метода.

В заключение заметим, что преимущество модифицированного метода перед стандартным методом Данилевского – простая логика, а недостаток – дополнительный расход памяти (2*n*n) и значительное число «ненужных» операций (умножение на нулевые ком-

поненты вспомогательных матриц С,C 1 ).

3.5.Метод Крылова

Вданном методе нахождение коэффициентов характеристического полинома базируется на использовании матричного тождества Гамильтона–Кели

An p An 1

p

An 2 ... p E 0 ,

(3.30)

1

2

n

 

где pi – коэффициенты характеристического полинома det(A E) n p1 n 1 p2 n 2 ... pn 0 .

Возьмем произвольный вектор y(0) 0 и умножим на него

(3.30). В результате получим векторное уравнение относительно неизвестных pi :

An y(0) p1 An 1 y(0) p2 An 2 y(0) ... pn y(0) 0

или в новых обозначениях y(k ) Ay(k 1)

Ak y(0) :

 

p y(n 1)

p

2

y(n 2) ... p y(0)

y(n) .

(3.31)

1

 

 

n

 

 

Эту систему линейных уравнений можно переписать в привычной матричной форме

Yp y(n) ,

(3.32)

174

где

Y00

Y y(n 1) y(n 2) ... y(0) ...

Yn 10

...

Y0n 1

 

 

 

 

 

p p1, p2 , ..., pn .

...

...

 

,

...

Yn 1n 1

 

 

 

 

 

 

Приведем алгоритм для расчета матрицы Y и вектора y(n) (не

забудьте, что правый столбец матрицы

Y

y(0)

задается пользо-

 

 

 

 

 

i n 1

i

 

 

 

вателем)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n 1

для k 1, (n 1)

дляi 0, (n 1)

yi(k ) Yi n 1 k

AimYm n 1 (k 1)

;

 

 

 

 

 

 

 

 

m 0

 

 

 

n 1

 

 

 

 

 

 

для i 0, (n 1)

yi(n) AimYm0

.

 

 

 

 

 

 

 

 

m 0

 

 

 

 

 

 

 

Система (3.32) решается любым известным методом, например методом исключения Гаусса. Если матрица Y окажется особенной

(это имеет место, если вектора y(0) , y(1) , ..., y(n 1) – линейно зависимы), то следует сменить начальный вектор y(0) .

Чтобы в процессе вычисления векторов y(k ) не произошло переполнения, исходную матрицу целесообразно предварительно от-

нормировать: Ai j

Ai j

. После этого собственные значения

max

Ai j

 

 

 

i, j

 

 

отнормированной и исходной матриц будут связаны соотношением

новое

старое

(так как (cA)x (c )x ).

max

Ai j

 

i, j

 

 

После определения собственных значений матрицы A ее собственные вектора можно искать в виде разложения по полной ли-

нейно независимой системе векторов y(0) , y(1) , ..., y(n 1) :

x y(n 1)

 

2

y(n 2) ... y(0) .

(3.33)

1

 

n

 

175

Для нахождения неизвестных коэффициентов i подставим (3.33) в уравнение Ax x . Тогда с учетом процедуры построения векторов y(k ) получим

1 y(n) 2 y(n 1) ... n y(1) ( 1 y(n 1) 2 y(n 2) ... n y(0) ) . (3.34)

Заменим в (3.34) y(n) выражением (3.31) и соберем подобные слагаемые

( 2 p1 1 1 ) y( n 1) ( 3 p2 1 2 ) y(n 2) ...

( n pn 1 1 n 1) y(1) ( pn 1 n )y(0) 0.

Поскольку вектора y(0) , y(1) , ..., y(n 1) – линейно независимые, то коэффициенты в этом равенстве при всех y(k ) должны быть равны нулю. Отсюда получаем

2 ( p1 ) 1;

 

3

 

2

p ( 2

p p

) ;

 

 

2

1

1

2

1

...;

 

 

 

 

 

 

(3.35)

n n 1 pn 1 1

( n 1 p1 n 2 ... pn 1 ) 1 ( n p1 n 1 ... pn ) 1 0.

Здесь в последнем соотношении в скобках стоит характеристический полином, который равен нулю. Поэтому, не нарушая это равенство, можно положить 1 1. Тогда остальные неизвестные ко-

эффициенты можно рассчитать с помощью рекуррентной формулы

k k 1 pk 1,

k 2, n .

(3.36)

Для кратных недостающие собственные вектора (если они существуют) следует искать, изменяя вектор y(0) . В этом случае

необходимо проверить, что полученные собственные вектора x(i) являются линейно независимыми. Для этой цели можно использовать процедуру ортогонализации, которая проходит до конца только для линейно независимых векторов.

176

На рис. 3.8 и 3.9 приведены скриншоты программы, написанной на Visual Basic, которая ипользует метод Крылова для построения характеристического полинома для матрицы, введенной пользователем или сформированной случайным образом самой программой. После ввода матрицы можно построить «систему Крылова» (см. формулу (3.32)), а затем найти коэффициенты характеристического полинома исходной матрицы. Система Крылова решается методом оптимального исключения Гаусса–Жордана (см. п. 2.2.2). Далее методом парабол (см. разд. 4.3) можно определить все корни построенного полинома (собственные значения исходной матрицы). Вместе с корнями программа выдает значения следа матрицы

n

( Aii ) и сумму этих корней. Сравнительный анализ этих величин

i 1

позволяет оценить корректность выполнения всех промежуточных этапов решения задачи по нахождению собственных значений исходной матрицы.

Дополнительно на рис. 3.10 представлены листинг и результаты аналогичного поиска собственных значений матрицы методом Крылова в среде пакета Maxima. Видно, что на всех этапах решения задачи данные, представленные на рис. 3.8–3.10, совпадают. При этом трудоемкость получения этих результатов для пакета существенно меньше. Правда здесь отсутствует интерактивность работы с программой.

В заключение приведем результаты (табл. 3.2) вычислительного эксперимента, целью которого была сравнительная косвенная оценка точности определения собственных значений случайной матрицы методами Крылова и Данилевского в зависимости от размерности матрицы. Они оказались вполне ожидаемыми, поскольку метод Крылова требует почти в 5 раз больше операций, чем метод Данилевского. Кроме того, в случае метода Крылова свои ошибки добовляет метод исключения, который используется при рассчете коэффициентов характеристического полинома матрицы.

177

Рис. 3.8. Главная экранная форма программы для нахождения коэффициентов характеристического полинома произвольной матрицы методом Крылова

Рис. 3.9. Вспомогательная экраннаяформа программы, для определения корней характеристического полинома исходной матрицы. Форма вызывается пунктом меню «метод парабол» на главной форме рис. 3.1

/* формируем систему Крылова для матрицы A и начального вектора y0 */ formKrilov(A,y0):=block

(

[k,i,m,n], /* локальные переменные */ n:length(A),

Y:zeromatrix(n,n-1), /* генерация нулевой матрицы размерности n*(n-1) */ Y:addcol(Y,y0), /* добавляем к матрице Y справа столбец y0 */

for k:2 thru n do for i thru n do

for m thru n do Y[i,n+1-k]:Y[i,n+1-k]+A[i,m]*Y[m,n+2-k], yn:zeromatrix(n,1),

for i thru n do

for m thru n do yn[i]:yn[i]-A[i,m]*Y[m,1]

);

/* главная программа */ numer:true; fpprintprec:6;

A:matrix([1,2,3],[4,5,6],[7,8,9]);

y0:matrix([1],[0],[1]);

formKrilov(A,y0);

print("Матрица и правая часть системы Крылова"); Y;yn;

Y_obr:invert(Y); /* находим обратную матрицу системы Крылова */ n:length(A);

p:zeromatrix(n,1);

/* решаем систему Крылова через обратную матрицу p=Y_obr*yn */ for i thru n do for m thru n do p[i]:p[i]+Y_obr[i,m]*yn[m];

c:[1]; for i thru n do c:append(c,p[i]);

print("Список коэффициентовхарактеристического полинома = ",c);; solve(x^3+p[1]*x^2+p[2]*x+p[3],[x]); /* определение корней полинома */;

Результаты выполнения программы:

– корни полинома

Рис. 3.10. Листинг программы для пакета Maxima и результаты ее выполнения

180