一般的线性方程组矩阵形式如下
迭代解法的思想:任取初值,将其代入设计到的迭代公式,得到,逐步迭代至于收敛。
How to 设计迭代公式?
雅克比迭代法建设系数矩阵的对角元素不为0,因此,由上式可得
将上式写成矩阵形式为
其中,
若记,则迭代公式变为
其中是迭代矩阵,在进行迭代计算时,式(3)变为
Example
x
221import numpy as np234def jacobi(A, b, x0, tol):5 D = np.diag(np.diag(A)) #对角矩阵6 L = np.tril(A,-1) #下三角矩阵的下一格7 U = np.triu(A, 1) #上三角矩阵的上一格8 B = -np.dot(np.linalg.inv(D),(L+U))9 d = np.dot(np.linalg.inv(D), b)10 x = x011 while np.linalg.norm(np.dot(A,x)-b) > tol:12 x = np.dot(B, x) + d13 return x141516if __name__ == '__main__':17 A = np.array([[2, 1], [1, -1]], dtype=np.float)18 b = np.array([[3], [0]], dtype=np.float)19 x0 = np.array([[0], [0]])20 tol = 0.0121 x = jacobi(A, b, x0, tol)22 print(x)从雅克比到高斯-赛德尔
在雅克比迭代过程中,当次迭代计算分量时,分量 都已经计算完成,但是在计算时,雅克比迭代法并没有利用这些新计算出来的值,如果这些值能得以使用,则可以提高计算速度,这就是高斯-赛德尔迭代法的来源。
部分移项到左边后,用方程组用矩阵的形式表示为
写成迭代方程为
其中,
xxxxxxxxxx101def gsdddy(A, b, x0, tol):2 D = np.diag(np.diag(A)) #对角矩阵3 L = np.tril(A,-1) #下三角矩阵的下一格4 U = np.triu(A, 1) #上三角矩阵的上一格5 G = np.dot(-np.linalg.inv(D+L), U)6 d = np.dot(np.linalg.inv(D+L), b)7 x = x08 while np.linalg.norm(np.dot(A, x)-b) > tol:9 x = np.dot(G,x) + d10 return x