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

import numpy as np
#e为误差
def Jacobi(A,b,x,e,times=100):
    length, width = np.shape(A)
    D = np.mat(np.diag(np.diag(A)))
    L = np.triu(A, 1)
    U = np.tril(A, -1)
    J = -D.I * (L + U)
    H = np.eye(length) - D.I * A
    eig,_ = np.linalg.eig(H)
    spectral_radius = max(abs(eig))
    if spectral_radius < 1:
        print('此方程组收敛,谱半径为',round(spectral_radius,5))

        x0=x
        x = J * x + D.I * b
        #x = D.I*(b-(L+U)*x0)
        k = 1
        while k < times:
            if abs(np.max(abs(x-x0), axis=0))>e:
                x0=x
                x = J * x + D.I * b
                #x=D.I*(b-(L+U)*x0)
                k += 1
            else:
                print('当精度为', e, '时,Jacobi在%d次内收敛' % k)
                break
        print('Jacobi迭代解为\n', x)
B = np.mat([[8,-1,1],[2,10,-1],[1,1,-5]])
b = np.mat('1;4;3')
x = np.mat('0;0;0')
e = 0.001
times = 100
Jacobi(B,b,x,e,times)

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
雅克迭代法是解线性方程组的一种迭代方法,它以迭代的方式逼近方程的解,直到满足一定精度或次数要求为止。本篇文章将介绍雅克迭代法的算法伪代码和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。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值