Программа предназначена вычисление максимального по модулю собственного значения и соответствующего ему собственного вектора симметричной матрицы
А = , aij = aji, i, j = 1, 2, …, n.
Максимальное собственное значение матрицы вычисляется по формуле
Λ = , k = 1, 2, …,
где у 0 – начальное приближение к собственному вектору;
y k = A у k – 1.
На каждом шаге происходит нормировка по правилу
= .
При достаточно большом k число Λ является собственным значением, а y k – собственным вектором матрицы А.
О выборе начального приближения см. п.2.5.
Замечание. Исходная матрица вводится в интерактивном режиме своим нижним треугольником по строкам.
П р о г р а м м а
Program SP_SZN_SV;
{программа вычисления максимального по модулю собственного значения}
{и собственного вектора симметричной матрицы методом скалярных произведений}
const nmax = 50; {максимальный размер матрицы}
const eps = 1E-5; {точность вычислений}
var A: array [1..nmax] of real; {исходная матрица задается нижним треугольником}
Y: array [1..nmax] of real; {начальное приближение к собственному вектору}
|
|
X: array [1..nmax] of real; {рабочий массив}
i,j,n:integer;
f,s,p,g,c,m,b:real;
label L;
Begin
writeln('программа вычисления максимального по модулю собственного значения и ');
writeln('собственного вектора симметричной матрицы методом скалярных произведений');
writeln;
write('введите размерность матрицы А: n=');
readln(n);
writeln('ввод матрицы А:');
for i:=1 to n do
for j:=1 to i do
Begin
write('A[',i,',',j,']=');
readln(A[round(i*(i-1)/2)+j]);
end;
writeln('ввод начального приближения');
for i:=1 to n do
Begin
write('Y[',i,']=');
readln(Y[i]);
end;
f:=0;
L: for i:=1 to n do
Begin
s:=0;
for j:=1 to i do s:=s+A[round(i*(i-1)/2)+j]*Y[j];
X[i]:=s;
end;
for j:=1 to n-1 do
Begin
s:=0;
for i:=j+1 to n do s:=s+A[round(i*(i-1)/2)+j]*Y[i];
X[j]:=X[j]+s
end;
s:=0;
for i:=1 to n do s:=s+X[i]*X[i];
p:=s;
s:=0;
for i:=1 to n do s:=s+Y[i]*X[i];
g:=p/s;
c:=sqrt(p);
m:=0;
for i:=1 to n do
Begin
Y[i]:=X[i]/c;
b:=abs(Y[i]);
if b>m then m:=b
end;
if abs(m-f)>eps then
Begin
f:=m;
goto L
end;
writeln;
writeln('Р Е З У Л Ь Т А Т Ы');
writeln;
writeln('СОБСТВЕННОЕ ЗНАЧЕНИЕ R=',g:10:5);
writeln;
writeln('СОБСТВЕННЫЙ ВЕКТОР Y');
for i:=1 to n do
write(Y[i]:10:5);
end.