数值分析 反幂法求矩阵按模最小特征值 MATLAB实现

值分析第四版 颜庆津 计算实习题P238

结果:


%function [lam]=jingmi(ep)

%反幂法求矩阵按模最小特征值

%2015.11.8 密密编写  (*^__^*) 嘻嘻……

 

 

function [lam]=jingmi(ep)%lam是A的按模最小的特征值

%初始化

   n=501;

   a=1:n;%存储A的主对角线元素

   for i=1:n

       a(i)=(1.64-0.024*i)*sin(0.2*i)-0.64*exp(0.1/i);

   end

   b=0.16;

   c=-0.064;

   u0=ones(n,1);%迭代初始向量

   u1=ones(n,1);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%第一次迭代   

        m=sqrt(u0'*u0);

   y=u0/m;

%以下代码功能:三角分解法,从线性方程组A*u1=y求解u1

b0=y;

   L=zeros(3,n);

   U=zeros(3,n);

   

   %L中的主对角线元素均为1

   for i=1:n

        L(1,i)=1;

   end

%%%%%%%%%%%%%%%%%%%%%%doolittle分解,第一部分A=LU

   for k=1:n

      

       for j=k:min(k+2,n) %计算 U(k,j)

           sum=0; %临时和

           M=[1,k-2,j-2];%存储t的初始量备选值,t取M中的最大值

           for t=max(M):k-1

                sum=sum+L(k-t+1,t)*U(t-j+3,j);

           end

          %%%%%%以下程序功能相当于语句U(k,j)=A(k,j)-sum; %计算L的第k列元素

 

          if k==j

                U(k-j+3,j)=a(k)-sum;

           else if j==k+1

                    U(k-j+3,j)=b-sum;

                else if j==k+2

                       U(k-j+3,j)=c-sum;

                    end

                end

          end

          %%%%%%以上程序功能相当于语句U(k,j)=A(k,j)-sum; %计算L的第k列元素

       end

 

    

       for i=k+1:min(k+2,n)%计算 L(i,k)

           sum=0; %临时和

           M=[1,i-2,k-2];%存储t的初始量备选值,t取M中的最大值

           for t=max(M):k-1

                sum=sum+L(i-t+1,t)*U(t-k+3,k);

           end          

           %%%%%%以下程序功能相当于语句  L(i,k)=(A(i,k)-sum)/U(k,k);%计算U的第k行元素

           if k==i-1

                L(i-k+1,k)=(b-sum)/U(k-k+3,k);

           else if k==i-2

                   L(i-k+1,k)=(c-sum)/U(k-k+3,k);

                end

           end

           %%%%%%以上程序功能相当于语句L(i,k)=(A(i,k)-sum)/U(k,k);%计算U的第k行元素

       end

   end

%%%%%%%%%%%%%%%%%%%%%%第二部分,求解Ly0=b1和Ux0=y0

   y0=zeros(n,1);

   x0=zeros(n,1);

   y0(1)=b0(1);

   for i=2:n %解y0

       sum=0;

       for t=max(1,i-2):i-1

           sum=sum+L(i-t+1,t)*y0(t);

       end

       y0(i)=b0(i)-sum;

   end

   x0(n)=y0(n)/U(n-n+3,n);

   for i=n-1:-1:1  %解x0

       sum=0;

       for t=i+1:min(i+2,n)

           sum=sum+U(i-t+3,t)*x0(t);

       end

       x0(i)=(y0(i)-sum)/U(i-i+3,i);

   end

   %%%%%%%%%%%%%%%%%%%%doolittle三角分解求解线性方程组Ax=b,结束。

   u1=x0;%返回结果

%以上代码功能:三角分解法,从线性方程组A*u1=y求解u1

   

   x_prior=y'*u1;

   err=1;

   u0=u1;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%循环迭代开始

 while(err>ep)

   m=sqrt(u0'*u0);

   y=u0/m;

%以下代码功能:三角分解法,从线性方程组A*u1=y求解u1

 b0=y;

   L=zeros(3,n);

   U=zeros(3,n);

   

   %L中的主对角线元素均为1

   for i=1:n

       L(i-i+1,i)=1;

   end

%%%%%%%%%%%%%%%%%%%%%%doolittle分解,第一部分A=LU

   for k=1:n

      

       for j=k:min(k+2,n) %计算 U(k,j)

           sum=0; %临时和

           M=[1,k-2,j-2];%存储t的初始量备选值,t取M中的最大值

           for t=max(M):k-1

                sum=sum+L(k-t+1,t)*U(t-j+3,j);

           end

          %%%%%%以下程序功能相当于语句U(k,j)=A(k,j)-sum; %计算L的第k列元素

 

          if k==j

                U(k-j+3,j)=a(k)-sum;

           else if j==k+1

                    U(k-j+3,j)=b-sum;

                else if j==k+2

                        U(k-j+3,j)=c-sum;

                    end

                end

          end

          %%%%%%以上程序功能相当于语句U(k,j)=A(k,j)-sum; %计算L的第k列元素

       end

 

    

       for i=k+1:min(k+2,n)%计算 L(i,k)

           sum=0; %临时和

           M=[1,i-2,k-2];%存储t的初始量备选值,t取M中的最大值

           for t=max(M):k-1

                sum=sum+L(i-t+1,t)*U(t-k+3,k);

           end          

           %%%%%%以下程序功能相当于语句  L(i,k)=(A(i,k)-sum)/U(k,k);%计算U的第k行元素

           if k==i-1

                L(i-k+1,k)=(b-sum)/U(k-k+3,k);

           else if k==i-2

                   L(i-k+1,k)=(c-sum)/U(k-k+3,k);

                end

           end

           %%%%%%以上程序功能相当于语句L(i,k)=(A(i,k)-sum)/U(k,k);%计算U的第k行元素

       end

   end

%%%%%%%%%%%%%%%%%%%%%%第二部分,求解Ly0=b1和Ux0=y0

   y0=zeros(n,1);

   x0=zeros(n,1);

   y0(1)=b0(1);

   for i=2:n %解y0

       sum=0;

       for t=max(1,i-2):i-1

           sum=sum+L(i-t+1,t)*y0(t);

       end

       y0(i)=b0(i)-sum;

   end

   x0(n)=y0(n)/U(n-n+3,n);

   for i=n-1:-1:1  %解x0

       sum=0;

       for t=i+1:min(i+2,n)

           sum=sum+U(i-t+3,t)*x0(t);

       end

       x0(i)=(y0(i)-sum)/U(i-i+3,i);

   end

   %%%%%%%%%%%%%%%%%%%%doolittle三角分解求解线性方程组Ax=b,结束。

   u1=x0;%返回结果

%以上代码功能:三角分解法,从线性方程组A*u1=y求解u1

   lam=y'*u1;

   err=abs(lam-x_prior)/abs(lam);

   u0=u1;

   x_prior=lam;

  end

   lam=y'*u1;

   err=abs(lam-x_prior)/abs(lam);

   u0=u1;

   x_prior=lam;

end

lam=1/lam;

end

你可能感兴趣的:(matlab,数值分析,反幂法)