背景
Gauss-Seidel迭代法是基于Jacobi迭代法的改进,旨在通过利用已更新的近似解来加速迭代过程,从而更快地逼近线性方程组的解。该方法特别适用于求解对称正定矩阵或对角占优的线性方程组。
优点
- 收敛速度较快:与Jacobi迭代法相比,Gauss-Seidel迭代法由于利用了已更新的解来计算新的近似值,因此在许多情况下能够更快地收敛到方程组的解。
- 内存占用较少:Gauss-Seidel迭代法只需要存储一组解向量,因此相对于其他直接解法(如高斯消元法),它占用的内存资源较少,特别适用于内存受限的环境。
- 适用范围广:对于一些不满足对角占优条件的方程组,Gauss-Seidel迭代法仍然可以求解,而Jacobi迭代法则可能发散。这使得Gauss-Seidel迭代法在处理更广泛的线性方程组时具有更高的灵活性。
- 适合求解大规模稀疏矩阵:由于每次迭代只需要存储部分已知解,Gauss-Seidel迭代法特别适用于求解大规模稀疏矩阵的线性方程组,这在数值分析和科学计算中非常常见。
缺点
- 收敛性不稳定:Gauss-Seidel迭代法的收敛性依赖于方程组的系数矩阵的特征值分布。如果特征值分布不均匀,可能会导致收敛速度很慢,甚至无法收敛。因此,在使用Gauss-Seidel迭代法之前,通常需要对方程组的系数矩阵进行一定的预处理或分析。
- 不适用于并行计算:Gauss-Seidel迭代法的计算过程是顺序的,即每次迭代都需要等待上一次迭代的结果,这使得它不适合并行计算。在需要高效计算资源的场景中,这可能会成为其应用的瓶颈。
- 对初值敏感: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]<<" ";
}
}
2331

被折叠的 条评论
为什么被折叠?



