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

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

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

Рис. 3.13. Собственные значения исходной, случайной матрицы, найденные методом вращения. Видно, что сумма собственных значений равна следуматрицы

Рис. 3.14. Видно, что суммарная матрица преобразования S, полученная итерационным методом вращения, дейсвительно является ортогональной

Рис. 3.15. Видно, подобное преобразование исходной матрицы, выполненное с помощью суммарной матрицы S, дает те же результаты, что и итерационная процедура метода вращения (см. рис. 3.13)

Рис. 3.16. Графическое представление результатов табл. 3.4 ( log(N) от n)

В завершение приведем аналогичную программу, реализованную на языке пакета Maxima:

kill(all);

/* находит положение максимального по модулю внедиагонального элемента матрицы результат возвращает в lmax, kmax, Amax и угол fi */ maxElem(A):=block

(

[i,j,n,buf], /* локальные переменные */ Amax:-1,lmax:0, kmax:0, n:length(A), for i thru n-1 do

for j:i+1 thru n do

(

buf:abs(A[i,j]),

if buf>Amax then (Amax:buf,lmax:i,kmax:j)

),

if A[lmax,lmax]=A[kmax,kmax] then fi:signum(A[lmax,kmax])*%pi/4 else fi:0.5*atan(2*A[lmax,kmax]/(A[lmax,lmax]-A[kmax,kmax]))

);

/* метод вращения для симметричной матрицы */ lmd(A,iter,eps):=block

(

[i,j,n,it,buf], /* локальные переменные */ n:length(A),maxIt:0,

T:ident(n), /*генерация единичной матрицы */ for it thru iter do

(

maxElem(A),

if Amax<eps then return(maxIt:it), sinfi:sin(fi), cosfi:cos(fi),

for i thru n do

(

buf:A[i,lmax]*cosfi+A[i,kmax]*sinfi, A[i,kmax]:-A[i,lmax]*sinfi+A[i,kmax]*cosfi, A[i,lmax]:buf, buf:T[i,lmax]*cosfi+T[i,kmax]*sinfi, T[i,kmax]:-T[i,lmax]*sinfi+T[i,kmax]*cosfi, T[i,lmax]:buf

),

for j thru n do

(

buf:A[lmax,j]*cosfi+A[kmax,j]*sinfi, A[kmax,j]:-A[lmax,j]*sinfi+A[kmax,j]*cosfi, A[lmax,j]:buf

)

)

);

/* формируем случайную симметричную матрицу A размерности m*/ /* случ.числа из диапозона [-1,1] */

195

rnd(m):=block

(

A:zeromatrix(m,m), for i thru m do

(

A[i,i]:(random(2.0)-1),

for j:i+1 thru m do (A[i,j]:(random(2.0)-1), A[j,i]:A[i,j])

)

);

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

fpprintprec:5; /* в выводимом числе 5 цифр, не считая точки */ rnd(5); B:copy(A);

print("Исходная случайная симметричная матрица = ",A); sld:sum(A[i,i],i,1,length(A)); /* след матрицы */ lmd(A,1000,0.00000000001);

print("Число использ.итераций и приведенная матрица с собст.значениями: ", maxIt," ,",A);

print("Собственные значения - ",create_list(A[i,i],i,1,length(A))); slmd:sum(A[i,i],i,1,length(A));

/* тестирование правильности работы программы, реализующей метод вращения */ print("След матрицы и сумма ее собст.значений: ",sld,slmd);

print("Матрица T ",T);

Tt:transpose(T); print("Матрица Tt.T ",Tt.T); print("Матрица Tt.A.T ",Tt.B.T);

Далее собраны результаты ее работы:

196

Вопросы и задания для самоконтроля

1.В чем смысл метода Данилевского?

2.Составьте алгоритм процедуры выбора ведущего элемента для метода Данилевского.

3.О чем сигнализирует нулевой ведущий элемент в методе Данилевского?

4.Каким образом в общем случае можно найти собственный

вектор для заданного собственного значения?

5.В чем смысл метода Крылова?

6.В чем смысл метода вращения?

7.Каким образом выбирается текущая матрица вращения в методе вращения?

197

ГЛАВА 4. АЛГОРИТМЫ ДЛЯ РАБОТЫ С ПОЛИНОМАМИ

