Gauss-Seidel迭代法解线性方程组的python实现

介绍

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)

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值