创建博客 登录  
 加关注
   显示下一条  |  关闭

(((silence)))

#define if(...) if(!(__VA_ARGS__))

 
 
 

日志

 
 

期末实现了一坨C++数值算法[8] 幂法  

2009-12-30 12:40:05|  分类: 编程 |  标签: |字号 订阅

幂法这个倒有点复杂的说,我也说不清,所以还是请移步 wikipedia

我也抄点说明:

wps_clip_image-31有n个线性无关的特征向量wps_clip_image-96,而相应的特征值满足wps_clip_image-133,则对任意非零初始向量wps_clip_image-171,按下列公式构造向量序列:

wps_clip_image-213      其中max(Vk)表示wps_clip_image-277中模最大的分量

并有

wps_clip_image-326wps_clip_image-355

幂法求矩阵的特征值和主特征向量步骤如下:

①任给n维初始向量wps_clip_image-454

②按wps_clip_image-500计算wps_clip_image-529

③若k+1从某个数以后分量之比

wps_clip_image-620(常数)(i=1,2,…,n)则wps_clip_image-681,而wps_clip_image-710即是与wps_clip_image-740对应的一个近似特征向量.

 

 

===== 下面是我的实现 =====

 

// 返回值是特征向量后面再加上一个特征值——这样的确丑陋,但也方便,嗯哼。

NA::VecDP powerMethod ( NA::MatDP const& A , double eps )
{
    const int n=A.cols();
    NA_ASSERT(n==A.rows());
    NA::MatDP V(1.0, n, 1 ), U(1.0, n, 1 );
    double maxV = 0.0;
    double lambda = 1e100;
    int i;
    for(bool success=false; !success;) {
        V = mult (A, U);
        TRACE("V: ( %f %f %f )T    ", V[0][0], V[1][0], V[2][0] );
        maxV=0.0;
        for( i=0; i<n; ++i )
            if ( fabs(V[i][0])>maxV )
                maxV = fabs(V[i][0]);
        TRACE("m: %f    ", maxV);
        V = mult (V, 1.0/maxV);
        if ( fabs(lambda-maxV) < eps ) {
            TRACE("\nFound: lambda = %f\n\n", maxV);
            success=true;
        }
        lambda = maxV;
        V.swap(U);
        TRACE("U: ( %f %f %f )T\n", U[0][0], U[1][0], U[2][0] );
        // PAUSE();
    }
    NA::VecDP vec(U.bits(),n+1);
    vec[n]=lambda;
    return vec;
}

 

OVER

  评论这张
转发至微博
转发至微博
0   分享到:        
阅读(224)| 评论(4)| 不可引用 |举报
<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--相关文章--> <#--历史上的今天--> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2012