特征值和向量计算中的紧缩(幂法)
Deflation in Eigen value and vector computation (Power method )
我有以下(编辑过的)代码,用于使用幂级数方法(通过紧缩技术)计算小矩阵的所有特征值和向量:
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
是幂法,这里没有幂级数。
一个明显的问题是您假设左特征向量等于右特征向量。这仅适用于对称(和正规)矩阵。如果你使用任何其他矩阵,特征值计算正确是一个奇迹。
我有以下(编辑过的)代码,用于使用幂级数方法(通过紧缩技术)计算小矩阵的所有特征值和向量:
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
是幂法,这里没有幂级数。
一个明显的问题是您假设左特征向量等于右特征向量。这仅适用于对称(和正规)矩阵。如果你使用任何其他矩阵,特征值计算正确是一个奇迹。