介绍
Gauss-Seidel迭代法的收敛速度近似于Jacobi迭代法收敛速度的两倍,但与此同时,G-s方法也存在着局限性,它并不能求解所有的线性方程组,也就是说解随着迭代次数的增加是发散的。
在某些情况下,求解某个线性方程组,用Jacobi迭代法收敛,而用G-s迭代法却不收敛(发散)。
代码
G-s迭代法实现代码如下:
# 定义迭代次数和容忍误差
times0 = 2000
tol = 1e-3
def G_s(A, b, x):
n = len(b)
times = 0
er = 1000
# 初始解
x0 = [0 for i in range(0, n)]
while times < times0 and er > tol:
for i in range(0, n):
sigma = 0
for j in range(0, n):
if i == j:
continue
sigma += A[i][j] * x[j]
x[i] = (b[i] - sigma) / A[i][i]
# 计算当前误差
er = max(abs(a - b) for a, b in zip(x, x0))
# 若当前误差小于容忍误差,则结束方法并返回当前解
if er < tol:
return x
x0 = x.copy()
times += 1
print("在最大迭代次数内不收敛")
# 示例
# 系数矩阵
A = [[8, -16, 2], [4, 11, -1], [6, 3, 16]]
# 右端向量
b = [20, 33, 36]
# 解向量
x = [0 for i in range(0, len(b))]
#求解线性方程组
x = G_s(A, b, x)
print("G-s迭代法求解结果如下:\n",x)