scipy.linalg.

eigh#

scipy.linalg.eigh(a, b=None, *, lower=True, eigvals_only=False, overwrite_a=False, overwrite_b=False, тип=1, check_finite=True, subset_by_index=None, subset_by_value=None, драйвер=None)[источник]#

Решение стандартной или обобщённой проблемы собственных значений для комплексной эрмитовой или вещественной симметричной матрицы.

Найти массив собственных значений w и, опционально, массив собственных векторов v массива a, где b положительно определена, так что для каждого собственного значения λ (i-й элемент w) и его собственного вектора vi (i-й столбец v) удовлетворяет:

              a @ vi = λ * b @ vi
vi.conj().T @ a @ vi = λ
vi.conj().T @ b @ vi = 1

В стандартной задаче, b предполагается единичной матрицей.

Документация написана в предположении, что аргументы-массивы имеют указанные «основные» формы. Однако аргументы-массивы этой функции могут иметь дополнительные «пакетные» измерения, добавленные перед основной формой. В этом случае массив обрабатывается как пакет низкоразмерных срезов; см. Пакетные линейные операции подробности.

Параметры:
a(M, M) array_like

Комплексная эрмитова или вещественная симметричная матрица, чьи собственные значения и собственные векторы будут вычислены.

b(M, M) array_like, опционально

Комплексная эрмитова или вещественная симметричная положительно определенная матрица. Если опущена, предполагается единичная матрица.

lowerbool, необязательно

Берутся ли соответствующие данные массива из нижнего или верхнего треугольника a и, если применимо, b. (По умолчанию: lower)

eigvals_onlybool, необязательно

Следует ли вычислять только собственные значения и без собственных векторов. (По умолчанию: вычисляются и то, и другое)

subset_by_indexiterable, optional

Если предоставлен, этот двухэлементный итерируемый объект определяет начальный и конечный индексы желаемых собственных значений (по возрастанию и с нумерацией с 0). Чтобы вернуть только второе наименьшее до пятого наименьшего собственных значений, [1, 4] используется. [n-3, n-1] возвращает три наибольших. Доступно только с драйверами “evr”, “evx” и “gvx”. Элементы непосредственно преобразуются в целые числа через int().

subset_by_valueiterable, optional

Если предоставлено, этот двухэлементный итерируемый объект определяет полуоткрытый интервал (a, b] что, если есть, только собственные значения между этими значениями возвращаются. Доступно только с драйверами "evr", "evx" и "gvx". Используйте np.inf для незакреплённых концов.

драйверstr, optional

Определяет, какой драйвер LAPACK должен использоваться. Допустимые варианты: "ev", "evd", "evr", "evx" для стандартных задач и "gv", "gvd", "gvx" для обобщённых (где b не None) задач. См. раздел "Примечания". По умолчанию для стандартных задач используется "evr". Для обобщённых задач "gvd" используется для полного набора, а "gvx" для запрошенных подмножеств.

типint, необязательный

Для обобщённых задач этот ключевой параметр определяет тип решаемой задачи для w и v (принимает только 1, 2, 3 в качестве возможных входных данных):

1 =>     a @ v = w @ b @ v
2 => a @ b @ v = w @ v
3 => b @ a @ v = w @ v

Этот ключевой параметр игнорируется для стандартных задач.

overwrite_abool, необязательно

Перезаписывать ли данные в a с предоставленными параметрами конфигурации и другими подходящими настройками. В некоторых случаях доверительные пределы могут быть NaN из-за вырожденной повторной выборки, и это типично для очень маленьких выборок (~6 наблюдений).

overwrite_bbool, необязательно

Перезаписывать ли данные в b с предоставленными параметрами конфигурации и другими подходящими настройками. В некоторых случаях доверительные пределы могут быть NaN из-за вырожденной повторной выборки, и это типично для очень маленьких выборок (~6 наблюдений).

check_finitebool, необязательно

