GaussSeidel迭代 Jacobi迭代及其收敛性
GaussSeidel迭代 Jacobi迭代 收斂性
- 迭代法求解線性方程組
- GaussSeidelGaussSeidelGaussSeidel
- 公式推導
- 矩陣形式
- 非矩陣形式
- 代碼示例
- JacobiJacobiJacobi
- 公式推導
- 矩陣形式
- 非矩陣形式
- 代碼示例
- 收斂性
迭代法求解線性方程組
目的是對于一個可逆矩陣AAA,利用迭代法求解
Ax=b.Ax=b. Ax=b.
GaussSeidelGauss SeidelGaussSeidel 和 JacobiJacobiJacobi 都是將 AAA 矩陣分成 D+L+UD+L+UD+L+U 矩陣的形式,構造出x=Gx+dx=Gx+dx=Gx+d的迭代矩陣,來迭代求解出xxx,理想情況下當 x==Gx+dx==Gx+dx==Gx+d 時算法收斂,且此時x=A?1bx= \def\foo{A^{-1}} \foo bx=A?1b。其中DLUD L UDLU 分別為 AAA 矩陣的對角線矩陣,下三角矩陣和上三角矩陣。
在上述中介紹到兩種方法都是通過定義迭代矩陣 x=Gx+dx=Gx+dx=Gx+d 來求解 xxx 的。因此接下來分別介紹,GaussSeidel 和Jacobi分別時怎樣定義迭代矩陣的。
GaussSeidelGaussSeidelGaussSeidel
公式推導
矩陣形式
A=D+L+UA = D + L + UA=D+L+U
Ax=bAx=bAx=b
(D+L+U)x=b(D+L+U)x=b(D+L+U)x=b
(D+L)x=?Ux+b(D+L)x = -Ux+b(D+L)x=?Ux+b
x=?(D+L)?1Ux+(D+L)?1bx = -\def\foo{{(D+L)}^{-1}}\foo Ux + \def\foo{{(D+L)}^{-1}}\foo bx=?(D+L)?1Ux+(D+L)?1b
?x=Gx+d\implies x = Gx +d?x=Gx+d
由上述推導可知,在GaussSeidelGaussSeidelGaussSeidel中 G=?(D+L)?1UG=-\def\foo{{(D+L)}^{-1}}\foo UG=?(D+L)?1U, d=(D+L)?1bd= \def\foo{{(D+L)}^{-1}}\foo bd=(D+L)?1b
非矩陣形式
xik=1aii(b?∑0<j<iaijxjk?∑j>iaijxjk?1))x_{i}^{k} = \frac{1}{a_{ii}} (b- \sum_{0<j<i} {a_{ij} x_{j}^{k}}-\sum_{j>i} {a_{ij} x_{j}^{k-1}}) )xik?=aii?1?(b?0<j<i∑?aij?xjk??j>i∑?aij?xjk?1?))
其中 xikx_{i}^{k}xik? 代表 xxx 的第iii個分量在第kkk次迭代中的結果
代碼示例
使用非矩陣形式實現在稀疏矩陣csr_matrix下實現的GaussSeidelGaussSeidelGaussSeidel。
# A csr_matrix import sys import copy import numpy as np import networkx as nx from scipy.sparse import spdiags, tril, triu, coo_matrix, csr_matrixdef gauss_seidel(A, b, x0 = None, maxiter=20):# x0 = spsolve(A, b)if x0 is None:x0 = np.array( [0.0]*A.shape[0] )for _ in range(maxiter):n, _, indptr, indices, data = A.shape[0], A.nnz, A.indptr, A.indices, A.datafor row in range(n):aii, sumi = 0.0, 0.0for j in range(indptr[row], indptr[row+1]):if row == indices[j]:aii = 1.0/data[j]else:sumi += data[j] * x0[ indices[j] ]x0[row] = (aii * (b[row] - sumi) )return x0 if __name__ == '__main__': A = csr_matrix(([10,-2,-1, -2,10,-1, -1,-2,5], ([0,0,0,1,1,1,2,2,2], [0,1,2,0,1,2,0,1,2]) ) , shape=(3,3), dtype=np.float32)x = np.ones(A.shape[0])b = A.dot(x)xk = gauss_seidel(A, b)print(x)print(xk)輸出如下
JacobiJacobiJacobi
公式推導
矩陣形式
A=D+L+UA = D + L + UA=D+L+U
Ax=bAx=bAx=b
(D+L+U)x=b(D+L+U)x=b(D+L+U)x=b
Dx=?(L+U)x+bDx = -(L+U)x+bDx=?(L+U)x+b
x=?D?1(L+U)x+D?1bx = -\def\foo{D^{-1}}\foo (L+U)x + \def\foo{D^{-1}}\foo bx=?D?1(L+U)x+D?1b
?x=Gx+d\implies x = Gx +d?x=Gx+d
由上述推導可知,在Jacobi中 G=?D?1(L+U)G=-\def\foo{D^{-1}}\foo (L+U)G=?D?1(L+U), d=D?1bd= \def\foo{D^{-1}}\foo bd=D?1b
非矩陣形式
xik=1aii(b?∑j!=iaijxjk?1)x_{i}^{k}= \frac{1}{a_{ii}}(b-\sum_{j!=i} {a_{ij} x_{j}^{k-1}})xik?=aii?1?(b?j!=i∑?aij?xjk?1?)
代碼示例
使用矩陣形式實現在稀疏矩陣csr_matrix下實現的JacobiJacobiJacobi。
# A csr_matrix import sys import copy import numpy as np from scipy.sparse import spdiags, tril, triu, coo_matrix, csr_matrix def jacobi(A, b, x0 = None, maxiter=20):if x0 is None:x0 = np.array( [0.0]*A.shape[0] )D = spdiags(A.diagonal(), np.array([0]), A.shape[0], A.shape[1]) # default with <class 'scipy.sparse.dia.dia_matrix'> L = tril(A) - DU = triu(A) - D dia = generate_dia_inv(D)B = -( dia ).dot(L+U)f = ( dia ).dot(b)for _ in range(maxiter):x0 = B.dot(x0) + freturn x0 def generate_dia_inv(mat):res_dia = mat.diagonal()res_dia = 1.0/res_diares_mat = csr_matrix((res_dia.shape[0], res_dia.shape[0]))res_mat.setdiag(res_dia)return res_mat if __name__ == '__main__': A = csr_matrix(([10,-2,-1, -2,10,-1, -1,-2,5], ([0,0,0,1,1,1,2,2,2], [0,1,2,0,1,2,0,1,2]) ) , shape=(3,3), dtype=np.float32)x = np.ones(A.shape[0])b = A.dot(x)xk = jacobi(A, b)print(x)print(xk)輸出如下
收斂性
因為兩種方法的根本思想是一致的,都是通過迭代公式 x=Gx+dx = Gx +dx=Gx+d 來求解 xxx。所以直接通過此迭代公式來看兩種方法收斂的條件。
令誤差向量 ei=xi?x\def\foo{e^{i}}\foo = \def\foo{x^{i}}\foo-xei=xi?x,其中 xxx 是 Ax=bAx=bAx=b的精確解, ei\def\foo{e^{i}}\fooei是GaussSeidelGaussSeidelGaussSeidel或者JacociJacociJacoci第iii次迭代所求解。
| 由于 xi=Gxi?1+d\def\foo{x^{i}}\foo = G\def\foo{x^{i-1}}\foo+dxi=Gxi?1+d |
| 且 x=Gx+dx = Gx+dx=Gx+d |
| 所以有,ei=Gei?1\def\foo{e^{i}}\foo = G\def\foo{e^{i-1}}\fooei=Gei?1 |
| 且 ei?1=Gei?2\def\foo{e^{i-1}}\foo = G\def\foo{e^{i-2}}\fooei?1=Gei?2 |
| ......... |
| 因此,ei=Gie0\def\foo{e^{i}}\foo = \def\foo{G^{i}}\foo\def\foo{e^{0}}\fooei=Gie0 |
| 當迭代法收斂時,就意味著 lim?i→∞ei→0\lim\limits_{i\rarr\infin}\def\foo{e^{i}}\foo\rarr0i→∞lim?ei→0 |
| 由特征值和特征向量的定義可知Gζi=λiζiG\zeta_i=\lambda_i\zeta_iGζi?=λi?ζi?,且特征向量之間線性無關 |
| 因此e0=Σδkζk\def\foo{e^{0}}\foo=\Sigma\delta_k\zeta_ke0=Σδk?ζk?, 可以這樣表示,且 δk\delta_kδk?是定值 |
| 則e1=Ge0=G∑δkζk=∑δkGζk=∑δkλkζk\def\foo{e^{1}}\foo = \def\foo{G}\foo\def\foo{e^{0}}\foo = G \sum\delta_k\zeta_k = \sum\delta_kG \zeta_k = \sum\delta_k \lambda_k \zeta_ke1=Ge0=G∑δk?ζk?=∑δk?Gζk?=∑δk?λk?ζk?,由 Gζi=λiζiG\zeta_i=\lambda_i\zeta_iGζi?=λi?ζi?得。 |
| 則e2=∑δkλk2ζk\def\foo{e^{2}}\foo= \sum\delta_k \lambda_k^{2} \zeta_ke2=∑δk?λk2?ζk? , e3=∑δkλk3ζk\def\foo{e^{3}}\foo= \sum\delta_k \lambda_k^{3} \zeta_ke3=∑δk?λk3?ζk? … |
| 那么 lim?i→∞ei=lim?i→∞∑λkiδkζk\lim\limits_{i\rarr\infin}\def\foo{e^{i}}\foo =\lim\limits_{i\rarr\infin} \sum \lambda_k^{i} \delta_k\zeta_ki→∞lim?ei=i→∞lim?∑λki?δk?ζk? |
| 其中δkζk\delta_k\zeta_kδk?ζk?是定值 |
| 則當 abs(λk)>1?lim?i→∞ei→∞abs(\lambda_k) > 1 \implies\lim\limits_{i\rarr\infin}\def\foo{e^{i}}\foo\rarr\infinabs(λk?)>1?i→∞lim?ei→∞ |
| 當 abs(λk)<1?lim?i→∞ei→0abs(\lambda_k) < 1 \implies\lim\limits_{i\rarr\infin}\def\foo{e^{i}}\foo\rarr0abs(λk?)<1?i→∞lim?ei→0 |
| 綜上,當迭代矩陣GGG的所有特征值 abs(λk)<1abs(\lambda_k) < 1abs(λk?)<1時, 該迭代方法收斂。 |
總結
以上是生活随笔為你收集整理的GaussSeidel迭代 Jacobi迭代及其收敛性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 评价神经网络性能的指标,神经网络收敛性分
- 下一篇: matlab判断下列级数的收敛性