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

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

А = , 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.


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



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