Проверять ли, что входные матрицы содержат только конечные числа. Отключение может повысить производительность, но может привести к проблемам (сбоям, бесконечному выполнению), если входные данные содержат бесконечности или NaN.

Возвращает:
w(N,) ndarray

Выбранные N (N<=M) собственных значений в порядке возрастания, каждое повторяется согласно своей кратности.

v(M, N) ndarray

Нормированный собственный вектор, соответствующий собственному значению w[i] является столбцом v[:,i]. Возвращается только если eigvals_only=False.

Вызывает:
LinAlgError

Если вычисление собственных значений не сходится, произошла ошибка, или матрица b не является положительно определенной. Заметьте, что если входные матрицы не симметричны или не эрмитовы, ошибка не будет сообщена, но результаты будут неверными.

Смотрите также

eigvalsh

собственные значения симметричных или эрмитовых массивов

eig

собственные значения и правые собственные векторы для несимметричных массивов

eigh_tridiagonal

собственные значения и правые собственные векторы для симметричных/эрмитовых трёхдиагональных матриц

Примечания

Эта функция не проверяет входной массив на эрмитовость/симметричность, чтобы позволить представление массивов только их верхними/нижними треугольными частями. Также обратите внимание, что даже если не учитывается, проверка конечности применяется ко всему массиву и не зависит от ключевого слова «lower».

Эта функция использует драйверы LAPACK для вычислений во всех возможных комбинациях ключевых слов с префиксом sy если массивы вещественные и he если комплексный, например, массив float с драйвером 'evr' решается через 'syevr', комплексные массивы с драйвером 'gvx' решаются через 'hegvx' и т.д.

Вкратце, самый медленный и наиболее надежный драйвер — это классический ev который использует симметричный QR. evr рассматривается как оптимальный выбор для наиболее общих случаев. Однако есть определённые случаи, когда evd вычисляет быстрее за счет большего использования памяти. evx, оставаясь при этом быстрее, чем ev, часто работает хуже, чем остальные, за исключением случаев, когда требуется очень мало собственных значений для больших массивов, хотя гарантии производительности всё равно нет.

Обратите внимание, что базовые алгоритмы LAPACK различаются в зависимости от того, eigvals_only равно True или False — поэтому собственные значения могут различаться в зависимости от того, запрашиваются ли собственные векторы или нет. Разница обычно составляет порядка машинного эпсилона, умноженного на наибольшее собственное значение, поэтому, вероятно, заметна только для нулевых или почти нулевых собственных значений.

Для обобщенной задачи, нормализация относительно заданного аргумента type:

type 1 and 3 :      v.conj().T @ a @ v = w
type 2       : inv(v).conj().T @ a @ inv(v) = w

type 1 or 2  :      v.conj().T @ b @ v  = I
type 3       : v.conj().T @ inv(b) @ v  = I

Примеры

>>> import numpy as np
>>> from scipy.linalg import eigh
>>> A = np.array([[6, 3, 1, 5], [3, 0, 5, 1], [1, 5, 6, 2], [5, 1, 2, 2]])
>>> w, v = eigh(A)
>>> np.allclose(A @ v - v @ np.diag(w), np.zeros((4, 4)))
True

Запросить только собственные значения

>>> w = eigh(A, eigvals_only=True)

Запросить собственные значения, которые меньше 10.

>>> A = np.array([[34, -4, -10, -7, 2],
...               [-4, 7, 2, 12, 0],
...               [-10, 2, 44, 2, -19],
...               [-7, 12, 2, 79, -34],
...               [2, 0, -19, -34, 29]])
>>> eigh(A, eigvals_only=True, subset_by_value=[-np.inf, 10])
array([6.69199443e-07, 9.11938152e+00])

Запрос второго наименьшего собственного значения и его собственного вектора

>>> w, v = eigh(A, subset_by_index=[1, 1])
>>> w
array([9.11938152])
>>> v.shape  # only a single column is returned
(5, 1)