之前的文章介绍过Gauss消元法、Doolittle和Crout分解等解线性方程组的直接方法。但是直接法不是在任何时候都可用的,它有以下缺点:
- 在有舍入误差的情况下,直接法只能得到方程的近似解。
- 如果待求解问题规模很大,直接法求解的计算量是很大的,更糟的是随着计算量的增大舍入误差积累也会越多,从而得到的解误差更大。所以直接法适合小规模稠密型方程组的求解。
- 另外,直接法的程序设计也比较复杂。
迭代法解线性方程组
对于方程组 A x = b Ax=b Ax=b 一般可以将其写成如下形式
x = M x + g x=Mx+g x=Mx+g建立上述方程组的迭代公式:
x ( k + 1 ) = M x ( k ) + g , k = 0 , 1 , 2 , … x^{(k+1)}=Mx^{(k)}+g,k=0,1,2,\dots x(k+1)=Mx(k)+g,k=0,1,2,…这个迭代公式有什么用呢?
当向量序列 x ( k ) x^{(k)} x(k) 收敛于 x ∗ x^* x∗ 时,有
x ∗ = M x ∗ + g x^*=Mx^*+g x∗=Mx∗+g可以发现 x ∗ x^* x∗ 即为方程组 x = M x + g x=Mx+g x=Mx+g 的解,也就是说,当 x ( k ) x^{(k)} x(k) 收敛时, x ( k ) x^{(k)} x(k) 即为方程组的解。
以上就是迭代法解方程组的基本原理,只要 x ( k ) x^{(k)} x(k)收敛,就可以通过k步迭代得到方程组的近似解。
下面介绍两种经典的迭代法:Jacobi迭代法和Gauss-Seidel迭代法。
Jacobi迭代法
假设有下列线性方程组
{ a 11 x 1 + a 12 x 2 + a 13 x 3 = b 1 a 21 x 1 + a 22 x 2 + a 23 x 3 = b 2 a 31 x 1 + a 32 x 2 + a 33 x 3 = b 3 \left\{\begin{array}{l}a_{11}x_1+a_{12}x_2+a_{13}x_3=b_1\\a_{21}x_1+a_{22}x_2+a_{23}x_3=b_2\\a_{31}x_1+a_{32}x_2+a_{33}x_3=b_3\end{array}\right. ⎩⎨⎧a11x1+a12x2+a13x3=b1a21x1+a22x2+a23x3=b2a31x1+a32x2+a33x3=b3
将其写成下面形式
{ x 1 = 1 a 11 ( b 1 − a 12 x 2 − a 13 x 3 ) x 2 = 1 a 22 ( b 2 − a 21 x 1 − a 23 x 3 ) x 3 = 1 a 33 ( b 3 − a 31 x 1 − a 32 x 2 ) \left\{\begin{array}{l}x_1=\frac1{a_{11}}(b_1-a_{12}x_2-a_{13}x_3)\\x_2=\frac1{a_{22}}(b_2-a_{21}x_1-a_{23}x_3)\\x_3=\frac1{a_{33}}(b_3-a_{31}x_1-a_{32}x_2)\end{array}\right. ⎩⎨⎧x1=a111(b1−a12x2−a13x3)x2=a221(b2−a21x1−
迭代法解线性方程组

本文介绍了迭代法解线性方程组的基本原理,包括Jacobi迭代法和Gauss-Seidel迭代法,并提供了这两种方法的算法实现。
最低0.47元/天 解锁文章
1万+





