高斯赛德尔迭代法(线性方程组求解)

问题描述

为求解一个线性方程组,使用高斯赛德尔迭代法,采用欧几里得距离判定是否收敛。精度delta为1E-9,最大迭代次数为20。

输入形式

在屏幕上依次输入方阵阶数n,系数矩阵A,常数矩阵B和起始点P。

输出形式

输出实际迭代次数,然后每一行输出一个根。

样例输入

3

4 -1 1

4 -8 1

-2 1 5

7

-21

15

1

2

2

样例输出

10

[[2.]

[4.]

[3.]]

样例说明

输入:第1行为方阵阶数3,第2行至4行为系数矩阵A,第5行至7行为常数矩阵B,第8行至10行为起始点。输出:实际迭代次数为10,然后每行依次输出方程解:x1, x2, x3。

代码

# 高斯赛德尔迭代法
import numpy as np
from numpy.linalg import norm

def Input():
    n = int(input())

    A = np.zeros([n, n], dtype=np.double())
    for r in range(n):
        A[r:] = np.array(input().split(), dtype=np.double)

    B = np.zeros([n, 1], dtype=np.double)
    for r in range(n):
        B[r:] = np.array(input(), dtype=np.double)

    P = np.zeros([n, 1], dtype=np.double)
    for r in range(n):
        P[r:] = np.array(input(), dtype=np.double)

    return A, B, P


def Gseid(A, B, P, delta, max_iteration):
    n = len(B)
    X = np.zeros((n, 1), dtype=np.double)
    epslion = np.finfo(np.float32).eps
    
    for i in range(max_iteration):
        for j in range(n):
            if j == 0:
                X[0] = (B[0] - (A[0, 1:n] @ P[1:n])) / A[0, 0]

            elif j == n - 1:
                X[n - 1] = (B[n - 1] - (A[n - 1, 0:n - 1] @ X[0:n - 1])) / A[n - 1, n - 1]

            else:
                X[j] = (B[j] - A[j, 0:j] @ X[0:j] - A[j, j + 1:n] @ P[j + 1:n]) / A[j, j]

        err = np.abs(norm(X - P))
        relerr = err / (norm(X) + epslion)
        P = X.copy()

        if err < delta or relerr < delta:
            return i, X


def out(x):
    print(x)


def main():
    A, B, P = Input()
    delta = 1e-9
    max_iteration = 20

    iteration, X = Gseid(A, B, P, delta, max_iteration)

    out(iteration)
    out(X)


if __name__ == '__main__':
    main()

你可能感兴趣的:(算法,python,numpy,matlab)