numpy.linalg.eig
numpy.linalg.eig(a)
Функция linalg.eig() вычисляет собственные числа (значения) и собственные векторы квадратной матрицы.
Собственное число квадратной матрицы a
и ее собственный вектор связаны равенством np.dot(a, v) = w*v
.
Если у матрицы несколько собственных чисел и соответственно несколько собственных векторов, то данная функция возвращает массив собственных значений и массив собственных векторов (необязательно упорядоченных). В этом случае выполняются равенства np.dot(a[:,:], v[:,i]) = w[i] * v[:,i]
, для всех i
из интервала [0, ..., M - 1]
, где M - размер матрицы.
-
- a - массив NumPy или подобнй массиву объект.
- Это может быть толко "квадратный" двумерный массив, т.е. квадратная матрица. Если это многомерный массив, то две его последние оси должны быть равны, в этом случае он рассматривается как массив матриц и все вычисления выполняются отдельно для каждой из них.
-
- w - массив NumPy
- Собственные числа входной матрицы.
- v - массив NumPy
- Собственные векторы входной матрицы.
Замечание
Примеры
>>> import numpy as np
>>> from numpy import linalg as LA
>>>
>>> a = np.array([[2, 3, 5], [7, 11, 13], [17, 19, 23]])
>>> w,v = LA.eig(a)
>>> w
array([36.81172799, -1.91702763, 1.10529963])
>>> v
array([[-0.16510917, -0.60574007, 0.36952037],
[-0.4789958 , -0.3769456 , -0.8244886 ],
[-0.86214963, 0.70070748, 0.42857116]])
>>> np.dot(a,v)
array([[ -6.07795389, 1.16122046, 0.40843073],
[-17.6326632 , 0.72261513, -0.91130695],
[-31.73721763, -1.3432756 , 0.47369955]])
>>>
>>> w*v
array([[ -6.07795389, 1.16122046, 0.40843073],
[-17.6326632 , 0.72261513, -0.91130695],
[-31.73721763, -1.3432756 , 0.47369955]])
Иногда, визуально кажется, что вышеописанные равенства не выполняются:
>>> a = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3]])
>>>
>>> w,v = LA.eig(a)
>>> np.dot(a,v)
array([[ 1.60356745e+00, 1.11022302e-16, 0.00000000e+00],
[ 3.20713490e+00, 2.22044605e-16, 0.00000000e+00],
[ 4.81070235e+00, 0.00000000e+00, -2.22044605e-16]])
>>> w*v
array([[ 1.60356745e+00, -4.10074414e-16, -3.96241817e-17],
[ 3.20713490e+00, -1.03002928e-16, 1.46033608e-16],
[ 4.81070235e+00, 5.13077342e-16, -1.06409427e-16]])
Однако, значения первых столбцов равны, а значения второго и третьего столбцов настолько малы, что могут быть приравнены к 0.
Всегда следует помнить об ошибках округления:
>>> a = np.array([[1 + 1e-9, 0], [0, 1 - 1e-9]])
>>>
>>> w,v = LA.eig(a)
>>>
>>> w
array([1., 1.])
>>>
>>> v
array([[1., 0.],
[0., 1.]])
Но на самом деле w = [1.000000001, 0.999999999]
.