关于雅可比迭代的Python实现

发布于:2022-12-29 ⋅ 阅读:(641) ⋅ 点赞:(0)

目录

一、提要

二、雅可比迭代的矩阵原理

三、雅可比迭代的前提

四、程序实现


一、提要

        雅克比迭代法就是众多迭代法中比较早且较简单的一种,其命名也是为纪念普鲁士著名数学家雅可比。雅克比迭代法的计算公式简单,每迭代一次只需计算一次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,比较容易进行计算。

        雅可比迭代是数字解法,然而该方法是有一定条件,如果不能正确地辨别这些条件是不可能得到正确解的,本文将针对这种算法的原理进行介绍,和程序实现。

二、雅可比迭代的矩阵原理

        对于方程AX=b,首先将方程组中的系数矩阵A分解成三部分,即:A=L + D + U,其中D为对角阵,L为下三角矩阵U为上三角矩阵。

         因AX=b 所以 (L+U+D)X = b,进一步:

        (D)X = b - ( L+U)X

        X = D^{-1}b -D^{-1} ( L+U)X

因此雅可比迭代公式:

        X ^{k+1} =B_JX^k+f_J

        B_J=D^{-1}( L + U )(称为雅可比迭代矩阵)

        f_J=D^{-1}b

三、雅可比迭代的前提

        对于线性方程AX=b,用雅可比迭代求解是需要条件有三:

  • 方阵A必须是非奇异的,即A的行列式必须非0
  • 对角线元素必须非0
  • 矩阵A对角占优

        对角优势矩阵是指一矩阵的每一横行,对角线上元素的大小大于或等于同一横行其他元素大小的和,一矩阵A为对角优势矩阵若

{\displaystyle |a_{ii}|\geq \sum _{j\neq i}|a_{ij}|\quad {\text{for all }}i,\,}

其中aij为第i行第j列的元素。 

四、程序实现

#!/usr/bin/python
# _*_ coding: UTF-8 _*_

import numpy as np

#雅可比迭代法
def Jacobi(A,B,x0,x,eps,k):
    """雅可比迭代法
        Args:
            A:为方程组的系数矩阵
            B:为方程组右端的列向量
            x:为迭代初值构成的列向量
            x:迭代向量
            eps :精度误差
            k:最大迭代次数
        Returns:
            times:迭代次数
            x:Array数组,方程的解
        Raises:
    """
    n,m = A.shape
    if n!=m:
        print("invalid data!")
        return None
    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("精确度等于", eps, "时,雅可比迭代法需要迭代", times, "次收敛")
            return (x, times)
        else:
            x0 = x.copy()
    print("在最大迭代次数内不收敛","最大迭代次数后的结果为",x)
    return None

if __name__ == '__main__':      #当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。
    a = np.array([[8, -3, 2], [4, 11, -1], [6, 3, 12]])
    b = np.array([20, 33, 36])
    x = np.array([0, 0, 0])     #迭代初始值

    x0=x.copy()
    g = 1e-6
    Jacobi(  a, b, x0, x, g, 100)
    print(x)


 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到