Полное вращение (разложение PQLU) матрицы в python - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь найти ранг матрицы, используя разложение LU. так как матрица не является полным рангом, то частичное и никакое поворотное не будет работать. Ниже приведена функция, созданная для полного поворота:

def LUPQdecomposition(matrix):
m,n = matrix.shape
P = np.identity(m)
L = np.identity(m)
Q = np.identity(n)
U = matrix.copy()
for k in range(0, n - 1):
    max_magnitude_value = np.max(np.abs(U[k:,k]))
    pivot_candidates = np.abs(np.copy(U[:,k]))
    pivot_candidates[:k] = 0
    (row_ids,) = np.where(pivot_candidates == max_magnitude_value)
    pivot_row_id = max(k,row_ids[0])
    pivot_col_id = k
    pivot = U[pivot_row_id,pivot_col_id]


    #row permutation matrix

    p_k = np.eye(m)
    save = p_k[k, :].copy()
    p_k[k, :] = p_k[pivot_row_id, :]
    p_k[pivot_row_id, :] = save

    P = p_k@P
    U = p_k@U

    #column permutation matrix

    q_k = np.eye(n)
    save1 = q_k[:,k].copy()
    q_k[:,k] = q_k[:,pivot_col_id]
    q_k[:,pivot_col_id] = save1

    Q = Q@q_k
    U = U@q_k

    for i in range(k+1,m-1):
        if U[i,k] != 0.0:
            multiplier = U[i,k]/pivot
            L[i,k] = multiplier
            for j in range(k,n-1):
                U[i,j] -= U[k,j]*multiplier

    L[:,:k] = p_k@L[:,:k]

rank = np.linalg.matrix_rank(U)


return(P,L,U,Q,rank)

P, L, U, Q, rank = LUPQdecomposition (b_mtrx)

Я действительно знаю, что проблема заключается в получении элемента поворота. Я не могу определить pivot_column_id и матрицу перестановок столбцов. Ошибка, которую я получаю, состоит в том, что U (верхняя матрица tri angular) не похожа на ту, что выводится из пакета scipy linalgebra. пожалуйста, дайте мне знать мою ошибку. рассмотрим следующую матрицу:

    s_mtrx =
    [[ 0.  0.  0.  1.  0.  0.  0. -1.  0.  0.  0.  0.  0.  1.]
    [ 0.  0.  0.  0.  0.  0.  0. -1.  1.  0.  0.  0.  1.  0.]
    [ 0.  0.  0. -1.  0.  1.  0. -1.  0.  0.  0.  0.  0.  0.]
    [ 0.  0. -1.  1.  0.  0.  0.  1.  0.  0.  0.  0.  0. -1.]
    [ 0.  0.  0.  0.  0.  0.  0. -1. -1.  0.  0.  0.  1.  1.]
    [ 1.  0.  0.  0.  0.  0.  0. -1.  0.  0.  0.  0. -1.  1.]
    [ 0.  0.  0.  1.  0.  0.  0. -1.  0.  0.  0. -1.  1.  0.]
    [ 1.  0.  0.  0.  0.  0.  0. -1.  0.  0.  0. -1.  0.  0.]
    [ 0.  0.  0.  2. -1.  0.  0. -1.  0.  0.  0.  0.  0.  0.]
    [ 0.  0.  0.  1. -1.  0.  0.  0.  0.  0.  0.  0.  0. -1.]
    [ 0.  0.  0. -1.  0.  0.  0.  0.  0.  1.  0. -1.  0.  0.]
    [ 0.  1.  0. -1. -1.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
    [ 0.  1.  0. -1.  0.  0.  1.  0.  0.  0. -1.  0.  0.  0.]
    [ 0. -1.  1.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0. -1.]
    [ 0.  0. -1.  0.  0.  1.  0.  0.  0.  0.  0.  0.  0. -1.]
    [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0. -1.  1. -1.]
    [ 0.  1.  0.  0.  0.  0. -1.  0.  0.  0.  0.  0.  0. -1.]
    [ 1.  0.  0.  0.  0.  0.  0.  0.  0. -1.  0.  0.  0. -1.]
    [ 0. -1.  0.  0.  0.  0.  0.  0. -1.  1.  0.  0.  0.  0.]
    [ 0.  0.  0.  0. -1.  0.  2.  0.  0.  0. -1.  0.  0.  0.]]       

это матрица 20x14. его ранг 12, но с моим кодом я получаю ранг, как 13. Было бы мило с вашей стороны. Спасибо и всего наилучшего

...