高斯-赛德尔迭代

高斯－赛德尔迭代（Gauss–Seidel method）是数值线性代数中的一个迭代法，可用来求出线性方程组解的近似值。该方法以卡爾·弗里德里希·高斯和路德维希·赛德尔（英语：Philipp Ludwig von Seidel）命名。 对于一个含有n个未知量及n个等式的如下线性方程组 a 11 ⋅ x 1 + a 12 ⋅ x 2 + … + a 1 n ⋅ x n = b 1 , a 21 ⋅ x 1 + a 22 ⋅ x 2 + … + a 2 n ⋅ x n = b 2 , ⋮ = ⋮ a n 1 ⋅ x 1 + a n 2 ⋅ x 2 + … + a n n ⋅ x n = b n . {\displaystyle {\begin{aligned}a_{11}\cdot x_{1}+a_{12}\cdot x_{2}+\ldots +a_{1n}\cdot x_{n}&=b_{1},\\a_{21}\cdot x_{1}+a_{22}\cdot x_{2}+\ldots +a_{2n}\cdot x_{n}&=b_{2},\\\vdots \qquad \qquad \qquad &=\vdots \\a_{n1}\cdot x_{1}+a_{n2}\cdot x_{2}+\ldots +a_{nn}\cdot x_{n}&=b_{n}.\end{aligned}}} 为了求这个方程组的解 x → {\displaystyle {\vec {x}}} ，我们使用迭代法。k用来计量迭代步数。给定该方程组解的一个近似值 x → k ∈ R n {\displaystyle {\vec {x}}^{\,k}\in \mathbb {R} ^{n}} 。在求k+1步近似值时，我们利用第m个方程求解第m个未知量。在求解过程中，所有已解出的k+1步元素都被直接使用。这一点与雅可比法不同。对于每个元素可以使用如下公式 x m k + 1 = 1 a m m ( b m − ∑ j = 1 m − 1 a m j ⋅ x j k + 1 − ∑ j = m + 1 n a m j ⋅ x j k ) , 1 ≤ m ≤ n . {\displaystyle x_{m}^{k+1}={\frac {1}{a_{mm}}}\left(b_{m}-\sum _{j=1}^{m-1}a_{mj}\cdot x_{j}^{k+1}-\sum _{j=m+1}^{n}a_{mj}\cdot x_{j}^{k}\right),\quad 1\leq m\leq n.} 重复上述的求解过程，可以得到一个线性方程组解的近似值数列： x → 0 , x → 1 , x → 2 , … {\displaystyle {\vec {x}}^{0},{\vec {x}}^{1},{\vec {x}}^{2},\ldots } 。在该方法收敛的前提下，此数列收敛于 x → {\displaystyle {\vec {x}}} . 可以證明數列收斂若線性方程組係數矩陣為對稱正定矩陣(symmetric positive definite matrix)或對角優勢矩陣(diagonally dominant matrix)。 为了保证该方法可以进行，主对角线元素 a m m {\displaystyle a_{mm}} 需非零。 线性方程组的系数 a i j ( i , j = 1 , 2 , … , n ) {\displaystyle a_{ij}\,(i,j=1,2,\ldots ,n)} 可以被写成矩阵形式 A ∈ R n × n {\displaystyle A\in \mathbb {R} ^{n\times n}} , 该矩阵的第i行第j列元素满足 ( A ) i , j = a i j {\displaystyle (A)_{i,j}=a_{ij}} 。方程组的右边项可以被写成向量形式 b → ∈ R n : ( b → ) i = b i {\displaystyle {\vec {b}}\in \mathbb {R} ^{n}:\,({\vec {b}})_{i}=b_{i}} 。 线性方程组因此可以被写成矩阵运算形式 A x → = b → {\displaystyle A{\vec {x}}={\vec {b}}} 矩阵 A {\displaystyle A} 可以分解成如下形式 A = D + L + U {\displaystyle A=D+L+U} , 其中 D ∈ R n × n {\displaystyle D\in \mathbb {R} ^{n\times n}} 为一个对角矩阵满足 ( D ) i , i = ( A ) i , i {\displaystyle (D)_{i,i}=(A)_{i,i}} , L , U {\displaystyle L,\,U} 均为严格三角矩阵： L {\displaystyle L} 为严格下三角矩阵， U {\displaystyle U} 为严格上三角矩阵。 例子 A = ( 1 2 2 3 1 4 5 3 1 ) {\displaystyle A={\begin{pmatrix}1&2&2\\3&1&4\\5&3&1\end{pmatrix}}} ， D = ( 1 0 0 0 1 0 0 0 1 ) {\displaystyle D={\begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix}}} ， L = ( 0 0 0 3 0 0 5 3 0 ) {\displaystyle L={\begin{pmatrix}0&0&0\\3&0&0\\5&3&0\end{pmatrix}}} ， U = ( 0 2 2 0 0 4 0 0 0 ) {\displaystyle U={\begin{pmatrix}0&2&2\\0&0&4\\0&0&0\end{pmatrix}}} . 高斯－赛德尔迭代的每一步可以写成如下形式 D x → k + 1 = b → − L x → k + 1 − U x → k {\displaystyle D{\vec {x}}^{\,k+1}={\vec {b}}-L{\vec {x}}^{\,k+1}-U{\vec {x}}^{\,k}} . 因为元素可以被重新赋值为在这个算法中计算得到的新值，所以只需要保存一个向量，而向量索引被省略。该算法如下： 输入: A, b 输出: ϕ {\displaystyle \phi } 初始化一个的猜测结果 ϕ {\displaystyle \phi } repeat until convergence（收敛） for i from 1 until n do σ ← 0 {\displaystyle \sigma \leftarrow 0} for j from 1 until n do if j ≠ i then σ ← σ + a i j ϕ j {\displaystyle \sigma \leftarrow \sigma +a_{ij}\phi _{j}} end if end (j - loop) ϕ i ← 1 a i i ( b i − σ ) {\displaystyle \phi _{i}\leftarrow {\frac {1}{a_{ii}}}(b_{i}-\sigma )} end (i-loop) check if convergence is reached（检查是否已收敛） end (repeat) 雅可比法