一般的线性方程组矩阵形式如下
迭代解法的思想:任取初值,将其代入设计到的迭代公式,得到,逐步迭代至于收敛。
How to 设计迭代公式?
雅克比迭代法建设系数矩阵的对角元素不为0,因此,由上式可得
将上式写成矩阵形式为
其中,
若记,则迭代公式变为
其中是迭代矩阵,在进行迭代计算时,式(3)变为
Example
x
221import numpy as np
2
3
4def 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 = x0
11 while np.linalg.norm(np.dot(A,x)-b) > tol:
12 x = np.dot(B, x) + d
13 return x
14
15
16if __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.01
21 x = jacobi(A, b, x0, tol)
22 print(x)
从雅克比到高斯-赛德尔
在雅克比迭代过程中,当次迭代计算分量时,分量 都已经计算完成,但是在计算时,雅克比迭代法并没有利用这些新计算出来的值,如果这些值能得以使用,则可以提高计算速度,这就是高斯-赛德尔迭代法的来源。
部分移项到左边后,用方程组用矩阵的形式表示为
写成迭代方程为
其中,
xxxxxxxxxx
101def 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 = x0
8 while np.linalg.norm(np.dot(A, x)-b) > tol:
9 x = np.dot(G,x) + d
10 return x