#公式与实现# Jacobi迭代 Gauss-Seidel迭代

程序实现:

double MaxOfList(vector<double>x){  
    double max=x[0];  
    int n=x.size();  
    for(int i=0;i<n;i++)  
        if(x[i]>max) max=x[i];  
    return max;  
}
//雅可比迭代公式  
void Jacobi(vector<vector<double> > A,vector<double> B,int n){  
    vector<double> X(n,0);  
    vector<double> Y(n,0);  
    vector<double> D(n,0);  
    int k=0; //记录循环次数  
    do{   
        X=Y;  
        for(int i=0;i<n;i++){  
            double sum=0;  
            for(int j=0;j<n;j++){  
                if(i!=j) sum += A[i][j]*X[j];  
            }  
            Y[i]=(B[i]-sum)/A[i][i];  
            cout<<left<<setw(8)<<Y[i]<<" ";  
        }  
        cout<<endl;  
        k++;  
          
        for(int a=0;a<n;a++){  
            D[a]=X[a]-Y[a];  
        }  
    }while( MaxOfList(D)>0.00001 || MaxOfList(D)<-0.00001);  
      
    return ;  
}  

//高斯赛让德迭代公式  
void GaussSeidel(vector<vector<double> > A,vector<double> B,int n){  
    vector<double> X(n,0);  
    vector<double> Y(n,0);  
    vector<double> D(n,0);  
    int k=0; //记录循环次数  
    do{   
        Y=X;  
        for(int i=0;i<n;i++){  
            double sum=0;  
            for(int j=0;j<n;j++){  
                if(i!=j) sum += A[i][j]*X[j];  
            }  
            X[i]=(B[i]-sum)/A[i][i];  
            cout<<left<<setw(8)<<X[i]<<" ";  
        }  
        cout<<endl;  
        k++;  
          
        for(int a=0;a<n;a++){  
            D[a]=X[a]-Y[a];  
        }  
    }while( MaxOfList(D)>0.00001 || MaxOfList(D)<-0.00001);  
      
    return ;  
}  
对比

Jacobi

Gauss-Seidel

对应程序实现中,只需用新生成的X值,直接覆写掉原来的X值即可,但是最后为了查看是否达到迭代精度,需要暂存一趟迭代的结果。

程序引用:
【数值分析】迭代法解方程:牛顿迭代法、Jacobi迭代法
http://blog.csdn.net/xiaowei_cqu/article/details/8585703

很好的讲义地址
华东师范大学 矩阵计算 讲义
http://math.ecnu.edu.cn/~jypan/Teaching/MatrixComp/index.html

另一个程序引用:
Jacobi迭代法的思想及C语言编程
http://wenku.baidu.com/link?url=hF1RZMfra4htZ33k6HY8rHXkEQ2hAZGREnOBUSB12zfChPPTJomCgd3pEcHhNNO69s4ahW3wUy6aI6ctB_6HXsLtNAMOF6bHAP6u-IvZVMW
Gauss-seidel迭代法的思想及C语言编程
http://wenku.baidu.com/link?url=QYNW-VS5YrLnbjaQH-LIwky7FIOv8GbcQpDq5NFNFQUATIgTDwW2ANSuKYQZ5RGtdSCWtm1SIqLGsAXc8zEKDSd-Bsca5UxcNiaMJz3gzGe

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是JacobiGauss-Seidel代法的C++代码示例: Jacobi代法: ```c++ #include <iostream> #include <cmath> using namespace std; const int N = 100; const double eps = 1e-5; int n; double a[N][N], b[N], x[N]; void Jacobi() { double y[N]; int k = 0; while (k < 1000) { double delta = 0; for (int i = 0; i < n; i++) { y[i] = b[i]; for (int j = 0; j < n; j++) { if (i != j) { y[i] -= a[i][j] * x[j]; } } y[i] /= a[i][i]; delta += (y[i] - x[i]) * (y[i] - x[i]); } if (sqrt(delta) < eps) { break; } for (int i = 0; i < n; i++) { x[i] = y[i]; } k++; } } int main() { cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> a[i][j]; } cin >> b[i]; x[i] = 0; } Jacobi(); for (int i = 0; i < n; i++) { printf("%.6lf ", x[i]); } cout << endl; return 0; } ``` Gauss-Seidel代法: ```c++ #include <iostream> #include <cmath> using namespace std; const int N = 100; const double eps = 1e-5; int n; double a[N][N], b[N], x[N]; void Gauss_Seidel() { int k = 0; while (k < 1000) { double delta = 0; for (int i = 0; i < n; i++) { double y = b[i]; for (int j = 0; j < n; j++) { if (i != j) { y -= a[i][j] * x[j]; } } y /= a[i][i]; delta += (y - x[i]) * (y - x[i]); x[i] = y; } if (sqrt(delta) < eps) { break; } k++; } } int main() { cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> a[i][j]; } cin >> b[i]; x[i] = 0; } Gauss_Seidel(); for (int i = 0; i < n; i++) { printf("%.6lf ", x[i]); } cout << endl; return 0; } ``` 以上是JacobiGauss-Seidel代法的C++代码示例,其中`N`为方程组的最大维数,`eps`为代精度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值