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

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

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

строки с номерами (n k) и j

. Такая перестановка (TA(k 1)T )

max

 

будет подобной, поскольку для матрицы перестановок T справед-

ливо соотношение T 1 T . Если окажется, что «ведущий» элемент равен нулю, то имеет место сингулярный случай, когда характеристический полином распадается на произведение двух характеристических полиномов

det(A E) A(n k ) E

B

 

det(A(n k ) E) det(P(k ) E),

0

P(k ) E

 

 

 

 

 

причем для одного из них матрица Фробениуса P(k ) уже получена,

а для подматрицы A(n k ) ее предстоит еще найти с помощью того же метода. В этом особом случае собственные вектора матрицы следует искать вне данного метода (см. разд. 3.5).

3. Строку Mn(n k kj) , j 1, n,

(см. формулы (3.20)) матрицы M (n k )

можно первоначально формировать в дополнительном векторе m, а в конце k-го преобразования сохранять на месте ((n (k 1)) -й об-

работанной строки исходной матрицы. При этом формулы (3.18), (3.19) перепишутся следующим образом:

(k )

 

(k 1)

mn k ,

i 1, (n k);

 

Ai n k Ai n k

(3.29)

(k )

(k 1)

 

(k 1)

 

 

mj , i 1, (n k),

j 1, n ( j n k).

Ai j

Ai j

 

Ai n k

Здесь исключена явная обработка ((n (k 1)) -й приводимой стро-

ки, поскольку ее компоненты используются при завершении k-го подобного преобразования (см. формулы (3.23)).

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

Скриншоты этой программы представлены на рис. 3.3–3.7. Обратите внимание, что, как и положено, сумма следов двух матриц Фробениуса равна следу исходной матрицы (21 + 7 = 28), а сумма корней каждой из подматриц совпадает с ее следом.

161

Рис. 3.3. Форма, с описанием порядка работы с программой

Рис. 3.4. Главная форма программы, на которой приведен пример матрицы, для которой матрица Фробениуса распадаетс на две подматрицы. Здесь приведен этап получения первой подматрицы

Рис. 3.5. Корни характеристического полинома, полученные методом парабол для первой подматрицы Фробениуса

Рис. 3.6. Главная форма программы после получения второй подматрицы Фробениуса

Рис. 3.7. Корни характеристического полинома, полученные методом парабол для второй подматрицы Фробениуса

Ниже приведены листинги на языке Visual Basic алгоритма, вычисляющего матрицу Фробениуса, и процедуры выбора ведущего элемента, которая используется на каждом шаге алгоритма.

For k = 1 To n - 1 kk = kk + 1

If v_element(k) = 1 Then ‘выделена подматрица Фробениуса code = 1

Exit For End If

For j = 0 To n - 1

ma(j) = a(n - k, j) 'сохраняем обрабатываемую строку

Next j

'ставим 1 в обрабатываемой строке

For i = 0 To n - k

a(i, n - 1 - k) = a(i, n - 1 - k) / a(n - k, n - 1 - k) Next i

'ставим 0 вместо остальных элементов обрабатываемой строки

For i = 0 To n - k For j = 0 To n - 1

If Not (j = n - 1 - k) Then

a(i, j) = a(i, j) - a(i, n - 1 - k) * a(n - k, j) End If

Next j Next i

'умножаем на обратную матрицу (М) For j = 0 To n - 1

buf = 0

For m = 0 To n - 1

buf = buf + ma(m) * a(m, j) Next m

a(n - 1 - k, j) = buf Next j

Next k

Function v_element (k As Integer) As Integer Dim amax#, jmax%, i%, j%, buf#, cd%

cd = 0

amax = Abs(a(n - k, n - 1 - k)) jmax = n - 1 - k

For j = 0 To n - 2 - k buf = Abs(a(n - k, j)) If buf > amax Then

amax = buf jmax = j

End If Next j

If Not (k = jmax) Then

167

For i = 0 To n - 1 buf = a(i, n - 1 - k)

a(i, n - 1 - k) = a(i, jmax) a(i, jmax) = buf

Next i

For j = 0 To n - 1 buf = a(n - 1 - k, j)

a(n - 1 - k, j) = a(jmax, j) a(jmax, j) = buf

Next j End If

If amax < 1E-30 Then cd = 1 code = cd

v_element = cd End Function

Здесь ma(n) – вспомогательный массив для временного хранения обрабатываемой строки; n – размерность обрабатываемо матрицы; v_element – функция, реализующая процедуру выбора ведущего элемента.

3.4.Модифицированный метод Данилевского

Вмодифицированном методе Данилевского исходная матрица A

спомощью (n – 1) подобных преобразований вида C 1 AC приводится к следующей матрице Фробениуса

0

0

...

0

pn

 

 

 

0

...

0

 

 

 

1

pn 1

 

0

1

...

0

pn 2

 

,

 

 

 

 

...

 

 

... ... ... ...

 

 

 

0

...

1

p1

 

 

0

 

 

для которой характеристическое уравнение записывается в виде

n p1 n 1 p2 n 2 ... pn 0 .

Здесь на k-м ( k 1 (n 1) ) шаге матрицы С(k ) и (С 1 )(k ) формируются следующим образом:

168

 

 

 

 

 

 

 

 

 

 

(k 1)

 

 

 

 

 

 

 

 

 

 

 

 

 

A2n

1

0 ...

0

 

 

 

 

 

 

 

 

(k 1)

 

 

 

 

 

(k 1)

 

 

 

A1n

 

 

 

 

0

0

...

0

 

 

 

(k 1)

 

 

 

 

 

A1(nk 1)

 

 

A3n

0

1 ...

0

 

1

0

...

0

(k 1)

 

A2n

 

 

 

 

A1n

 

 

 

 

C(k ) 0

1

...

0

A(k 1)

,

(C 1 )(k ) ...

...

... ... ... .

... ... ... ...

3n

 

 

 

 

 

 

 

 

 

 

...

 

 

 

(k 1)

 

 

 

 

 

 

 

 

 

 

 

 

A

0

0 ...

1

 

0

0

...

1

(k 1)

 

nn

(k 1)

 

Ann

 

 

 

 

A1n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

0

0 ...

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(k 1)

 

 

 

 

 

 

 

 

 

 

A1n

 

 

 

 

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

компонент Ain(k 1) , i 1 (n k) . При этом если максимальный элемент не совпадает с компонентом A1(nk 1) , то выполняется подобное

преобразование путем перестановки соответствующих столбцов и соответствующих строк. Кроме того, если этот элемент равен нулю, то имеет место сингулярный случай. Тогда для завершения построения матрицы Фробениуса необходимо продолжить преобразования, но уже для оставшейся необработанной левой верхней подматрицы размерности (n k)*(n k) :

 

 

 

(k 1)

 

 

 

A11

 

 

...

 

 

 

A(k 1)

A

(k 1)

 

n k1

 

(k 1)

 

 

An k 11

 

 

...

 

 

 

A(k 1)

 

 

 

 

 

 

n1

...

A(k 1)

 

1n k

...

...

...

A(k 1)

 

n k n k

...

A(k 1)

 

n k 1n k

...

...

...

A(k 1)

 

nn k

0

...

0

0

 

 

0

...

0

0

 

0

...

0

0

 

0

...

0

(k 1)

.

An k 1n

... ... ...

...

 

0

...

1

A(k 1)

 

 

 

 

 

nn

 

Детали алгоритма, реализующего все процедуры модифицированного метода Данилевского, представлены ниже в программе на языке математического пакета Maxima.

169

Листинг программы для пакета Maxima:

kill(all);

numer:true;

fpprintprec:5;

/* генерация шаблонов матриц С и С-1 */ genCC(n):=block

(

c:zeromatrix(n,n), c1:zeromatrix(n,n), for i:2 thru n do c[i,i-1]:1,

for j thru n-1 do c1[j,j+1]:1

); /* текущий расчет матриц С и С-1 */

doCC(n):=block

(

for i:1 thru n do c[i,n]:a[i,n], c1[n,1]:1/a[1,n],

for j thru n-1 do c1[j,1]:-a[j+1,n]/a[1,n]

);

/* выбор ведущего элемента в столбце n*/ select(k,n):=block

(

cod:0,

amod:abs(a[1,n]), imax:1, for i:2 thru n-k do

(

buf:abs(a[i,n]), if buf>amod then (amod:buf, imax:i)

),

if amod<1.0e-10 then return(cod:1), /* сингулярный случай */ if imax#1 then

(

for i thru n do /* переставляем столбцы */

(

buf:a[i,1], a[i,1]:a[i,imax], a[i,imax]:buf

),

for j thru n do /* переставляем строки */

(

buf:a[1,j], a[1,j]:a[imax,j], a[imax,j]:buf

)

)

); /* модифицированный метод Данилевского */

mod_danil(n):=block

(

genCC(n),

for k thru n-1 do

(

select(k,n),

if cod=1 then (print("Сингулрный случай на шаге = ",k), return(k)), doCC(n), a:a.c, a:c1.a

)

);

170