Программа предназначена вычисление максимального по модулю собственного значения и соответствующего собственного вектора действительной матрицы
А =
при условии, что максимальное по модулю собственное значение действительное и не кратное.
Степенной метод относится к числу итерационных и работает по следующей схеме:
пусть х 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.