2016-02-17 1 views
0

У меня есть следующие (под редакцией) код для вычисления всех значений собственных и векторов небольшой матрицы с использованием метода степенной ряд (по методике дефлятирования):Дефляция в значении Эйгеном и вектора вычисления (метод питания)

function [eigvect,eigval]=eigen2(A,x0,nit) 
% calculates the largest eigenvalue and corresponding eigenvector of 
% matrix A by the power method using x0 as the starting vector and 
% carrying out nit interactions. 
% 
eigval=0; 
siz=size(A); 
siz=siz(1); 
for m=1:siz 
x = x0;t=x0; 
for n = 1:nit 
xnew = A*x; 
lambda = norm(xnew,inf); 
tnew=transpose(A)*t;% computing left eigenvectors 
x1=x; 
x=xnew/lambda; 
x2=x; 
t1=t; 
t=tnew/lambda; 
t2=t; 
end 
x = x/(norm(x)); %normalise x 
t=t/(norm(t)); 
eigvect(:,m)=x; 
eigval(m)=lambda; 
teigvect(:,m)=t; 
% eigvect 
Anew=A-x*transpose(x)*A*x*transpose(x); 
A=Anew; 
fprintf('\n lambda= %f',lambda); 
end 
teigvect 
fprintf('n = %4d normalised x = %g %g %g\n', n, x'); 
% eigval 
%end 

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

Может ли кто-нибудь указать, где ошибка?

EDIT1: Поскольку правый и левый собственные векторы равны в симметричной матрице, я не включаю левый собственный вектор в вычисление Anew.

Тестовые:

вычисленные с использованием от Matlab встроенного собственных векторов функции:

A=[ 2 1 2; 1 2 1; 2 1 2]; 

[v,d]=eig(A) 

v = 

    0.7071 0.3251 0.6280 
    0.0000 -0.8881 0.4597 
    -0.7071 0.3251 0.6280 

d = 

    -0.0000   0   0 
     0 1.2679   0 
     0   0 4.7321 

Результат функции eigen2:

[r,s]=eigen2(A,[3 7 8]',100) 

lambda= 4.732051 
lambda= 1.267949 
lambda= 0.000000 
r = 

    0.6280 -0.3251 0.7071 
    0.4597 0.8881   0 
    0.6280 -0.3251 0.7071 

s = 

    4.7321 1.2679 0.0000 
+0

Приложите к сведению один из ваших тестовых примеров, который поступил не так, и ожидаемый результат. – LutzL

ответ

1

Это метод питания, здесь нет серии мощности.


Одна очевидная проблема заключается в том, что вы считаете, что левый собственный вектор равен правому собственному вектору. Это справедливо только для симметричных (и нормальных) матриц. Если вы используете какую-либо другую матрицу, удивительно, что собственные значения вычисляются правильно.

+0

Не могли бы вы упомянуть строки кода, которые это делают? Было бы очень полезно. – Shubashree

+0

'Anew = A-lambda * x * transpose (x);', второй 'x' должен быть левым собственным вектором' y', с 'transpose (y) * A = lambda * transpose (y)'. Или вы нацелены на нормальную форму Смита (?), Тогда собственные векторы должны образовывать ортонормированный базис и применяется ваша форма дефляции. – LutzL

+0

Привет. В настоящее время я рассматриваю симметричную матрицу как входной сигнал и все же не получаю правильный ответ. Я тоже не могу понять эту ошибку. Я документировал ответ вместе с тестовым примером. Векторы отличаются отрицательным знаком. – Shubashree