function varargout=antipow(A,u0,ep,maxiter)
% ANTIPOW 反幂法求矩阵按模最小的特征值及特征向量
if nargin<4
maxiter=100; % 默认最大迭代次数
end
if nargin<3 || isempty(ep)
ep=1e-8; % 默认精度
end
if nargin<2 || isempty(u0)
u0=ones(size(A,1),1); % 默认初始特征向量
end
iter=1; % 迭代次数初始值
exitflag=1; % 迭代收敛标志,1-收敛;0-发散
us(iter,:)=u0; % 特征向量迭代序列
[~,I]=max(abs(u0)); % 求u0中绝对值最大的元素位置
m0=u0(I); % 初始特征值
ms(iter,1)=m0; % 特征值迭代序列
[L,U]=lu_decom(A); % 将矩阵A进行LU分解
while 1
y=flipud(triu_solve(rot90(L,2),flipud(u0(:)))); % 求下三角形方程组Ly=u0
u=triu_solve(U,y); % 求上三角形方程组Uu=y
[~,ind]=max(abs(u)); % 求特征向量u中绝对值最大的元素位置
m=u(ind); % 特征向量u中绝对值最大的元素
u0=u/m; % 归一化特征向量
ms(iter+1,1)=m; % 将迭代得到的特征值存入特征值迭代序列
us(iter+1,:)=u0; % 将迭代得到的特征向量存入特征向量迭代序列
if abs(m-m0)<=ep % 满足精度要求
break % 退出循环
end
m0=m; % 更新特征值
iter=iter+1; % 迭代次数累加
if iter>maxiter % 若迭代次数大于最大迭代次数,认为迭代发散
exitflag=0; % 置迭代收敛标志为0
break % 退出循环
end
end
[varargout{1:6}]=deal(1/m,... % 第一个输出参数为特征值
u0,... % 第二个输出参数为特征向量
exitflag,... % 第三个输出参数为迭代敛散性标志
iter,... % 第四个输出参数为迭代次数
1./ms,... % 第五个输出参数为特征值序列
us); % 第六个输出参数为特征向量序列