打印

幂法求解最大特征值

[复制链接]
1720|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2018-12-4 09:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <iostream>
#include <math.h>
#include <string.h>

using namespace std;

#define  N (3)

/************************************************************************/
/*
        求向量按模最大值(相当于向量的无穷范数)
*/
/************************************************************************/
double GetMax(double *Array)
{
        double max=0;
        for (int i=0;i<N;++i)
        {
                if (max < fabs(*(Array+i)))
                {
                        max = fabs(*(Array+i));
                }
        }
        return max;
}

/************************************************************************/
/*
        矩阵相乘函数
*/
/************************************************************************/
void matrixMulti(double array[3][3],double *a0)
{
        int i ,j;
        double *result = new double[3];
        memset(result,0,3*sizeof(double));

        for (i=0;i<N;++i)
        {       
               
                for (j =0;j<N;++j)
                {
                        result[i]+=array[i][j]*a0[j];
       
                }
                cout<<"a0["<<i<<"]=" <<result[i]<<endl;       
        }
        for (i=0;i<N;++i)
        {
                *(a0+i)=result[i];
        }
        delete [] result;
}

int main()
{
        double array[N][N] = {{6,-12,6},{-21,-3,24},{-12,-12,51} };        //矩阵A
        double a0[N]={1,0,0};                //初始向量
        int count=0;                //迭代次数
        double maxElemt1,maxElemt2;
        do
        {       
                ++count;               
            maxElemt1=GetMax(a0);

                for (int j=0 ;j<N;++j)
                {
                        *(a0+j)=*(a0+j)/maxElemt1;                //列向量归一化
                }
                matrixMulti(array,a0);               
                maxElemt2 = GetMax(a0);
                cout<<"maxElemt2 = "<<maxElemt2<<endl<<endl;
        }while(fabs((maxElemt2-maxElemt1)/maxElemt1 )> 0.00000001);
        cout<<"迭代次数n = "<<count<<endl;;
        cout<<"特征值="<<maxElemt2<<endl;

        return 0;
}

相关帖子

沙发
keer_zu|  楼主 | 2018-12-4 09:51 | 只看该作者
【算法原理】
幂法是通过求矩阵特征向量来求出特征值的一种迭代法.其基本思想是:若我们求某个n阶方阵A的特征值和特征向量,先任取一个初始向量X(0) (注:x(0)可以用A的特征向量线性表示),构造如下序列:
       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

使用特权

评论回复
板凳
keer_zu|  楼主 | 2018-12-4 09:54 | 只看该作者
nm-chapter3.pdf (258.64 KB)

@sherwin @gaoyang9992006

参看主题


使用特权

评论回复
地板
sherwin| | 2018-12-5 09:18 | 只看该作者
keer_zu 发表于 2018-12-4 09:54
@sherwin @gaoyang9992006

参看主题

呃,惭愧啊惭愧,我的数学知识,基本都还给体育老师了。  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1349

主题

12426

帖子

53

粉丝