numpy
Линейная алгебра с np.linalg
Поиск…
замечания
Начиная с версии 1.8, некоторые из подпрограмм в np.linalg
могут работать с «стеком» матриц. То есть, процедура может вычислять результаты для нескольких матриц, если они сложены вместе. Например, A
здесь интерпретируется как две сложенные матрицы 3 на 3:
np.random.seed(123)
A = np.random.rand(2,3,3)
b = np.random.rand(2,3)
x = np.linalg.solve(A, b)
print np.dot(A[0,:,:], x[0,:])
# array([ 0.53155137, 0.53182759, 0.63440096])
print b[0,:]
# array([ 0.53155137, 0.53182759, 0.63440096])
Официальные np
docs определяют это через спецификации параметров, такие a : (..., M, M) array_like
.
Решить линейные системы с np.solve
Рассмотрим следующие три уравнения:
x0 + 2 * x1 + x2 = 4
x1 + x2 = 3
x0 + x2 = 5
Мы можем выразить эту систему как матричное уравнение A * x = b
с:
A = np.array([[1, 2, 1],
[0, 1, 1],
[1, 0, 1]])
b = np.array([4, 3, 5])
Затем используйте np.linalg.solve
для решения для x
:
x = np.linalg.solve(A, b)
# Out: x = array([ 1.5, -0.5, 3.5])
A
должна быть квадратной и полноразмерной матрицей: все ее строки должны быть линейно независимыми. A
должно быть обратимым / неособенным (его определитель не равен нулю). Например, если одна строка из A
является кратной другой, вызов linalg.solve
поднимет LinAlgError: Singular matrix
:
A = np.array([[1, 2, 1],
[2, 4, 2], # Note that this row 2 * the first row
[1, 0, 1]])
b = np.array([4,8,5])
Такие системы могут быть решены с помощью np.linalg.lstsq
.
Найти решение наименьших квадратов линейной системы с np.linalg.lstsq
Наименьшие квадраты - это стандартный подход к задачам с большим количеством уравнений, чем неизвестные, также известные как переопределенные системы.
Рассмотрим четыре уравнения:
x0 + 2 * x1 + x2 = 4
x0 + x1 + 2 * x2 = 3
2 * x0 + x1 + x2 = 5
x0 + x1 + x2 = 4
Мы можем выразить это как матричное умножение A * x = b
:
A = np.array([[1, 2, 1],
[1,1,2],
[2,1,1],
[1,1,1]])
b = np.array([4,3,5,4])
Затем разрешите с помощью np.linalg.lstsq
:
x, residuals, rank, s = np.linalg.lstsq(A,b)
x
- это решение, residuals
суммы, rank
матрицы входа A
и s
- особые значения A
Если b
имеет более одного измерения, lstsq
будет решать систему, соответствующую каждому столбцу b
:
A = np.array([[1, 2, 1],
[1,1,2],
[2,1,1],
[1,1,1]])
b = np.array([[4,3,5,4],[1,2,3,4]]).T # transpose to align dimensions
x, residuals, rank, s = np.linalg.lstsq(A,b)
print x # columns of x are solutions corresponding to columns of b
#[[ 2.05263158 1.63157895]
# [ 1.05263158 -0.36842105]
# [ 0.05263158 0.63157895]]
print residuals # also one for each column in b
#[ 0.84210526 5.26315789]
rank
и s
зависят только от A
и, таким образом, те же, что и выше.