数值分析:Python实现高斯赛德尔迭代法(Gauss-Seidel)与雅可比迭代法(Jacobi)

Python实现高斯赛德尔迭代法(Gauss-Seidel)与雅可比迭代法(Jacobi)

数值分析:Python实现高斯赛德尔迭代法(Gauss-Seidel)与雅可比迭代法(Jacobi)

一、基本迭代法

在这里插入图片描述

二、雅可比迭代法(Jacobi)

在这里插入图片描述
在这里插入图片描述

三、高斯—赛德尔迭代法(Gauss-Seidel)在这里插入图片描述

题目:分别使用雅可比迭代法与高斯—赛德尔迭代法求解Ax=b线性方程组,其中A为10阶希尔伯特矩阵输出解向量与迭代次数。

希尔伯特矩阵 Hilbert matrix

希尔伯特矩阵(Hilbert matrix),矩阵的一种,其元素A(i,j)=1/(i+j-1),i,j分别为其行标和列标。
在这里插入图片描述

代码实现:

import numpy as np
n=10
def Jacobi(A,b,x0,xstar):
    k=0
    while True:
        for i in range(0, n):
            sum = 0.0
            for j in range(0, i):
                sum = sum + A[i][j] * x0[j]
            for j in range(i + 1, n):
                sum = sum + A[i][j] * x0[j]
            xstar[i] = (b[i] - sum) / A[i][i]
        temp = np.fabs(xstar[0] - x0[0])
        for j in range(1, n):
            if np.fabs(xstar[j] - x0[j]) > temp:
                temp = np.fabs(xstar[j] - x0[j])
        for j in range(0, n):
            x0[j] = xstar[j]
        k = k + 1
        if (temp < 1.0e-6 or k > 1000) :
            break
    print("Jacobi:",k)

def Gauss(A,b,x0,xstar):
    k = 0
    while True:
        for i in range(0, n):
            sum = 0.0
            for j in range(0, i):
                sum = sum + A[i][j] * xstar[j]
            for j in range(i + 1, n):
                sum = sum + A[i][j] * x0[j]
            xstar[i] = (b[i] - sum) / A[i][i]
        temp = np.fabs(xstar[0] - x0[0])
        for j in range(1, n):
            if np.fabs(xstar[j] - x0[j]) > temp:
                temp = np.fabs(xstar[j] - x0[j])
        for j in range(0, n):
            x0[j] = xstar[j]
        k = k + 1
        if (temp < 1.0e-6 or k > 1000) :
            break
    print("Gauss:",k)

def main():
    A=np.zeros([n,n],float)
    b=np.zeros(n,float)
    x0=np.zeros(n,float)
    Jex = np.zeros(n,float)
    GSex = np.zeros(n,float)
    for i in range(0,n):
        for j in range(0,n):
            A[i][j] = 1./(i+1+j)
    for i in range(0,n):
        A[i][i] = A[i][i] + 0.5
        b[i] = 1
        x0[i] = 0

    Jacobi(A,b,x0,Jex)
    for i in range(0,n):
        x0[i] = 0
    Gauss(A,b,x0,GSex)
    for i in range(0,n):
        print("Jex[",i,"]=",Jex[i])
    print("\n")
    for i in range(0,n):
        print("GSex[",i,"]=",GSex[i])

if __name__ == '__main__':
main()

通过编码计算,对比两种算法的收敛速度与结果。可以看出,高斯赛德
尔迭代法的收敛速度比雅可比迭代法收敛速度要快的多。

  • 3
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

樱吹雪、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值