own

function [l,lN]=myeig(A,p,N,tol)
%幂法,反幂法,QR法,本次实验我写的是幂法
% tol 精度
if nargin<4
    tol=eps;
end
% N 迭代次数
if nargin<3
    N=17;
end
% p 原点平移的量
if nargin<2
    p=0;
end
n=size(A,1);
B=A-p*eye(n);
% v的初始值,全 1 向量
v=ones(n,1);
u=v;
% 每次迭代的特征值
lN=zeros(1,N);
lN(1)=signmax(v)+p;
%从第2个开始迭代
for i=2:N
 %幂法 是相乘
           v=B*u;
% 每次迭代取得是绝对值最大的,调用 signmax 函数
           u=v/signmax(v);
% 存储每次的特征值
           N(i)=signmax(v)+p;
%前后两次的差如果小于精度,找到特征值,跳出循环
            if abs(lN(i)-lN(i-1))<tol
                break
            end
        end
        l=lN(i);
%     case 2
%         B=A-p*eye(n);
%         v=ones(n,1);
%         u=v;
%         lN=zeros(1,N);
%         lN(1)=1/signmax(v)+p;
%         for i=2:N
%             v=B\u;
%             u=v/signmax(v);
%             lN(i)=1/signmax(v)+p;
%             if abs(lN(i)-lN(i-1))<tol
%                 break
%             end
%         end
%         l=lN(i);
%     case 3
%         p=A(n,n);
%         lN=zeros(n,N);
%         lN(:,1)=diag(A);
%          for i=2:N
%              [Q,R]=qr(A-p*eye(n));
%              A=R*Q+p*eye(n);
%              p=A(n,n);
%              lN(:,i)=diag(A);
%              if norm(tril(A,-1),Inf)<tol
%                  break
%              end
%          end
%          l=lN(:,i);
% 从一组数中得到绝对值最大的一个数,返回位置
    function mx=signmax(x)
        [~,k]=max(abs(x));
        mx=x(k);
    end
end


Guess you like

Origin blog.csdn.net/weixin_48450741/article/details/112464680
own