python实现雅克比(Jacobi)迭代法

# -*- coding: utf-8 -*-

#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 False #若达到设定的迭代结果仍不满足精度要求 则方程无解
    else:
        return False

#调用 Jacobi(mx,mr,n=100,c=0.001) 示例
mx = [[8,-3,2],[4,11,-1],[6,3,12]]

mr = [[20],[33],[36]]
print(Jacobi(mx,mr,100,0.00001))

 

  • 10
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
雅克迭代法是解线性方程组的一种迭代方法,它以迭代的方式逼近方程的解,直到满足一定精度或次数要求为止。本篇文章将介绍雅克迭代法的算法伪代码和Python实现。 算法伪代码如下: 输入:系数矩阵A和常数向量b,迭代次数M和误差容限ε 输出:n元线性方程组Ax=b的解x 初始化向量x(0),k=0 重复直到k>=M或误差小于ε: k=k+1 对于每个分量i,计算:x(i)(k)=(bi-Σ(a(i,j)*x(j)(k-1)))/a(i,i),j=i+1,……,n 计算误差:err=|x(k)-x(k-1)|2 / |x(k)|2 返回向量x(k) Python代码如下: ```python import numpy as np def jacobi(A, b, x0, M, eps): n = len(b) x = x0.copy() for k in range(M): # 计算下一轮迭代的 x for i in range(n): x[i] = (b[i]-np.dot(A[i,:i],x0[:i])-np.dot(A[i,i+1:],x0[i+1:]))/A[i,i] # 判断是否满足精度要求 err = np.linalg.norm(x-x0)/np.linalg.norm(x) if err < eps: return x, k+1 # 更新 x0 x0 = x.copy() return x, k+1 ``` 其中,A是系数矩阵,b是常数向量,x0是初始解向量,M是最大迭代次数,eps是精度容限。 在算法实现中,首先将x0复制一份作为迭代的初始向量x,然后进行迭代: $$x_i^{(k)}=\frac{b_i-\sum\limits_{j=1,j\neq i}^na_{ij}x_j^{(k-1)}}{a_{ii}},\ i=1,2,\cdots,n$$ 每完成一轮迭代,计算误差: $$err=\frac{\left\Vert x^{(k)}-x^{(k-1)} \right\Vert_2}{\left\Vert x^{(k)} \right\Vert_2}$$ 如果误差小于预设值eps,则返回当前解x和完成的迭代次数k。如果迭代次数到达最大次数M仍未满足精度要求,则返回当前解x和迭代次数k。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值