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
Собственные векторы входной матрицы.
Смотрите так же:
eig, eigvals, eigvalsh


Примеры

Эрмитовы матрицы имеют вещественные собственные значения:

>>> 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]]))