高斯-赛德尔迭代求解线性方程组

使用范例

问题描述

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

输入形式

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

输出形式

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

样例输入

***使用tab间隔输入矩阵
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()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容