Вычисление максимального по модулю собственного значения и соответствующего собственного вектора матрицы степенным методом

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

А =

при условии, что максимальное по модулю собственное значение действительное и не кратное.

Степенной метод относится к числу итерационных и работает по следующей схеме:

пусть х 0 – начальное приближение к собственному вектору, тогда

y k = A x k 1, k = 1, 2, ….

При каждом k происходит нормировка вектора по правилу

х k = .

При достаточно большом k максимальное собственное значение

R = ,

х k – искомый собственный вектор.

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

Если максимальное по модулю собственное значение комплексное или кратное, то произойдет зацикливание.

П р о г р а м м а

Program ST_MAX_SZN_SV;

const nmax = 10; {максимальный размер матрицы}

const eps = 1E-5; {точность вычислений}

var A: array [1..nmax,1..nmax] of real;

X: array [1..nmax] of real; {начальное приближение к собственному вектору}

Y: array [1..nmax] of real; {рабочий массив}

i,j,n:integer;

b,r,s:real;

label L;

Begin

writeln('программа вычисления максимального по модулю собственного');

writeln('значения и собственного вектора матрицы степенным методом');

writeln;

write('введите размерность матрицы А: n=');

readln(n);

writeln('ввод матрицы А:');

for i:=1 to n do

for j:=1 to n do

Begin

write('A[',i,',',j,']=');

readln(A[i,j]);

end;

writeln('ввод начального приближения');

for i:=1 to n do

Begin

write('X[',i,']=');

readln(X[i]);

end;

b:=0;

L:r:=0;

for i:=1 to n do

Begin

s:=0;

for j:=1 to n do s:=s+A[i,j]*X[j];

Y[i]:=s;

if abs(Y[i])>abs(r) then r:=Y[i]

end;

for i:=1 to n do X[i]:=Y[i]/r;

if abs(b-r)>eps then

Begin

b:=r;

goto L

end;

writeln;

writeln('Р Е З У Л Ь Т А Т Ы');

writeln;

writeln('СОБСТВЕННОЕ ЗНАЧЕНИЕ R=',r:10:5);

writeln;

writeln('СОБСТВЕННЫЙ ВЕКТОР Х');

for i:=1 to n do

write(X[i]:10:5);

end.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: