冪法求解矩陣特徵值及特徵向量_演算法

來源:互聯網
上載者:User
  冪法求解矩陣特徵值及特徵向量



【演算法原理】
冪法是通過求矩陣特徵向量來求出特徵值的一種迭代法.其基本思想是:若我們求某個n階方陣A的特徵值和特徵向量,先任取一個初始向量X(0),構造如下序列:
       X(0)  ,X(1)  =AX(0)  ,X(2)  =AX(1) ,…, X(K)  =AX(K+1)  ,…  ⑴
       當k增大時,序列的收斂情況與絕對值最大的特徵值有密切關係,分析這一序列的極限,即可求出按模最大的特徵值和特徵向量.
       假定矩陣A有n個線性無關的特徵向量.n個特徵值按模由大到小排列:
                         │λ1│>=│λ2│>=…>=│λn│              ⑵
    其相應的特徵向量為:
                         V1 ,V2 , …,Vn                                       ⑶
     它們構成n維空間的一組基.任取的初始向量X(0)由它們的線性組合給出
                         X(0)=a1V1+a2V2+…+anVn                         ⑷
     由此知,構造的向量序列有
          X(k)  =AX(k-1) = A2X(k-2) =…=AkX(0)  = a1λ1kV1+a2 λ2kV2+…+anλnkVn                    ⑸
   下面按模最大特徵值λ1是單根的情況討論:
      
 由此公式(5)可寫成
                   X(k) = λ1k (a1V1+a2 (λ2/λ1)kV2+…+an(λn/λ1)kVn  )       ⑹ 
   若a1≠0,由於|λi/λ1 |<1 (i≥2),故k充分大時,
                  X(k) = λ1k (a1V1+εk)
    其中εk為一可以忽略的小量,這說明X(k)與特徵向量V1相差一個常數因子,即使a1=0,由於計算過程的舍入誤差,必將引入在方向上的微小分量,這一分量隨著迭代過程的進展而逐漸成為主導,其收斂情況最終也將與相同。
特徵值按下屬方法求得:
            λ1 ≈Xj(k+1)/ Xj(k)                                        ⑺
其中Xj(k+1), Xj(k)分別為X(k+1),X(k)的第j各分量。
    實際計算時,為了避免計算過程中出現絕對值過大或過小的數參加運算,通常在每步迭代時,將向量“歸一化”即用的按模最大的分量         max  |Xj(k)| 1≤j≤n
去除X(k)的各個分量,得到歸一化的向量Y(k),並令X(k+1) = AY(k)


由此得到下列選代公式 :
          Y(k) = X(k)/║ X(k)║∞
           X(k+1) = AY(k)           k=0,1,2,…             ⑻
當k充分大時,或當║ X(k)- X(k+1)║<ε時,
          Y(k)≈V1
          max  |Xj(k)| ≈ λ1                                ⑼
          1≤j≤n
【演算法描述】

設矩陣 有 個線性無關的特徵向量,主特徵值 滿足

                   ,則 ,下式構造的向量序列 
                       
           
     
              有     ,  

【原始碼】

//////////////////////////////////////////////////////
//冪法求矩陣特徵值      // 
//author:zhiyong fang           //
//date:15/11/2004              //
////////////////////////////////////////////////////
#include <iostream.h>
#include <math.h>
#define N 3
void matrixx(double A[N][N],double x[N],double v[N])
{
    for(int i=0;i<N;i++)
          {
            v[i]=0;
            for(int j=0;j<N;j++)
                v[i]+=A[i][j]*x[j];
          }
    
}
double slove(double v[N])
{
    double max;
    for(int i=0;i<N-1;i++) max=v[i]>v[i+1]?v[i]:v[i+1];
    return max;
}
void main()    
{
    //data input
double A[N][N]={1.0,1.0,0.5,1.0,1.0,0.25,0.5,0.25,2.0};
    double x[N]={1,1,1};
    double v[N]={0,0,0};
    double u[N]={0,0,0};
    double p[N]={0,0,0};
    double e=1e-10,delta=1;
    int k=0;
    while(delta>=e)
    {
                for(int q=0;q<N;q++) p[q]=v[q];
        matrixx(A,x,v);
        for(int i=0;i<N;i++) u[i]=v[i]/(slove(v));
        delta=fabs(slove(v)-slove(p));
        k++;
        for(int l=0;l<N;l++) x[l]=u[l];
    }
    cout << "迭代次數" << k << endl;
    cout << "矩陣的特徵值" << slove(v) << endl;
    cout << "(" ;
    for(int i=0;i<N;i++) cout << u[i] << " " ;
    cout  << ")" << endl;

[checkdata]
未經處理資料
double A[N][N]={1.0,1.0,0.5,1.0,1.0,0.25,0.5,0.25,2.0};
    double x[N]={1,1,1};
    double v[N]={0,0,0};
    double u[N]={0,0,0};
    double p[N]={0,0,0};
    double e=1e-10,delta=1;
輸出結果
迭代次數41
矩陣的特徵值2.53653
(0.748221 0.649661 1 )

精度滿足要求,程式設計及演算法合理  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.