特征值与特征向量计算中deflation方法代码仅返回首个特征值问题咨询
代码问题定位
- 幂法迭代初始向量未重置:你在全局初始化了
X变量,第一轮迭代结束后X存储的是首个特征向量,后续迭代没有重置X为随机初始值,进入下一轮幂法循环时,Y/norm(Y)和X/norm(X)的差直接满足精度要求,幂法循环完全不执行,因此每轮都返回第一轮的特征向量,无法计算后续特征值。 - 左特征向量迭代初始值未重置:
XG同样在全局初始化,求当前特征值对应左特征向量的幂法循环,除了第一轮外后续都不会执行,得到的左特征向量完全错误,导致Wielandt收缩步骤失效,收缩后的矩阵并没有移除当前已计算的特征值,后续迭代自然无法得到下一个最大特征值。 - 非零索引变量
j未重置:j在全局初始化为1,第一轮找到第一个非零元素的索引后,后续迭代不会重置j,如果新的特征向量对应j位置的元素为0,特征值计算步骤会直接跳过,Vp对应位置会保留初始值0,出现错误结果。 - 特征值计算逻辑可优化:用对应位置元素相除求特征值的稳定性差,替换为瑞利商计算可以避免查找非零索引的步骤,同时计算精度更高。
修正后代码
function [Vect,Vp]=PID(A,precision) nbVal= 50; [n,m]=size(A); max_iter = min(nbVal,n); Vect=zeros(n,max_iter); Vp=zeros(1,max_iter); for i=1:max_iter % 每轮幂法前重置右特征向量初始值 X = rand(n,1); Y = A*X; % 幂法求当前最大特征值对应的右特征向量 while (max(abs(Y/norm(Y)-X/norm(X)))>=precision) X=Y/norm(Y); Y=A*X; end Vect(:,i)=X; % 用瑞利商计算特征值,稳定性更强 Vp(1,i) = (X'*A*X)/(X'*X); % 重置左特征向量初始值 XG = rand(1,n); YG = XG*A; % 求当前特征值对应的左特征向量 while (max(abs(YG/norm(YG)-XG/norm(XG)))>=precision ) XG=YG/norm(YG); YG=XG*A; end % Wielandt收缩,移除当前已计算的最大特征值 A = A - Vp(1,i)*(X*XG)/(XG*X); end end
内容的提问来源于stack exchange,提问作者Yassine_klk
相关产品推荐
相关产品推荐

