6 解線性方程組迭代方法
迭代方法 選取一個初始向量x ( 0 ) x^{(0)} x ( 0 ) ,然後按照迭代公式,依次計算x ( 1 ) x^{(1)} x ( 1 ) ,x ( 2 ) x^{(2)} x ( 2 ) ,……,最終當k k k 足夠大的情況下,x ( k ) x^{(k)} x ( k ) 就是方程組的近似解。由於是迭代計算,本身求解結果就是不停迭代來不停接近真實解,而且在每次迭代計算過程中由於機器精度問題也會存在誤差,所以迭代法難以獲得精確解,是一種逐次近似的方法。
雖然不絕對精確,但是因爲算法簡單易於實現,所以適用於求解大型稀疏線性方程組。
6.1 Jacobi迭代法和Gauss-Seidel迭代法
通過一個簡單方程組,理解兩種迭代方法:
{ 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.
⎩ ⎨ ⎧ a 1 1 x 1 + a 1 2 x 2 + a 1 3 x 3 = b 1 a 2 1 x 1 + a 2 2 x 2 + a 2 3 x 3 = b 2 a 3 1 x 1 + a 3 2 x 2 + a 3 3 x 3 = b 3
6.1.1 Jacobi迭代法
雅克比迭代法 ,就是這個方程組通過簡單的移項等操作,可以得到等價的下面方程組:
{ 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}=\frac{1}{a_{11}}\left(b_{1}-a_{12} x_{2}-a_{13} x_{3}\right)} \\ {x_{2}=\frac{1}{a_{22}}\left(b_{2}-a_{21} x_{1}-a_{23} x_{3}\right)} \\ {x_{3}=\frac{1}{a_{33}}\left(b_{3}-a_{31} x_{1}-a_{32} x_{2}\right)}\end{array}\right.
⎩ ⎨ ⎧ x 1 = a 1 1 1 ( b 1 − a 1 2 x 2 − a 1 3 x 3 ) x 2 = a 2 2 1 ( b 2 − a 2 1 x 1 − a 2 3 x 3 ) x 3 = a 3 3 1 ( b 3 − a 3 1 x 1 − a 3 2 x 2 )
這樣就可以形成迭代計算公式,因爲x 1 , x 2 , x 3 x_1,x_2,x_3 x 1 , x 2 , x 3 都可以根據其他值進行計算,得到下面:
{ x 1 ( k + 1 ) = 1 a 11 ( b 1 − a 12 x 2 ( k ) − a 13 x 3 ( k ) ) x 2 ( k + 1 ) = 1 a 22 ( b 2 − a 21 x 1 ( k ) − a 23 x 3 ( k ) ) x 3 ( k + 1 ) = 1 a 33 ( b 3 − a 31 x 1 ( k ) − a 32 x 2 ( k ) )
\left\{\begin{array}{l}{x_{1}^{(k+1)}=\frac{1}{a_{11}}\left(b_{1}-a_{12} x_{2}^{(k)}-a_{13} x_{3}^{(k)}\right)} \\ {x_{2}^{(k+1)}=\frac{1}{a_{22}}\left(b_{2}-a_{21} x_{1}^{(k)}-a_{23} x_{3}^{(k)}\right)} \\ {x_{3}^{(k+1)}=\frac{1}{a_{33}}\left(b_{3}-a_{31} x_{1}^{(k)}-a_{32} x_{2}^{(k)}\right)}\end{array}\right.
⎩ ⎪ ⎪ ⎪ ⎨ ⎪ ⎪ ⎪ ⎧ x 1 ( k + 1 ) = a 1 1 1 ( b 1 − a 1 2 x 2 ( k ) − a 1 3 x 3 ( k ) ) x 2 ( k + 1 ) = a 2 2 1 ( b 2 − a 2 1 x 1 ( k ) − a 2 3 x 3 ( k ) ) x 3 ( k + 1 ) = a 3 3 1 ( b 3 − a 3 1 x 1 ( k ) − a 3 2 x 2 ( k ) )
對於這個計算公式,先任意選定一個初始向量x ( 0 ) = ( x 1 ( 0 ) , x 2 ( 0 ) , x 3 ( 0 ) ) x^{(0)}=(x_1^{(0)},x_2^{(0)},x_3^{(0)}) x ( 0 ) = ( x 1 ( 0 ) , x 2 ( 0 ) , x 3 ( 0 ) ) ,然後依次計算出x ( 1 ) , x ( 2 ) , . . . x^{(1)},x^{(2)},... x ( 1 ) , x ( 2 ) , . . . 如果這些迭代向量{ x ( k ) } \{x^{(k)}\} { x ( k ) } 收斂於向量x ∗ x^* x ∗ ,那麼向量x ∗ x^* x ∗ 就是原方程組的解。而且,根據精度要求,可以取第k次迭代向量作爲原方程組的近似解。
當方程組擴展到n元時,Jacobi迭代方法爲 :
x i ( k + 1 ) = 1 a i i ( b i − ∑ j = 1 i − 1 a i j x j ( k ) − ∑ j = i + 1 n a i j x j ( k ) ) i = 1 , 2 , ⋯  , n , k = 0 , 1 , ⋯
\begin{array}{c}{x_{i}^{(k+1)}=\frac{1}{a_{i i}}\left(b_{i}-\sum_{j=1}^{i-1} a_{i j} x_{j}^{(k)}-\sum_{j=i+1}^{n} a_{i j} x_{j}^{(k)}\right)} \\ {i=1,2, \cdots, n, \quad k=0,1, \cdots}\end{array}
x i ( k + 1 ) = a i i 1 ( b i − ∑ j = 1 i − 1 a i j x j ( k ) − ∑ j = i + 1 n a i j x j ( k ) ) i = 1 , 2 , ⋯ , n , k = 0 , 1 , ⋯
6.1.2 Gauss-Seidel迭代法
高斯-賽德爾 迭代法,優化了雅克比迭代法。在雅克比迭代中,每次計算迭代向量都是根據前一次的結果進行計算,但實際上在計算x i x_i x i 的時候,x j , j ∈ [ 1 , i − 1 ] x_j,j\in [1,i-1] x j , j ∈ [ 1 , i − 1 ] 都已經計算出來了。GS迭代法,就是利用上了當前迭代過程已經計算出的結果,有如下迭代公式:
{ x 1 ( k + 1 ) = 1 a 11 ( b 1 − a 12 x 2 ( k ) − a 13 x 3 ( k ) ) x 2 ( k + 1 ) = 1 a 22 ( b 2 − a 21 x 1 ( k + 1 ) − a 23 x 3 ( k ) ) x 3 ( k + 1 ) = 1 a 33 ( b 3 − a 31 x 1 ( k + 1 ) − a 32 x 2 ( k + 1 ) )
\left\{\begin{array}{l}{x_{1}^{(k+1)}=\frac{1}{a_{11}}\left(b_{1}-a_{12} x_{2}^{(k)}-a_{13} x_{3}^{(k)}\right)} \\ {x_{2}^{(k+1)}=\frac{1}{a_{22}}\left(b_{2}-a_{21} x_{1}^{(k+1)}-a_{23} x_{3}^{(k)}\right)} \\ {x_{3}^{(k+1)}=\frac{1}{a_{33}}\left(b_{3}-a_{31} x_{1}^{(k+1)}-a_{32} x_{2}^{(k+1)}\right)}\end{array}\right.
⎩ ⎪ ⎪ ⎪ ⎨ ⎪ ⎪ ⎪ ⎧ x 1 ( k + 1 ) = a 1 1 1 ( b 1 − a 1 2 x 2 ( k ) − a 1 3 x 3 ( k ) ) x 2 ( k + 1 ) = a 2 2 1 ( b 2 − a 2 1 x 1 ( k + 1 ) − a 2 3 x 3 ( k ) ) x 3 ( k + 1 ) = a 3 3 1 ( b 3 − a 3 1 x 1 ( k + 1 ) − a 3 2 x 2 ( k + 1 ) )
當方程組擴展到n元時,GS迭代方法爲 :
x i ( k + 1 ) = 1 a i i ( b i − ∑ j = 1 i − 1 a i j x j ( k + 1 ) − ∑ j = i + 1 n a i j x j ( k ) ) i = 1 , 2 , ⋯  , n , k = 0 , 1 , ⋯
\begin{array}{c}{x_{i}^{(k+1)}=\frac{1}{a_{i i}}\left(b_{i}-\sum_{j=1}^{i-1} a_{i j} x_{j}^{(k+1)}-\sum_{j=i+1}^{n} a_{i j} x_{j}^{(k)}\right)} \\ {i=1,2, \cdots, n, \quad k=0,1, \cdots}\end{array}
x i ( k + 1 ) = a i i 1 ( b i − ∑ j = 1 i − 1 a i j x j ( k + 1 ) − ∑ j = i + 1 n a i j x j ( k ) ) i = 1 , 2 , ⋯ , n , k = 0 , 1 , ⋯
6.1.3 上面兩種迭代法的矩陣形式
設有線性方程組:
A x = b
Ax=b
A x = b
那麼可以將係數矩陣A分解爲:
A = D − L − U
A=D-L-U
A = D − L − U
其中D 是A的對角線構成的對角矩陣,L 和U 分別是下三角矩陣和上三角矩陣,也就是公式(7)改爲:
( D − L − U ) x = b
(D-L-U)x=b
( D − L − U ) x = b
通過移項可以得到兩種等價形式:
KaTeX parse error: Got function '\hskip' as argument to '\begin{array}' at position 1: \̲h̲s̲k̲i̲p̲1em\relax
通過第一種形式可以得到雅克比迭代矩陣形式 :
x ( k + 1 ) = D − 1 ( L + U ) x ( k ) + D − 1 b , k = 0 , 1 , ⋯
x^{(k+1)}=D^{-1}(L+U) x^{(k)}+D^{-1} b, \quad k=0,1, \cdots
x ( k + 1 ) = D − 1 ( L + U ) x ( k ) + D − 1 b , k = 0 , 1 , ⋯
通過第二種等價形式可以得到GS迭代矩陣形式 :
x ( k + 1 ) = ( D − L ) − 1 U x ( k ) + ( D − L ) − 1 b , k = 0 , 1 , ⋯
x^{(k+1)}=(D-L)^{-1} U x^{(k)}+(D-L)^{-1} b, \quad k=0,1, \cdots
x ( k + 1 ) = ( D − L ) − 1 U x ( k ) + ( D − L ) − 1 b , k = 0 , 1 , ⋯
6.2 迭代法的一般形式與收斂性
6.2.1 一般形式
設有線性方程組:
A x = b
Ax=b
A x = b
其轉化的等價形式:
x = M x + g
x=Mx+g
x = M x + g
可以建立迭代公式:
x ( k + 1 ) = M x k + g
x^{(k+1)}=Mx^{k}+g
x ( k + 1 ) = M x k + g
其中M 成爲迭代矩陣,g 爲某一個向量。如果迭代向量最終收斂到x ∗ x^* x ∗ ,那麼取極限就可以得到:
x ∗ = M x ∗ + g
x^*=Mx^*+g
x ∗ = M x ∗ + g
也就是說,x ∗ x^* x ∗ 就是方程組的解。這就是迭代法的一般形式 。
通過一般形式,可以知道雅克比和GS迭代法的一般式爲:
雅克比:M = D − 1 ( L + U ) , g = D − 1 b M=D^{-1}(L+U),\quad g=D^{-1}b M = D − 1 ( L + U ) , g = D − 1 b
GS:M = ( D − L ) − 1 U , g = ( D − L ) − 1 b M=(D-L)^{-1}U,\quad g=(D-L)^{-1}b M = ( D − L ) − 1 U , g = ( D − L ) − 1 b
6.2.2 收斂性
通過一般形式可以知道:
e ( k + 1 ) = M e ( k ) , k = 0 , 1 , ⋯
e^{(k+1)}=M e^{(k)}, \quad k=0,1, \cdots
e ( k + 1 ) = M e ( k ) , k = 0 , 1 , ⋯
其中e 爲誤差向量,e ( k ) = x ( k ) − x ∗ e^{(k)}=x^{(k)}-x^* e ( k ) = x ( k ) − x ∗ ,遞推可以得到:
e ( t ) = M k e ( 0 ) , k = 0 , 1 , ⋯
e^{(t)}=M^{k} e^{(0)}, \quad k=0,1, \cdots
e ( t ) = M k e ( 0 ) , k = 0 , 1 , ⋯
所以誤差趨近於0的條件是M k → 0 M^k\to0 M k → 0 。
定理 :對任意初始向量,迭代法收斂的充分必要條件是迭代矩陣M 的譜半徑ρ ( M ) < 1 \rho(M)<1 ρ ( M ) < 1 。
譜半徑 ,就是矩陣特徵值絕對值的最大值。
推論 :對任意初始向量,迭代收斂的充分條件是∣ ∣ M ∣ ∣ < 1 ||M||<1 ∣ ∣ M ∣ ∣ < 1 。
又來一個定理 :設∣ ∣ M ∣ ∣ < 1 ||M||<1 ∣ ∣ M ∣ ∣ < 1 ,那麼有如下誤差估計公式:
∥ x ( k ) − x ∗ ∥ ⩽ ∥ M ∥ 1 − ∥ M ∥ ∥ x ( k ) − x ( α − 1 ) ∥
\left\|x^{(k)}-x^{*}\right\| \leqslant \frac{\|M\|}{1-\|M\|}\left\|x^{(k)}-x^{(\alpha-1)}\right\|
∥ ∥ ∥ x ( k ) − x ∗ ∥ ∥ ∥ ⩽ 1 − ∥ M ∥ ∥ M ∥ ∥ ∥ ∥ x ( k ) − x ( α − 1 ) ∥ ∥ ∥
∥ x ( k ) − x ∗ ∥ ⩽ ∥ M ∥ k 1 − ∥ M ∥ ∥ x ( 1 ) − x ( 0 ) ∥
\left\|x^{(k)}-x^{*}\right\| \leqslant \frac{\|M\|^{k}}{1-\|M\|}\left\|x^{(1)}-x^{(0)}\right\|
∥ ∥ ∥ x ( k ) − x ∗ ∥ ∥ ∥ ⩽ 1 − ∥ M ∥ ∥ M ∥ k ∥ ∥ ∥ x ( 1 ) − x ( 0 ) ∥ ∥ ∥
這樣就可以根據迭代次數求得誤差界限。按照下面的公式,可以根據誤差界限,判斷需要的迭代次數:
k > ( ln ε + ln 1 − ∥ M ∥ ∥ x ( 1 ) − x ( 0 ) ∥ ) / ln ∥ M ∥
k>\left(\ln \varepsilon +\ln \frac{1-\|M\|}{\left\|x^{(1)}-x^{(0)}\right\|}\right) / \ln \|M\|
k > ( ln ε + ln ∥ ∥ x ( 1 ) − x ( 0 ) ∥ ∥ 1 − ∥ M ∥ ) / ln ∥ M ∥
其中ε \varepsilon ε 就是精度要求。
6.3 Jacobi和Gauss-Seidel的收斂性
迭代法一般形式的收斂性同樣適用於這兩種迭代方法,也就是譜半徑小於1是充分必要條件,行列式小於1是充分條件。這裏有提出了新的收斂判定方法。
定義:嚴格對角佔優矩陣 ,就是對角線上的元素是其對應行的絕對值最大的元素,如下面:
KaTeX parse error: Got function '\hskip' as argument to '\begin{array}' at position 1: \̲h̲s̲k̲i̲p̲1em\relax
而且有:如果A是嚴格對角佔優矩陣,則A是非奇異矩陣。
**定理:**如果A是嚴格對角佔優矩陣,那麼方程組A x = b Ax=b A x = b 的雅克比和GS迭代法均收斂。
**定理:**如果A是對稱正定矩陣,則方程組A x = b Ax=b A x = b 的GS迭代法收斂。
6.4 逐次超鬆弛迭代法
逐次超鬆弛迭代法,簡稱SOR方法 ,是前面兩種迭代法的改進,他是在每一次迭代結果添加一個修正量來得到更精確的迭代值,如果是雅克比迭代法進行優化,那麼就有下面的計算公式:
x i ( k + 1 ) = x i ( k ) + 1 a i i ( b i − ∑ j = 1 i − 1 a i j x j ( k ) − ∑ j = i n a i j x j ( k ) ) i = 1 , 2 , ⋯  , n , k = 0 , 1 , ⋯
\begin{array}{c}{x_{i}^{(k+1)}=x_{i}^{(k)}+\frac{1}{a_{ii}}\left(b_{i}-\sum_{j=1}^{i-1} a_{i j} x_{j}^{(k)}-\sum_{j=i}^{n} a_{i j} x_{j}^{(k)}\right)} \\ {i=1,2, \cdots, n, \quad k=0,1, \cdots}\end{array}
x i ( k + 1 ) = x i ( k ) + a i i 1 ( b i − ∑ j = 1 i − 1 a i j x j ( k ) − ∑ j = i n a i j x j ( k ) ) i = 1 , 2 , ⋯ , n , k = 0 , 1 , ⋯
這時,如果考慮添加一個參數來控制修正量的大小(好比機器學習中的學習率)就能得到下面由GS方法優化得到的計算公式:
x i ( k + 1 ) = x i ( k ) + ω a i i ( b i − ∑ j = 1 i − 1 a i j x j ( k + 1 ) − ∑ j = i n a i j x j ( k ) ) i = 1 , 2 , ⋯  , n , k = 0 , 1 , ⋯
\begin{array}{c}{x_{i}^{(k+1)}=x_{i}^{(k)}+\frac{\omega}{a_{i i}}\left(b_{i}-\sum_{j=1}^{i-1} a_{i j} x_{j}^{(k+1)}-\sum_{j=i}^{n} a_{i j} x_{j}^{(k)}\right)} \\ {i=1,2, \cdots, n, \quad k=0,1, \cdots}\end{array}
x i ( k + 1 ) = x i ( k ) + a i i ω ( b i − ∑ j = 1 i − 1 a i j x j ( k + 1 ) − ∑ j = i n a i j x j ( k ) ) i = 1 , 2 , ⋯ , n , k = 0 , 1 , ⋯
這個迭代方法就是SOR方法,其中的參數ω \omega ω 叫做鬆弛因子 ,如果ω < 1 \omega<1 ω < 1 ,就叫做欠鬆弛迭代,如果ω > 1 \omega>1 ω > 1 ,就叫做超鬆弛迭代,如果ω = 1 \omega=1 ω = 1 恰好就是GS迭代法的格式。根據上面計算公式可以得到矩陣格式:
x ( k + 1 ) = x ( k ) + ω D − 1 ( b + L x ( k + 1 ) + ( U − D ) x ( k ) ) .
x^{(k+1)}=x^{(k)}+\omega D^{-1}\left(b+L x^{(k+1)}+(U-D) x^{(k)}\right).
x ( k + 1 ) = x ( k ) + ω D − 1 ( b + L x ( k + 1 ) + ( U − D ) x ( k ) ) .
再進一步按照一般形式轉化:
x ( k + 1 ) = ( D − ω L ) − 1 [ ( 1 − ω ) D + ω U ] x ( k ) + ω ( D − ω L ) − 1 b k = 0 , 1 , ⋯
\begin{array}{c}{x^{(k+1)}=(D-\omega L)^{-1}[(1-\omega) D+\omega U] x^{(k)}+\omega(D-\omega L)^{-1} b} \\ {k=0,1, \cdots}\end{array}
x ( k + 1 ) = ( D − ω L ) − 1 [ ( 1 − ω ) D + ω U ] x ( k ) + ω ( D − ω L ) − 1 b k = 0 , 1 , ⋯
可以得到SOR方法的迭代矩陣 :
f ω = ( D − ω L ) − 1 [ ( 1 − ω ) D + ω U ]
\mathcal{f}_{\omega}=(D-\omega L)^{-1}[(1-\omega) D+\omega U]
f ω = ( D − ω L ) − 1 [ ( 1 − ω ) D + ω U ]
定理 :SOR方法的收斂的充分必要條件是ρ ( f ω ) < 1 \rho(\mathcal{f}_\omega)<1 ρ ( f ω ) < 1 ,收斂的充分條件是∣ ∣ f ω ∣ ∣ < 1 ||\mathcal{f}_\omega||<1 ∣ ∣ f ω ∣ ∣ < 1
定理 :SOR方法收斂的必要條件是0 < ω < 2 0<\omega<2 0 < ω < 2
定理 :如果係數矩陣A是對稱正定矩陣,且0 < ω < 2 0<\omega<2 0 < ω < 2 ,則SOR方法收斂。