Инверсия матрицы в питоне: нижняя диагональ всегда неверна - PullRequest
0 голосов
/ 07 февраля 2019

Я пишу программу, которая инвертирует n * n размерную квадратную матрицу без явной зависимости от функции numpy.linalg.inv, однако нижняя левая треугольная матрица всегда неверна, тогда как остальные элементы матрицы всегда верны.Я просматривал код несколько раз, но не могу понять, почему нижняя левая треугольная матрица является единственной неверной частью.

Я переписывал программу несколько раз и пытался изолировать каждый разделчтобы увидеть, выполняет ли это то, что предназначено, однако я не могу определить, что не так.

import numpy as np
from numpy import delete as npd

def Main():
    mat = np.array(([1,2,5],
                    [4,1,1],
                    [1,2,3]))
    print("Original Matrix")
    print(mat)
    print("Inverted Matrix")
    print(Invert(mat))
    print("Correct Matrix")
    print(np.linalg.inv(mat))

def Invert(mat):
    det = Determinant(mat)
    if(len(mat) == 2):
        smolMat = mat  # Matrix to hold all the smaller values
        smolMat[0][0], smolMat[1][1] = mat[1][1]/det, mat[0][0]/det
        smolMat[1][0], smolMat[0][1] = -mat[1][0]/det, -mat[0][1]/det
        return smolMat
    coMat = np.zeros((len(mat), len(mat)))
    for i in range(0, len(mat)):
        for j in range(0, len(mat)):
            minMat = Minor(mat, i, j)
            coMat[i][j] = (((-1)**(i+j)) * Determinant(minMat))
    return TransAndCo(coMat, det)

def Determinant(mat):
    if(len(mat) == 2):
        return ((mat[0][0] * mat[1][1]) - (mat[0][1] * mat[1][0]))
    det = 0
    for i in range(0, len(mat)):
        det += ((-1) ** i) * mat[0][i] * Determinant(Minor(mat, 0, i))
    return det

def Minor(mat, i, j):
    return npd(npd(mat,i,0),j,1)

def TransAndCo(mat, det):
    tempMat = mat
    for i in range(0, len(mat)):
        for j in range(0, len(mat)):
            tempMat[i][j] = mat[j][i]/det
    return tempMat

Main()

Ожидаемый результат в этом случае

[[ 0.07142857  0.28571429 -0.21428571]
 [ 0.02040816 -0.14285714  1.35714286]
 [-0.01530612  0.09693878 -0.5       ]]

Но правильно инвертированная матрица:

[[ 0.07142857  0.28571429 -0.21428571]
 [-0.78571429 -0.14285714  1.35714286]
 [ 0.5        -0.         -0.5       ]]

1 Ответ

0 голосов
/ 07 февраля 2019

Только что понял основную проблему с кодом.В функции транспонирования я вызываю tempmat = mat, которая вызывает ошибки, как и должно быть tempmat = np.array (mat)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...