Ответ 1
np.linalg.solve(A, b)
не вычисляет обратное значение A. Вместо этого он вызывает одну из подпрограмм LAPACK, которая сначала разлагает A на разложение LU, а затем решает для x использование прямого и обратного замещения (см. здесь).
np.linalg.inv
использует тот же метод для вычисления инверсии A путем решения для A -1 в A · A -1 = I, где я - тождество *. Шаг факторизации точно такой же, как указано выше, но для A -1 (матрица n × n) требуется больше операций с плавающей запятой, чем для x (вектор n-длинного вектора). Кроме того, если затем вы хотите получить x с помощью тождества A -1 · b = x, тогда дополнительное умножение матриц потребует еще большего числа операций с плавающей запятой, а следовательно, более низкой производительности и большей числовой ошибки.
Нет необходимости в промежуточном этапе вычисления A -1 - быстрее и точнее получить x напрямую.
* Соответствующий бит источника для inv
здесь здесь. К сожалению, это немного сложно понять, поскольку он шаблонизирован с C. Важно отметить, что единичная матрица передается решателю LAPACK в качестве параметра B
.