Jacobi和Gauss-Seidel迭代法求解方程组

本文深入探讨迭代法原理,对比Jacobi与Gauss-Seidel两种迭代法,通过具体实例展示不同迭代法的收敛速度及适用场景,适用于数值计算方法的学习与研究。

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

迭代法简介

迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代算法是用计算机解决问题的一种基本方法,它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值,迭代法又分为精确迭代和近似迭代。比较典型的迭代法如“二分法”和"牛顿迭代法”属于近似迭代法。

Jacobi迭代

以如下方程组为例:
10 x 1 − 2 x 2 − x 3 = 3 10x{_1}-2x{_2}-x{_3}=3 10x12x2x3=3
− 2 x 1 + 10 x 2 − x 3 = 15 -2x{_1}+10x{_2}-x{_3}=15 2x1+10x2x3=15
− 1 x 1 − 2 x 2 − 5 x 3 = 10 -1x{_1}-2x{_2}-5x{_3}=10 1x12x25x3=10

高斯消元法(高中用的那种)可以算出结果分别为1,2,3

Jacobi的计算过程:
先对每行分别进行变换,左边分别只留下 x 1 、 x 2 、 x 3 x{_1}、x{_2}、x{_3} x1x2x3
x 1 = 0.2 x 2 + 0.1 x 3 + 0.3 x{_1}=0.2x{_2}+0.1x{_3}+0.3 x1=0.2x2+0.1x3+0.3
x 2 = 0.2 x 1 + 0.1 x 3 + 1.5 x{_2}=0.2x{_1}+0.1x{_3}+1.5 x2=0.2x1+0.1x3+1.5
x 3 = 0.2 x 1 + 0.4 x 2 + 2 x{_3}=0.2x{_1}+0.4x{_2}+2 x3=0.2x1+0.4x2+2
相信大家到这一步都会,那么我们就开始分别计算 x 1 、 x 2 、 x 3 x{_1}、x{_2}、x{_3} x1x2x3的值吧。

先设 x 1 、 x 2 、 x 3 x{_1}、x{_2}、x{_3} x1x2x3都为0,第一次迭代,他们的结果分别为: 0.3 、 1.5 、 2 0.3、1.5、2 0.31.52

然后把 0.3 、 1.5 、 2 0.3、1.5、2 0.31.52分别带入 x 1 、 x 2 、 x 3 x{_1}、x{_2}、x{_3} x1x2x3计算,则:
x 1 = 0.2 x 2 + 0.1 x 3 + 0.3 = 0.2 ∗ 1.5 + 0.1 ∗ 2 + 0.3 = 0.8 x{_1}=0.2x{_2}+0.1x{_3}+0.3=0.2*1.5+0.1*2+0.3=0.8 x1=0.2x2+0.1x3+0.3=0.21.5+0.12+0.3=0.8
x 2 = 0.2 x 1 + 0.1 x 3 + 1.5 = 0.2 ∗ 0.3 + 0.1 ∗ 0.2 + 1.5 = 1.76 x{_2}=0.2x{_1}+0.1x{_3}+1.5=0.2*0.3+0.1*0.2+1.5=1.76 x2=0.2x1+0.1x3+1.5=0.20.3+0.10.2+1.5=1.76
x 3 = 0.2 x 1 + 0.4 x 2 + 2 = 0.2 ∗ 0.3 + 0.4 ∗ 1.5 + 2 = 2.66 x{_3}=0.2x{_1}+0.4x{_2}+2=0.2*0.3+0.4*1.5+2=2.66 x3=0.2x1+0.4x2+2=0.20.3+0.41.5+2=2.66

迭代10次可得结果如下:

次数 x 1 x{_1} x1 x 2 x{_2} x2 x 3 x{_3} x3
10.31.52.0
20.81.762.66
30.9181.9262.864
40.9721.972.954
50.9891.992.982
60.9961.9962.994
70.9991.9992.998
81.02.02.999
91.02.03.0
101.02.03.0

其python代码如下:

x1=0
x2=0
x3=0
print('Jacobi')
for i in range(10):
    x11=round(0.2*x2+0.1*x3+0.3,3)
    x22=round(0.2*x1+0.1*x3+1.5,3)
    x33=round(0.2*x1+0.4*x2+2,3)
    print('|',i+1,'|',x11,'|',x22,'|',x33,'|')
    x1=x11
    x2=x22
    x3=x33

其中round是将结果保留3位小数。

上面这个过程叫Jacobi迭代。

Gauss-Seidel迭代

高斯迭代唯一的区别在于,在每次迭代的过程中,都使用最新的值,直接上代码大家应该也可以看明白:

x1=0
x2=0
x3=0
print('Gauss-Seidel')
for i in range(10):
    x1=round(0.2*x2+0.1*x3+0.3,3)
    x2=round(0.2*x1+0.1*x3+1.5,3)
    x3=round(0.2*x1+0.4*x2+2,3)
    print('|',i+1,'|',x1,'|',x2,'|',x3,'|')

