Gauss-Seidel迭代法解线性方程组
题目描述
给定一个线性方程组 \(A\mathbf{x} = \mathbf{b}\),其中 \(A\) 是一个 \(n \times n\) 的系数矩阵,\(\mathbf{b}\) 是常数向量。要求使用 Gauss-Seidel 迭代法求解未知向量 \(\mathbf{x}\)。该方法适用于对角占优或对称正定矩阵,通过迭代逐步逼近方程组的解。
解题过程
- 算法原理
Gauss-Seidel 迭代法是 Jacobi 迭代法的改进版本。核心思想是将系数矩阵 \(A\) 分解为三部分:
\[ A = L + D + U \]
其中:
- \(L\) 是严格下三角矩阵(包含 \(A\) 的主对角线以下元素),
- \(D\) 是对角矩阵(仅保留 \(A\) 的主对角线元素),
- \(U\) 是严格上三角矩阵(包含 \(A\) 的主对角线以上元素)。
迭代公式为:
\[ \mathbf{x}^{(k+1)} = (D + L)^{-1} \left( \mathbf{b} - U \mathbf{x}^{(k)} \right) \]
实际计算中,无需直接求逆矩阵,而是通过逐分量迭代实现。
- 迭代步骤
- 步骤1:初始化
设置初始解向量 \(\mathbf{x}^{(0)}\)(通常设为零向量或估计值),指定误差容限 \(\epsilon\) 和最大迭代次数 \(N\)。 - 步骤2:迭代计算
对于第 \(k+1\) 次迭代,依次更新每个分量 \(x_i^{(k+1)}\)(按 \(i=1,2,\dots,n\) 顺序):
- 步骤1:初始化
\[ x_i^{(k+1)} = \frac{1}{a_{ii}} \left( b_i - \sum_{j=1}^{i-1} a_{ij} x_j^{(k+1)} - \sum_{j=i+1}^{n} a_{ij} x_j^{(k)} \right) \]
注意:计算 $ x_i^{(k+1)} $ 时,已更新的分量 $ x_1^{(k+1)}, \dots, x_{i-1}^{(k+1)} $ 直接使用新值,未更新的分量 $ x_{i+1}^{(k)}, \dots, x_n^{(k)} $ 使用旧值。这比 Jacobi 方法收敛更快。
- 步骤3:收敛判断
计算两次迭代解的误差 \(\|\mathbf{x}^{(k+1)} - \mathbf{x}^{(k)}\|\)(常用欧几里得范数或无穷范数)。若误差小于 \(\epsilon\) 或迭代次数超过 \(N\),则停止迭代;否则返回步骤2。
- 收敛性分析
- 若矩阵 \(A\) 严格对角占优(即 \(|a_{ii}| > \sum_{j \neq i} |a_{ij}|\))或对称正定,Gauss-Seidel 迭代保证收敛。
- 收敛速度取决于矩阵的谱半径(迭代矩阵 \(G = -(D+L)^{-1}U\) 的特征值模的最大值)。
示例
求解方程组:
\[\begin{cases} 4x_1 + x_2 = 9 \\ x_1 + 3x_2 = 10 \end{cases} \]
- 初始化 \(x_1^{(0)} = 0, x_2^{(0)} = 0\)。
- 第一次迭代:
\[ x_1^{(1)} = \frac{1}{4}(9 - 1 \cdot 0) = 2.25, \quad x_2^{(1)} = \frac{1}{3}(10 - 1 \cdot 2.25) = 2.5833 \]
- 第二次迭代:
\[ x_1^{(2)} = \frac{1}{4}(9 - 1 \cdot 2.5833) = 1.6042, \quad x_2^{(2)} = \frac{1}{3}(10 - 1 \cdot 1.6042) = 2.7986 \]
重复迭代直至误差满足要求,最终逼近精确解 \(x_1 = 1, x_2 = 3\)。