Я пишу программу, которая инвертирует 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 ]]