其10次迭代的结果如下:

次数 x 1 x{_1} x1 x 2 x{_2} x2 x 3 x{_3} x3
10.31.562.684
20.881.9442.954
30.9841.9922.994
40.9981.9992.999
51.02.03.0
61.02.03.0
71.02.03.0
81.02.03.0
91.02.03.0
101.02.03.0

可以看到,只用5次就得到了正确的结果。
所以这里可以发现,高斯迭代法使用的空间小,并且计算速度快。

例2

为了计算复用,可以将函数封装一下:

#1.(1)
data=[
[10,-2,-1,3],
[-2,10,-1,15],
[-1,-2,5,10]
]

x=zeros(3)
xx=zeros(3)
print('Jacobi')
for i in range(10):
    xx[0]=round((-data[0][1]*x[1]-data[0][2]*x[2]+data[0][3])/data[0][0],3)
    xx[1]=round((-data[1][0]*x[0]-data[1][2]*x[2]+data[1][3])/data[1][1],3)
    xx[2]=round((-data[2][0]*x[0]-data[2][1]*x[1]+data[2][3])/data[2][2],3)
    x[0]=xx[0];x[1]=xx[1];x[2]=xx[2]
    print('|',i+1,'|',x[0],'|',x[1],'|',x[2],'|')
    #print(i+1,x[0],x[1],x[2])

x=zeros(3)
print('Gauss-Seidel')
for i in range(10):
    x[0]=round((-data[0][1]*x[1]-data[0][2]*x[2]+data[0][3])/data[0][0],3)
    x[1]=round((-data[1][0]*x[0]-data[1][2]*x[2]+data[1][3])/data[1][1],3)
    x[2]=round((-data[2][0]*x[0]-data[2][1]*x[1]+data[2][3])/data[2][2],3)
    print('|',i+1,'|',x[0],'|',x[1],'|',x[2],'|')
    #print(i+1,x[0],x[1],x[2])

得到的结果和上面一致:
Jacobi:

次数 x 1 x{_1} x1 x 2 x{_2} x2 x 3 x{_3} x3
10.31.52.0
20.81.762.66
30.9181.9262.864
40.9721.972.954
50.9891.992.982
60.9961.9962.994
70.9991.9992.998
81.02.02.999
91.02.03.0
101.02.03.0

Gauss-Seidel:

次数 x 1 x{_1} x1 x 2 x{_2} x2 x 3 x{_3} x3
10.31.562.684
20.881.9442.954
30.9841.9922.994
40.9981.9992.999
51.02.03.0
61.02.03.0
71.02.03.0
81.02.03.0
91.02.03.0
101.02.03.0

上面这个例子是《数值计算方法》第二版 北京理工大学出版社 习题三的1(1),下面计算1(1)。
只需要修改数据:

#1.(2)
data=[
[8,-3,2,20],
[4,11,-1,33],
[2,1,4,12]
]

运行结果如下:
Jacobi:

次数 x 1 x{_1} x1 x 2 x{_2} x2 x 3 x{_3} x3
12.53.03.0
22.8752.3641.0
33.1362.0450.971
43.0241.9480.921
53.01.9841.001
62.9942.01.004
72.9992.0031.003
83.02.0011.0
93.02.01.0
103.02.01.0

Gauss-Seidel:

次数 x 1 x{_1} x1 x 2 x{_2} x2 x 3 x{_3} x3
12.52.0911.227
22.9772.0291.004
33.011.9970.996
43.02.01.0
53.02.01.0
63.02.01.0
73.02.01.0
83.02.01.0
93.02.01.0
103.02.01.0

可以看出高斯法只需要4次就有结果了。

例3

以习题三的3题为例:

data=[
[1,2,-2,1],
[1,1,1,1],
[2,2,1,1]
]

其结果如下:
Jacobi:

次数 x 1 x{_1} x1 x 2 x{_2} x2 x 3 x{_3} x3
11.01.01.0
21.0-1.0-3.0
3-3.03.01.0
4-3.03.01.0
5-3.03.01.0
6-3.03.01.0
7-3.03.01.0
8-3.03.01.0
9-3.03.01.0
10-3.03.01.0

Gauss-Seidel:

次数 x 1 x{_1} x1 x 2 x{_2} x2 x 3 x{_3} x3
11.00.0-1.0
2-1.03.0-3.0
3-11.015.0-7.0
4-43.051.0-15.0
5-131.0147.0-31.0
6-355.0387.0-63.0
7-899.0963.0-127.0
8-2179.02307.0-255.0
9-5123.05379.0-511.0
10-11779.012291.0-1023.0

可以看出Jacobi迭代法迭代3次就能计算出答案,而Gauss-Seidel法得到的结果却发散了,可见Gauss-Seidel在使用时还有一定的要求。

上述内容是本人课程学习随笔,如有错误欢迎指出,共同学习。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值