三角分解法(线性方程组求解)

问题描述

为求解一个线性方程组,首先采用偏序选主元策略的三角分解法构造矩阵L,U和P,再用前向替换法对方程组LY=PB求解Y,最后用回代法对方程组UX=Y求解X。

输入形式

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

输出形式

先输出LU分解结果,再输出方程解。

样例1输入

4

1 2 4 1

2 8 6 4

3 10 8 8

4 12 10 6

21

52

79

82

样例1输出

[[ 4. 12. 10. 6. ]

[ 0.5 2. 1. 1. ]

[ 0.25 -0.5 2. 0. ]

[ 0.75 0.5 0. 3. ]]

[[1.]

[2.]

[3.]

[4.]]

样例1说明

输入:第1行为方阵阶数4,第2行至5行为系数矩阵A,第6行至9行为常数矩阵B。

输出:第1至第4行输出LU分解结果,第5行至第8行依次输出方程解:x1, x2, x3, x4。

代码

# 三角分解法
import numpy as np


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)

    return A, B


def lufact(A, B):
    n = B.size
    Y = np.zeros([n, 1], dtype=np.double)
    R = np.arange(0, n)
    epslion = np.finfo(np.float32).eps

    for p in range(n):
        max_index = np.argmax(np.abs(A[p:n, p]))
        max_row = max_index + p
        A[[p, max_row], :] = A[[max_row, p], :]
        # R[p], R[max_row] = R[max_row], R[p]
        R[[p, max_row]] = R[[max_row, p]]

        if abs(A[p, p]) < epslion:
            print('A is singular. No unique solution')
            break

        for k in range(p + 1, n):
            mult = A[k, p] / A[p, p]
            A[k, p] = mult
            A[k, p + 1:n] = A[k, p + 1:n] - mult * A[p, p + 1:n]

    Y[0] = B[R[0]]
    for k in range(1, n):
        Y[k] = B[R[k]] - A[k, 0:k] @ Y[0:k]

    return A, Y


def backsub(A, B):
    n = B.size

    X = np.zeros([n, 1], dtype=np.double)
    X[n - 1] = B[n - 1] / A[n - 1][n - 1]
    for i in range(n - 2, -1, -1):
        X[i] = (B[i] - A[i, i + 1:] @ X[i + 1:]) / A[i][i]

    return X


def out(x):
    print(x)


def main():
    A, B = Input()

    A, B = lufact(A, B)
    out(A)
    
    X = backsub(A, B)
    out(X)


if __name__ == '__main__':
    main()

你可能感兴趣的:(三角分解法(线性方程组求解))