数值分析---Jacobi迭代法

目录

1、概述

2、知识结构

3、代码(以三阶为例) 

4、代码(成百上千阶方法):


1、概述

       许多实际问题的数学模型最终都要归结为求解线性方程组。例如:石油工业的油气资源探查、航天工业中飞机导弹的设计、天气预报和核武器的设计等,都需要求解线性方程组。这些方程组,大多规模很大,未知元达到几十万个,而且有的方程组对求解时间也有严格的限制,例如数值1天气预报,为了赶上每天发布预报的需要,只有短短几个小时的计算时间。如何快速求解线性方程组是科学与工程计算的核心问题之一。

2、知识结构

3、代码(以三阶为例) 

import numpy as np

A = np.array([[10.0, -1, -2], [-1, 10, -2], [-1, -1, 5]])
B = np.array([7.2, 8.3, 4.2])
x0 = np.array([1.0, 1, 1])
x = np.array([0.0, 0, 0])
times=0
while True:
    for i in range(3):
        temp = 0
        for j in range(3):
            if i != j:
                temp += x0[j] * A[i][j]
        x[i] = (B[i] - temp) / A[i][i]
#误差分析部分:
    calTemp = max(abs(x - x0))
    times += 1
    if calTemp < 1e-6:
        break
    else:
        x0 = x.copy()            #如果误差过大,让x0=x,进行下一次循环
    print("迭代次数为:{0},迭代值为:{1}".format(times,x))

#结果

迭代次数为:1,迭代值为:[1.02 1.13 1.24]
迭代次数为:2,迭代值为:[1.081 1.18  1.27 ]
迭代次数为:3,迭代值为:[1.092  1.1921 1.2922]
迭代次数为:4,迭代值为:[1.09765 1.19764 1.29682]
迭代次数为:5,迭代值为:[1.099128 1.199129 1.299058]
迭代次数为:6,迭代值为:[1.0997245 1.1997244 1.2996514]
迭代次数为:7,迭代值为:[1.09990272 1.19990273 1.29988978]
迭代次数为:8,迭代值为:[1.09996823 1.19996823 1.29996109]
迭代次数为:9,迭代值为:[1.09998904 1.19998904 1.29998729]
迭代次数为:10,迭代值为:[1.09999636 1.19999636 1.29999562]
迭代次数为:11,迭代值为:[1.09999876 1.19999876 1.29999854]

Process finished with exit code 0

4、代码(成百上千阶方法):

import numpy as np

#雅可比迭代法
def Jacobi(n,A,B,x0,x,eps,k):
    times = 0        #迭代次数
    while times<k:
        for i in range(n):
            temp = 0
            for j in range(n):
                if i != j:
                    temp += x0[j] * A[i][j]
            x[i] = ((B[i] - temp) / A[i][i])
        error = max(abs(x - x0))
        times += 1
        if error < eps:
            print("精确度等于{0}时,雅可比迭代法需要迭代{1}次收敛".format(eps,times))
            return (x, times)
        else:
            x0 = x.copy()
    print("在最大迭代次数内不收敛","最大迭代次数后的结果为:",x)
    return None
def main():
    n=3
    A = np.array([[10.0, -1, -2], [-1, 10, -2], [-1, -1, 5]])
    B = np.array([7.2, 8.3, 4.2])
    x0 = np.array([1.0, 1, 1])
    x = np.array([0.0, 0, 0])
    eps=10**(-7)
    k=100      #最大迭代次数
    Ja=Jacobi(n,A,B,x0,x,eps,k)
    print(Ja)


if __name__ =='__main__':
    main()
#结果


精确度等于1e-07时,雅可比迭代法需要迭代15次收敛
(array([1.09999998, 1.19999998, 1.29999998]), 15)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值