Почему numpy неверно считает определитель матрицы
import numpy as np
A = np.array([[1, 1, 2, -1],
[2, -1, 0, -5],
[-1, -1, 0, -2],
[6, 3, 4, -3]])
print(np.linalg.det(A))
Считаю таким образом. Определитель должен быть равен нулю, я проверял на бумажке и в онлайн калькуляторах. Но этот код дает такой ответ 5.329070518200744e-15.
Что я делаю не так? Может где-то невнимателен был, а если нет, то каким образом лучше вычислять?
Ответы (1 шт):
Полагаю, что это может зависеть разве что от версий Python и особенно Numpy.
В Google Colaboratory выходит ровно 0.0, даже если печатать 64 знака после запятой.
Я пробовал ставить разный тип данных (по умолчанию в этой матрице получается numpy.int64), например numpy.int16 или numpy.float32 - без разницы, всё-равно выходит 0.0.
А вот numpy.float16 выставить нельзя, на него linalg ругается, что с ним не работает.
Но проверьте ради интереса, какой у вас тип данных получается в матрице:
print(type(A[0,0]))
В Google Colaboratory такие версии стоят:
Python 3.6.9
Numpy 1.18.5
Код, которым я всё проверял:
import numpy as np
A = np.array([[1, 1, 2, -1],
[2, -1, 0, -5],
[-1, -1, 0, -2],
[6, 3, 4, -3]] #, dtype=np.float32)
)
print(np.__version__)
print(type(A[0,0]))
print(np.linalg.det(A))
print(f"{np.linalg.det(A):.64f}")
Результат:
1.18.5
<class 'numpy.int64'>
0.0
0.0000000000000000000000000000000000000000000000000000000000000000