Standard stationary iterations based on diagonal and triangular splittings.
Jacobi Iteration
Decomposes \(\bA\) into diagonal \(\bD\) and remainder \(\bR\): \(\bA = \bD + \bR\).
\[
\begin{align}
\bx^{(k+1)} = \bD^{-1}(\bb - \bR\bx^{(k)})
\end{align}
\]
Performance: Jacobi iteration is inherently parallel, as all components can be updated simultaneously. However, it often exhibits slow convergence and requires double buffering of the solution vector.
Gauss-Seidel Iteration
Splits \(\bA = \bL_* + \bU_*\), where \(\bL_*\) includes the diagonal.
\[
\begin{align}
\bL_* \bx^{(k+1)} = \bb - \bU_* \bx^{(k)}
\end{align}
\]
Performance: Sequential dependencies restrict efficient parallelization, but Gauss-Seidel typically converges twice as fast as Jacobi and allows for in-place updates.
Convergence Conditions
If \(\bA\) is strictly diagonally dominant (\(|a_{ii}| > \sum_{j \neq i} |a_{ij}|\)), both Jacobi and Gauss-Seidel converge for any \(\bx^{(0)}\).
If \(\bA\) is SPD, Gauss-Seidel is guaranteed to converge. Jacobi may still diverge.
For \(\bA = \begin{pmatrix} 2 & 1 \\ 1 & 2 \end{pmatrix}\), compute one step of Jacobi and Gauss-Seidel from \(\bzero\).
Compare \(\rho(\bT_J)\) and \(\rho(\bT_{GS})\). Does \(\rho_{GS} \approx \rho_J^2\) hold?
Successive Over-Relaxation (SOR)
Accelerates Gauss-Seidel by overshooting the update.
\[
\begin{align}
x_i^{(k+1)} = (1-\omega)x_i^{(k)} + \omega \left[\text{GS update}\right]
\end{align}
\]
- Convergence Condition: \(0 < \omega < 2\) (Kahan’s Theorem).
Convergence Acceleration: For the 1D Poisson problem on a grid with spacing \(h\):
SOR effectively improves the convergence rate from \(O(h^2)\) to \(O(h)\).
Optimal Tuning: For \(\rho_J = 0.95\), calculate the optimal \(\omega^* = 2/(1 + \sqrt{1-\rho_J^2})\).
Convergence Sweep: Implement SOR and plot iterations to convergence vs. \(\omega \in [1, 2)\). Identify the ``cliff’’ at \(\omega^*\).
Stopping Criteria
Absolute Residual: \(\|\br^{(k)}\| < \varepsilon\).
Relative Residual: \(\|\br^{(k)}\|/\|\bb\| < \varepsilon\). (Scale invariant).
Increment: \(\|\bx^{(k+1)} - \bx^{(k)}\| < \varepsilon\). (Cheap, but may stop prematurely if convergence is slow).
Why is a small residual not enough to guarantee a small error \(\be^{(k)}\)? (Condition number).
Implement a robust solver that combines relative residual with a max\_iter budget.