Проблема здесь в том, что разные процедуры вычисляют матричный определитель. Например:
import numpy as np
matrix=np.array([[5.,10.],[2.,4.]])
print(np.linalg.det(matrix))
print(np.linalg.slogdet(matrix))
try:
invmatrix=np.linalg.inv(matrix)
except np.linalg.LinAlgError:
print("inversion failed")
не выдает исключений и печатает это:
-1.1102230246251625e-15
(-1.0, -34.43421547668305)
т.е. отсутствие прямого алгебраического вычисления определителя (что делает scipy.linalg.det
) дает ненулевой определитель из-за накопленной ошибки округления с плавающей запятой. Таким образом, стандартные процедуры линейной алгебры рассматривают матрицу как неособую и производят неправильную обратную сторону из крайне плохой условной задачи.
(протестировано с простой версией 1.15.4 и scipy версией 1.1.0)