Разработать программу на языке MATLAB(Scilab), реализующую вычисление собственных значений матрицы (в соответствии с вариантом) QR-алгоритмом и встроенной в MATLAB(Scilab) функцией.
A=-288154-112
2. Применить программу для нахождения собственных значений заданной матрицы (QR- алгоритм и встроенная функция).
3. В случае невозможности вычисления собственных значений матрицы (в соответствии с вариантом) QR-алгоритмом необходимо подробно разъяснить причину и предложить вариант изменения условий таким образом, чтобы собственные значения можно было вычислить указанным численным методом
Решение
Запишем две подпрограммы – одна из них реализует простое QR – разложение матрицы А, а другая организует процедуру поиска собственных чисел.
%процедура определения собственных чисел
function [ R, Q ] = QRSobstv( A )
%находим собственные числа - на диагонали матрицы R
eps=1;
[ Q, R ] = QRrazl( A );
A=R*Q;
e1=diag(R);
%с точностью 10^(-10)
while eps>10^(-10)
[ Q, R ] = QRrazl( A );
A=R*Q;
eps=max(abs(e1-diag(R)));
e1=diag(R);
end
%матрица Q может получиться не единичной, а с (-1) на главной диагонали,
%(т.е
. собственные числа будут других знаков), поэтому исправляем это:
R=R*Q;
Q=A/R;
end
%QR разложение
function [ Q, R ] = QRrazl(A)
n = length(A(1,:));
Q=eye(n);
for i=1:(n-1)
% а - i столбец активной матрицы целиком
a=A(1:n,i:i);
% первые i-1 значений обнуляем
if (i~=1)
for j=1:(i-1) a(j)=0;
end
end
% i-ое значение изменяем согласно методу Хаусхолдера
a(i)=a(i)+sign(a(i))*norm(a,2);
H=eye(n)-2*(a*a')/(a'*a);
%Получаем QR разложение:
Q=Q*H;
A=H*A;
end
R=A;
end
Применяем программу для нахождения собственных значений заданной матрицы, сравниваем со встроенной функцией:
clear all
%нахождение собственных чисел
A=[-2 8 8; 1 5 4; -1 1 2];
[ R, Q ] = QRSobstv( A );
for i=1:length(A)
fprintf('%d - ое собственное число равно %f\n',i, R(i,i));
end
%сравнение с встроенной в MATLAB функцией
fprintf('Собственные числа с помощью встроенной функции eig:\n');
disp(eig(A))
Получили:
Таким образом, собственные числа: 6; -2; 1.