对给定的线性方程组进行迭代求解(python实现)

文章介绍了两种用于求解线性方程组的迭代方法——Jacobi迭代法和Gauss-Seidel迭代法,提供了对应的Python函数实现。在给定的示例中,Jacobi方法在某些情况下可能导致发散,而Gauss方法能得出解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题需求

对给定的线性方程组进行迭代求解。

调用条件:系数矩阵A,右端项b,初值,精度要求

输出结果:方程组的近似解。

给定线性方程组,和,取初始值为0

Jacobi迭代的通用程序。

Jacobi迭代法:

#Jacobi迭代法 输入系数矩阵mx、值矩阵mr、迭代次数n、误差c(以list模拟矩阵 行优先)
def Jacobi(mx,mr,n=100,c=0.0001):
    if len(mx) == len(mr):  #若mx和mr长度相等则开始迭代 否则方程无解
        x = [] #迭代初值 初始化为单行全0矩阵
        for i in range(len(mr)):
            x.append([0])
        count = 0 #迭代次数计数
        while count < n:
            nx = [] #保存单次迭代后的值的集合
            for i in range(len(x)):
                nxi = mr[i][0]
                for j in range(len(mx[i])):
                    if j!=i:
                        nxi = nxi+(-mx[i][j])*x[j][0]
                nxi = nxi/mx[i][i]
                nx.append([nxi]) #迭代计算得到的下一个xi值
            lc = [] #存储两次迭代结果之间的误差的集合
            for i in range(len(x)):
                lc.append(abs(x[i][0]-nx[i][0]))
            if max(lc) < c:
                return nx #当误差满足要求时 返回计算结果
            x = nx
            count = count + 1
        return "使用Jacobi迭代法发散" #若达到设定的迭代结果仍不满足精度要求 则方程无解
    else:
        return False

Gauss-Seidel迭代的通用程序。

Gauss迭代法:

#Gauss迭代法 输入系数矩阵mx、值矩阵mr、迭代次数n(以list模拟矩阵 行优先)
def Gauss(mx,mr,n):
    if len(mx) == len(mr):  #若mx和mr长度相等则开始迭代 否则方程无解
        x = [] #迭代初值 初始化为单行全0矩阵
        for i in range(len(mr)):
            x.append([0])
        count = 0 #迭代次数计数
        while count < n:
            for i in range(len(x)):
                nxi = mr[i][0]
                for j in range(len(mx[i])):
                    if j!=i:
                        nxi = nxi+(-mx[i][j])*x[j][0]
                nxi = nxi/mx[i][i]
                x[i][0] = nxi
            count = count + 1
        return x 
    else:
        return False

调用例子1:

调用方法:

 #调用 Gauss(mx,mr,n=100) 示例
mx = [[2,-1,1],[2,2,2],[-1,-1,2]]
mr = [[-1],[4],[-5]]
print(Jacobi(mx,mr,100,0.001))
print(Gauss(mx,mr,100))

输出结果:

使用Jacobi迭代法发散 
使用Gauss的结果:[[1.0], [2.0], [-1.0]] 

调用例子2:

调用方法:

#调用 Jacobi(mx,mr,n=100,c=0.001) 示例
mx = [[1,2,-2],[1,1,1],[2,2,1]]
mr = [[7],[2],[5]]
print(Jacobi(mx,mr,100,0.001))
print(Gauss(mx,mr,100))

输出结果:

使用Jacobi的结果:[[1.0], [2.0], [-1.0]] 
使用Gauss迭代法发散  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值