### 求解线性方程组的迭代方法
#### 实验目的
1. **实现三种迭代法**:Jacobi迭代法、Gauss-Seidel迭代法、超松弛迭代法(SOR)。
2. **比较三种迭代法的差异**:通过实际编程实现与计算结果对比,了解不同方法之间的性能差异。
3. **分析方程的好坏,以及算法的稳定性**:通过实验数据,探讨线性方程组本身的性质以及所采用算法的稳定性。
#### 实验步骤
1. **选择基准方程**:选取书本P59页给出的一个具体方程组作为实验对象,即:
\[
\begin{cases}
4x_1 + x_2 = 5 \\
x_1 + 4x_2 + x_3 = 6 \\
x_2 + 4x_3 = 5
\end{cases}
\]
2. **编程实现**
- **Jacobi迭代法**:首先计算对角矩阵及其逆,然后分别求出下三角矩阵和上三角矩阵。根据公式 \(B = D(-L - U)\) 和 \(f = Db\),更新迭代序列。
\[
s^{(k+1)} = B s^{(k)} + f
\]
其中,\(D\) 是对角矩阵的逆,\(L\) 和 \(U\) 分别为下三角和上三角矩阵。
- **Gauss-Seidel迭代法**:该方法与Jacobi迭代法相似,但使用最新的已更新的值来进行下一步迭代。
\[
x^{(k+1)}_j = \frac{b_j - \sum_{i=1}^{j-1} A_{ji} x^{(k+1)}_i - \sum_{i=j+1}^n A_{ji} x^{(k)}_i}{A_{jj}}
\]
- **超松弛迭代法(SOR)**:SOR是在Gauss-Seidel迭代法基础上引入了一个松弛因子ω,以加速收敛过程。
\[
x^{(k+1)}_j = (1-\omega)x^{(k)}_j + \omega \left(\frac{b_j - \sum_{i=1}^{j-1} A_{ji} x^{(k+1)}_i - \sum_{i=j+1}^n A_{ji} x^{(k)}_i}{A_{jj}}\right)
\]
#### 实验程序解析
1. **Jacobi迭代法**:此方法利用对角矩阵的逆来更新迭代序列。程序中定义了函数 `jacobi`,输入参数包括系数矩阵\(a\)、右端向量\(b\)、初始向量\(x0\)等。通过循环迭代直至满足精度要求\(||s - x0|| < \varepsilon\)。
2. **Gauss-Seidel迭代法**:程序定义了函数 `gauss_s`,同样接受系数矩阵\(A\)、右端向量\(b\)、初始向量\(x0\)等作为输入。与Jacobi迭代法的主要区别在于使用最新迭代结果来更新下一个未知数的值。
3. **超松弛迭代法**:程序定义了函数 `sor`,除了输入参数外还接受松弛因子\(w\)。该方法通过调整松弛因子来优化迭代过程,从而提高收敛速度。
#### 实验结果
1. **运行结果**:三种方法均能成功地求解给定的线性方程组。
2. **收敛速度**:从实验结果来看,三种方法的收敛速度依次为Jacobi迭代法 < Gauss-Seidel迭代法 < 超松弛迭代法(SOR)。这与理论预期一致。
3. **算法特性**:Jacobi迭代法更适合于并行计算环境,因为它在每一步迭代过程中不需要等待所有未知数的更新完成即可继续下一步迭代。相比之下,Gauss-Seidel迭代法是一个典型的串行算法,需要按顺序更新每个未知数。
#### 结论
本次实验通过具体的编程实现和数据对比,成功验证了Jacobi迭代法、Gauss-Seidel迭代法及超松弛迭代法在求解线性方程组中的有效性和性能差异。从实验结果可以明显看出,随着迭代方法的复杂度增加,收敛速度也相应加快。此外,不同的迭代方法在并行处理能力方面也有显著的区别,这为在不同应用场景下的选择提供了依据。