Я пытаюсь исследовать источник остатков задачи матричного уравнения (Ax=b). Чтобы проверить мой ответ, я вычитаю Ax-b, ожидая 0. Вместо «чистых» нулей я получаю значения того же порядка, что и машинный эпсилон, и это нормально. Проблема в том, что эти остатки кажутся кратными друг другу, поэтому я не знаю, как их интерпретировать.
Я нашел некоторые подробности здесь: проблема с машинным вычислением epsilon, это не прояснило, почему кратные эпсилон возникают вместо одного или другого.
Я проверил свою систему, используя np.finfo(float).eps
, который произвел 2.220446049250313e-16
. Один из остатков, которые я получаю в решении x, идентичен этому значению, однако другой, кажется, составляет половину эпсилон.
Вот код, который я использовал:
# Arbitrary Matrix A and Vector b
A = np.array([[2,-1,0],[1,-2,1],[0,-1,2]])
b = np.array([[1],[0],[1]])
# Solve for Vector x
x = np.linalg.solve(A,b)
# Calculate difference, expected to be column of zeros
diff = A.dot(x) - b
print(diff)
Вот результат:
Output:
[[ 0.00000000e+00]
[-1.11022302e-16] #-------> Is this machine epsilon...
[-2.22044605e-16]] #-------> ...or this?
Каково объяснение/интерпретация этого? Я понимаю, что значения, меньшие эпсилон, все еще могут быть представлены, но в таком случае, почему оба остатка не равны -1.11022302e-16
?
Заранее спасибо!