При определении корней характеристического полинома необходимо знать алгоритмы отдельных операций для работы с полиномыми. Этому посвящена данная глава.

4.1.Подсчет значения полинома и деление на множители

1.Подсчет значения полинома Pn (x) в точке x (схема Горнера). Если полином представить в виде

n

 

 

Pn (x) ai xn i a0 xn a1xn 1

... an

(4.1)

i 0

 

(... (a0 x a1 )x a2 )x ... an 1 )x an ),

то для подсчета значения полинома Pn (x) в точке x легко записать наиболее экономичный (по количеству операций) алгоритм

P a0

(4.2)

for i 1, n {P Px ai }

 

Этот алгоритм легко обобщается на комплексный случай x i :

P1 a0

P2 0 for i 1, n

{

(4.3)

 

 

R1 P1

 

P1 P1 P2 ai

 

P2 P2 R1

}

 

Здесь использовано представление P( i ) P1 iP2 в разложе-

нии (4.1).

198

Далее показано, как этот алгоритм реализуется на Maxima:

/* п/п вычисления значений полинома p=(p1+i*p2) в точке x=(xd+i*xm) */ /* c – список коэффиентов полинома: c[1]*x^n+c[2]*x^(n-1)+...+c[n+1] */ p(c,xd,xm):=block

(

p1:c[1],

p2:0,

for i:2 thru length(c) do /* длина списка */ (r1:p1, p1:xd*p1-xm*p2+c[i],p2:xd*p2+xm*r1) );

/* список коэффициентов полинома: c[1]*x^5+c[2]*x^4+ñ[3]*x^3+c[4]*x^2+c[5]*x+c[6] */ c:[1,2,3,4,5,6];

p(c,1,1);

print("Действительная и мнимая части значения полинома = ",p1,", ",p2);

/* другой способ задания полинома – как собственной функции */ pol(x):=x^5+2*x^4+3*x^3+4*x^2+5*x+6;

/* определение 2-х функций – действительной и мнимой частей полинома*/ fd(x):=realpart(pol(x));fm(x):=imagpart(pol(x));

x:1+%i*1;

print("Действительная и мнимая части значения полинома = ",fd(x),", ",fm(x));

2. Деление полинома Pn (x) на линейный множитель (x ) .

Запишем очевидное соотношение между исходным полиномом и результатом его деления на линейный множитель:

n

 

 

 

 

 

Pn (x) ai xn i a0 xn a1 xn 1 ... an

 

i 0

 

 

 

 

 

(x )(b xn 1

b xn 2

... b

) b

 

(4.4)

0

1

n 1

n

 

 

b0 xn b1xn 1 ... bn 1x bn b0 xn 1 b1 xn 2 ... bn 1 .

199

Отсюда, сравнивая сомножители при одинаковых степенях x в крайних частях равенства, получим рекуррентные формулы для определения коэффициентов bi :

b0

a0

;

 

b1 a1

b0 ;

 

b2

a2

b1 ;

(4.5)

...;

 

 

 

bn

an

bn 1 Pn ( ) остаток.

 

Остаток – коэффициент bn равен нулю, если – корень полинома

(см. (4.2)).

Приведем алгоритм расчета коэффициентов bi , который в общих чертах совпадает с алгоритмом (4.2):

b0 a0

 

 

 

 

 

 

 

 

 

 

(4.6)

for i 1, n {bi bi 1 ai }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3. Деление

полинома

Pn (x)

на

квадратичный

множитель

(x2 px q) .

 

 

 

 

 

 

 

 

 

 

Аналогично предыдущему случаю имеем

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

Pn (x) ai xn i a0 xn a1xn 1

... an 1x an

 

 

 

 

i 0

 

 

 

 

 

 

 

 

 

 

(x2

px q)(b xn 2 b xn 3 b xn 4

... b

x b

)

 

 

 

0

 

1

2

 

n 3

 

n 2

 

 

b

x b

b xn b xn 1 b xn 2 ... b

x3 b

x2

 

(4.7)

n 1

n

0

1

2

 

n 3

 

n 2

 

 

 

b0 pxn 1 b1 pxn 2 b2 pxn 3 ... bn 3 px2 bn 2 px

b0qxn 2 b1qxn 3 b2qxn 4 ... bn 3qx bn 2q bn 1x bn .

Отсюда получаем рекуррентные формулы для определения коэффициентов bi :

200