Почему я не получаю матрицу идентичности? - PullRequest
2 голосов
/ 19 марта 2019

Здравствуйте, я пытаюсь понять, почему после этой операции:

a = np.array([[1, 2], [3, 4]])
ainv = inv(a)
print(np.dot(a,ainv))

Я получаю:

[[1.0000000e+00 0.0000000e+00]
 [8.8817842e-16 1.0000000e+00]]

Поскольку я использую обратную матрицу a, я думаю, что получу:

[[1,0],[0,1]] 

ТАК Я бы хотел, чтобы служба поддержки поняла результат

Ответы [ 2 ]

2 голосов
/ 19 марта 2019
a = np.array([[1.0, 2.0], [3.0, 4.0]]) 
ainv = np.linalg.inv(a)  #[[-2.0, 1.0],[1.5, -0.5]]
print(np.dot(a,ainv))

Урожай как вы обнаружили:

[[1.0000000e+00 0.0000000e+00]
 [8.8817842e-16 1.0000000e+00]]

Давайте посмотрим на тип элементов массива

type(ainv[1][1])

Показывает, что тип массива

numpy.float64

Давайте посмотрим на точность точности для этого типа

numpy.finfo(numpy.float64).precision 

Numpy говорит, что приблизительное число десятичных цифр, к которому относится этот тип числа с плавающей точкой, равно 15.

15

Для любопытства мы также можем посмотреть на эпсилон машины для данного типа;

np.finfo(np.float64).eps

Что дает наименьшее число n, где 1 + n неотличимо от 1

2.220446049250313e-16

Таким образом, даже несмотря на то, что полученное вами число технически отличимо от 0 для типа данных, общая точность составляет 15 десятичных знаков, вычисления на больших матрицах могут привести к еще большей неточности с плавающей запятой.

1 голос
/ 19 марта 2019

Это почти единичная матрица.Вы получаете числа, очень близкие к нулю, а не к нулю, что является обычной проблемой для чисел с плавающей запятой, поскольку они являются лишь конечным приближением к действительным числам.Для всех практических целей 8.8e-16 или 0.00000000000000088 - это ~ ноль.

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