Gauss-Seidel迭代法-C++

背景

Gauss-Seidel迭代法是基于Jacobi迭代法的改进,旨在通过利用已更新的近似解来加速迭代过程,从而更快地逼近线性方程组的解。该方法特别适用于求解对称正定矩阵或对角占优的线性方程组。

优点

  1. 收敛速度较快:与Jacobi迭代法相比,Gauss-Seidel迭代法由于利用了已更新的解来计算新的近似值,因此在许多情况下能够更快地收敛到方程组的解。
  2. 内存占用较少:Gauss-Seidel迭代法只需要存储一组解向量,因此相对于其他直接解法(如高斯消元法),它占用的内存资源较少,特别适用于内存受限的环境。
  3. 适用范围广:对于一些不满足对角占优条件的方程组,Gauss-Seidel迭代法仍然可以求解,而Jacobi迭代法则可能发散。这使得Gauss-Seidel迭代法在处理更广泛的线性方程组时具有更高的灵活性。
  4. 适合求解大规模稀疏矩阵:由于每次迭代只需要存储部分已知解,Gauss-Seidel迭代法特别适用于求解大规模稀疏矩阵的线性方程组,这在数值分析和科学计算中非常常见。

缺点

  1. 收敛性不稳定:Gauss-Seidel迭代法的收敛性依赖于方程组的系数矩阵的特征值分布。如果特征值分布不均匀,可能会导致收敛速度很慢,甚至无法收敛。因此,在使用Gauss-Seidel迭代法之前,通常需要对方程组的系数矩阵进行一定的预处理或分析。
  2. 不适用于并行计算:Gauss-Seidel迭代法的计算过程是顺序的,即每次迭代都需要等待上一次迭代的结果,这使得它不适合并行计算。在需要高效计算资源的场景中,这可能会成为其应用的瓶颈。
  3. 对初值敏感:Gauss-Seidel迭代法对初值的选取比较敏感。如果初值选取不合适,可能会导致迭代过程发散,无法收敛到方程组的解。因此,在实际应用中需要谨慎选择初值。
#include<iostream>  
#include<math.h>  
#include<iomanip>
using namespace std;
#define size 10
void Gauss_Seidel(double A[size][size],double B[size],int n,double x0[size]);

int main() 
{
    double A[size][size]; double B[size]; double x0[size];
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++){
            cin >> A[i][j];
        }
    }
    for (int i = 0; i < n; i++) {
        cin >> B[i];
    }
    for (int i = 0; i < n; i++) {
        x0[i] = 0;
    }    
    Gauss_Seidel(A,B,n,x0);
}

void  Gauss_Seidel(double A[size][size],double B[size],int n,double x0[size])  
{double eps=1e-7;
     double X[size];   
    double sum = 0;
    double diff=0;//看成无穷范数,不用一范数进行绝对值的累加好像结果一样
    double norm=0;   
    for (int i = 0; i < n; i++) {  
        X[i] = x0[i];  
    }  
    do{
    for (int i = 0; i < n; i++) { 

        sum = 0;  
        for (int k = 0; k < n; k++) {  
            if (k != i)             
            sum += A[i][k] * x0[k];  
        }  
        
        norm = (B[i] - sum) / A[i][i]; 
        diff=abs(norm-X[i]);
        X[i]=norm;

    };
    //这里才是Jacobi,等全部的X出来在赋予给x,而不是在过程中就换掉了
    for (int r = 0; r < n; r++){x0[r]=X[r];};

    }while(diff>=eps);

    for (int i = 0; i < n; i++)    //输出结果
    {
        cout <<fixed<<setprecision(2)<< X[i]<<" ";
       
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>