1. 迭代法入门:从方程组求解说起
解线性方程组是数值分析中最基础也最重要的任务之一。记得我第一次接触大型线性方程组时,被它的规模吓到了——想象一下要解一个包含1000个方程的方程组,用传统的高斯消元法简直是一场噩梦。这时候迭代法就派上用场了,它像是一位耐心的解谜者,一步步接近正确答案。
雅可比迭代法和高斯-塞德尔迭代法是两种最经典的迭代方法。它们的基本思路很相似:把方程组Ax=b改写为x=Bx+f的形式,然后从一个初始猜测x⁽⁰⁾出发,通过迭代公式x⁽ᵏ⁺¹⁾=Bx⁽ᵏ⁾+f不断逼近真实解。这个过程中,每次迭代都相当于对解向量进行一次"修正"。
我常把这个过程比作用GPS导航:刚开始可能定位不太准(初始猜测),但系统会根据当前位置不断调整路线(迭代过程),最终带你到达目的地(收敛解)。不过要注意,不是所有导航都能成功带你到达终点——有些迭代法可能会"迷路"(发散),这就是我们后面要讨论的收敛性问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 雅可比迭代法详解
2.1 算法原理与实现
雅可比迭代法是最直观的迭代方法。它的核心思想是"分而治之":在计算第k+1次迭代的第i个分量时,只使用第k次迭代的其他分量值。具体来说,对于方程组Ax=b,雅可比迭代的公式为:
python复制x_i^{(k+1)} = (b_i - Σ_{j≠i} a_{ij}x_j^{(k)}) / a_{ii}
这个公式实现起来特别简单。我通常建议新手从这个方法入手,因为它逻辑清晰,便于理解迭代法的本质。下面是一个Python实现的代码片段:
python复制def jacobi(A, b, max_iter=1000, tol=1e-10):
n = len(b)
x = np.zeros(n)
for _ in range(max_iter):
x_new = np.zeros(n)
for i in range(n):
s = sum(A[i][j] * x[j] for j in range(n) if j != i)
x_new[i] = (b[i] - s) / A[i][i]
if np.linalg.norm(x_new - x) < tol:
