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

(((silence)))

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

 
 
 

日志

 
 

期末实现了一坨C++数值算法[5] 雅克比迭代法和高斯-赛德尔迭代法  

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

懒得抄算法说明了,请移步wikipedia:

Jacobi 迭代法:http://en.wikipedia.org/wiki/Jacobi_method

Gauss-Seidel 迭代法:http://en.wikipedia.org/wiki/Gauss%E2%80%93Seidel_method

 

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

依赖项:向量与矩阵类

 

NA::VecDP jacobiIteration ( NA::MatDP const& a, // 系数矩阵
                            NA::VecDP const& b, // 右端向量
                            double    const  eps,       // 精度
                            int       const  M )        // 最多迭代次数
{
    NA::VecDP y(0.0, b.size());
    NA::VecDP x(0.0, b.size());
    double  tmp, maxXY;
    for ( int m=0; m<M ; ++m ) {
        maxXY = 0;
        for ( int i=0; i<b.size(); ++i ) {
            tmp = 0;
            for ( int j=0; j<b.size(); ++j ) {
                tmp+=x[j]*a[i][j];
            }
            tmp-=x[i]*a[i][i];
            y[i] = (b[i]-tmp)/a[i][i];

            tmp = fabs(x[i]-y[i]);
            if (tmp>maxXY)
                maxXY=tmp;
        }

        if (maxXY<eps)
            return y;
        x=y;
    }
    return NA::VecDP(0);
}

 

// 高斯-赛德尔迭代法
NA::VecDP gaussSeidelIteration (
                            NA::MatDP const& a,    // 系数矩阵
                            NA::VecDP const& b,    // 右端向量
                            double    const  eps,  // 精度
                            int       const  M )   // 最多迭代次数
{
    NA::VecDP y(0.0, b.size());
    NA::VecDP x(0.0, b.size());
    double  tmp, maxXY;
    for ( int m=0; m<M ; ++m ) {
        maxXY = 0;
        for ( int i=0; i<b.size(); ++i ) {
            tmp = 0;
            for ( int j=0; j<b.size(); ++j ) {
                tmp+=x[j]*a[i][j];
            }
            tmp-=x[i]*a[i][i];
            x[i] = (b[i]-tmp)/a[i][i];   // 这里直接用新的值取代了旧的,而不是先放在向量 y 中

            tmp = fabs(x[i]-y[i]);
            if (tmp>maxXY)
                maxXY=tmp;
        }

        if (maxXY<eps)
            return y;
        y=x; // 为了判断循环终止条件,还是保留了 y
    }
    return NA::VecDP(0);
}

 

 

 

OVER

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

页脚

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