美文网首页
解线性方程组的迭代法:Jacobi迭代法与Gauss-Seide

解线性方程组的迭代法:Jacobi迭代法与Gauss-Seide

作者: JiantingFeng | 来源:发表于2020-04-18 16:01 被阅读0次

    Jacobi迭代法:

    import numpy as np

    # Jacobi 迭代法计算线性方程

    # Ax = b, x_0为初始值, epsilon为误差限, n为最大迭代次数

    A = np.array([[1,2,-2],

                [1,1,1],

                [2,2,1]])

    b = np.array([1,2,3])

    x_0 = np.array([0,0,0])

    epsilon = 0.01

    n = 100

    def jacobi(A, b, x_0, n, epsilon):

        s = len(A)

        D = np.diag(np.diag(A))

        inv = np.linalg.inv(D)

        M = np.eye(s)-np.dot(inv,A)

        count = 0

        # rho 为谱半径

        rho = np.max(np.linalg.eig(M)[0])

        if rho >= 1:

            print("Jacobi迭代法发散")

        else:

            x = x_0

            err = 0x3f3f3f

            while 1:

                if count >= n:

                    break

                if err < epsilon:

                    break

                x = np.dot(M, x_0)+np.dot(inv, b)

                print("第",count,"次迭代结果:",x[0],',',x[1],',',x[2],'\n')

                count = count + 1

                err = abs(max(x-x_0))

                x_0 = ximport numpy as np

    # Gauss-Seidel 迭代法计算线性方程

    # Ax = b, x_0为初始值, epsilon为误差限, n为最大迭代次数

    A = np.array([[1,2,-2],

                [1,1,1],

                [2,2,1]])

    b = np.array([1,2,3])

    x_0 = np.array([0,0,0])

    epsilon = 0.01

    n = 100

    def GS(A, b, x_0, n, epsilon):

        D = np.diag(np.diag(A))

        L = -1*np.tril(A-D)

        U = -1*np.triu(A-D)

        inv = np.linalg.inv(D-L)

        M = np.dot(inv,U)

        count = 0

        # rho 为谱半径

        rho = abs(np.max(np.linalg.eig(M)[0]))

        if rho >= 1:

            print("Gauss-Seidel迭代法发散")

        else:

            x = x_0

            err = 0x3f3f3f

            while 1:

                if count >= n:

                    break

                if err < epsilon:

                    break

                x = np.dot(M, x_0)+np.dot(inv, b)

                print("第",count,"次迭代结果:",x[0],',',x[1],',',x[2],'\n')

                count = count + 1

                err = abs(max(x-x_0))

                x_0 = x

        print("谱半径:",rho)

    GS(A, b.T, x_0, n, epsilon)

            print("谱半径:",rho)

    jacobi(A, b.T, x_0, n, epsilon)

    Gauss-Seidel迭代法:

    相关文章

      网友评论

          本文标题:解线性方程组的迭代法:Jacobi迭代法与Gauss-Seide

          本文链接:https://www.haomeiwen.com/subject/tkdklqtx.html