numpy.linalg.eigh
numpy.linalg.eigh(a, UPLO='L')
Функция linalg.eigh() вычисляет собственные значения и собственные векторы эрмитовой или вещественной симметричной матрицы.
Собственное число квадратной матрицы a
и ее собственный вектор связаны равенством np.dot(a, v) = w*v
.
Если у матрицы несколько собственных чисел и соответственно несколько собственных векторов, то данная функция возвращает массив собственных значений и массив собственных векторов (необязательно упорядоченных). В этом случае выполняются равенства np.dot(a[:,:], v[:,i]) = w[i] * v[:,i]
, для всех i
из интервала [0, ..., M - 1]
, где M - размер матрицы.
-
- a - массив NumPy или подобнй массиву объект.
- Это может быть толко "квадратный" двумерный массив, т.е. квадратная матрица, причем эрмитова или вещественная симметричная. Если это многомерный массив, то две его последние оси должны быть равны, в этом случае он рассматривается как массив матриц и все вычисления выполняются отдельно для каждой из них.
- UPLO - {'L', 'U'} (необязательный параметр).
-
Определяет с какой частью треугольной частью исходной матрицы выполняется вычисление
'L'
- нижней (по умолчанию),'U'
- верхней. Однако, вне зависимости от значения параметра, диагональные элементы будут рассматриваться только как вещественные числа, если на диагонали присутствуют комплексные числа, то их мнимая часть будет приравнена к 0.
-
- w - массив NumPy
- Собственные числа входной матрицы.
- v - массив NumPy
- Собственные векторы входной матрицы.
Примеры
Эрмитовы матрицы имеют вещественные собственные значения:
>>> import numpy as np
>>> from numpy import linalg as LA
>>>
>>> a = np.array([[5, 2 + 1j], [2 - 1j, 7]])
>>>
>>> wa, va = LA.eigh(a)
>>>
>>> wa
array([3.55051026, 8.44948974])
>>>
>>> va
array([[-0.83912106-0.j , -0.54394472+0.j ],
[ 0.48651894-0.24325947j, -0.75053269+0.37526634j]])
>>>
>>> np.dot(a, va) - wa*va
array([[ 0.00000000e+00+0.00000000e+00j, 0.00000000e+00+1.11022302e-16j],
[ 1.99840144e-15-9.99200722e-16j, -3.55271368e-15+1.33226763e-15j]])
Собственные числа и векторы вещественной симетричной матрицы:
>>> b = np.array([[1, 3, 0], [3, 2, 6], [0, 6, 5]])
>>> b
array([[1, 3, 0],
[3, 2, 6],
[0, 6, 5]])
>>>
>>> wb, vb = LA.eigh(b)
>>> wb
array([-3.8899916 , 1.81086861, 10.07912299])
>>>
>>> vb
array([[-0.45327654, -0.86657291, 0.20878645],
[ 0.73883948, -0.23422559, 0.63186596],
[-0.49865479, 0.44066969, 0.74642724]])
>>>
>>> np.dot(b, vb) - wb*vb
array([[ 4.44089210e-16, 4.44089210e-16, -4.44089210e-16],
[-1.33226763e-15, -7.21644966e-16, 1.77635684e-15],
[ 6.66133815e-16, -6.66133815e-16, -1.77635684e-15]])
Применение данной функции к неэрмитовым матрицам не приводит к ошибке, но выдает неправильный результат. Рассмотрим две матрицы:
>>> a
array([[5.+0.j, 2.+1.j],
[2.-1.j, 7.+0.j]])
>>>
>>> c = np.array([[5, 2 + 2j], [2 - 1j, 7]])
>>> c
array([[5.+0.j, 2.+2.j],
[2.-1.j, 7.+0.j]])
>>>
>>> # Матрица 'a' эрмитова?
... a.T - np.conj(a) # Да
array([[0.+0.j, 0.+0.j],
[0.+0.j, 0.+0.j]])
>>>
>>> # Матрица 'с' эрмитова?
... c.T - np.conj(c) # Нет
array([[0.+0.j, 0.+1.j],
[0.+1.j, 0.+0.j]])
>>>
>>>
>>> LA.eig(a) # Мнимая часть пренебрежимо мала
(array([3.55051026-2.12116033e-16j, 8.44948974-6.76062387e-16j]),
array([[ 0.83912106+0.j , 0.48651894+0.24325947j],
[-0.48651894+0.24325947j, 0.83912106+0.j ]]))
>>>
>>> # У эрмитовых матриц только действительные собственные числа:
... LA.eigh(a)
(array([3.55051026, 8.44948974]),
array([[-0.83912106-0.j , -0.54394472+0.j ],
[ 0.48651894-0.24325947j, -0.75053269+0.37526634j]]))
>>>
>>>
>>> # Собственные числа неэрмитовой матрицы я вляются комплексными:
LA.eig(c)
(array([3.32791188-0.37423915j, 8.67208812+0.37423915j]),
array([[ 0.85529722+0.j , 0.47147996+0.38426691j],
[-0.43755451+0.27751165j, 0.79375411+0.j ]]))
>>>
>>> LA.eigh(c) # Мнимая часть отброшена
(array([3.55051026, 8.44948974]),
array([[-0.83912106-0.j , -0.54394472+0.j ],
[ 0.48651894-0.24325947j, -0.75053269+0.37526634j]]))