Собственная система параметризованной эрмитовой матрицы в python - PullRequest
5 голосов
/ 05 марта 2020

Предположим, нас интересуют собственные значения и собственные векторы эрмитовой матрицы h (t), зависящей от параметра t. Моя матрица большая и разреженная, и, следовательно, ее необходимо обрабатывать численно.

A Наивный подход заключается в оценке матрицы h (t_k) при дискретизированных значениях параметров t_k. Можно ли отсортировать собственные векторы и собственные значения по «характеру собственного вектора»?

Позвольте мне проиллюстрировать, что я имею в виду под «характером собственного вектора», на следующем простом примере (я обозначаю мнимую единицу) .

h (t) = {{1, i t}, {-i t, 1}}

Собственные значения 1-t и 1 + t с соответствующими собственными векторами {-i, 1} и {i, 1}. Следовательно, сортируя в соответствии с «характером собственного вектора», собственные значения должны пересекаться при t = 0. Однако большинство собственных решателей сортирует их, увеличивая собственные значения, обменивая собственные векторы с отрицательного на положительное t (см. Код и график вывода).

import numpy as np
import scipy.sparse.linalg as sla
import matplotlib.pyplot as plt

def h(t):
    # parametrized hermitian matrix
    return np.array([[1, t*1j], [-t*1j, 1]])


def eigenvalues(t):
    # convert to tuple for np.vectorize to work
    return tuple(sla.eigsh(h(t), k=2, return_eigenvectors=False))

eigenvalues = np.vectorize(eigenvalues)

t = np.linspace(-1, 1, num=200)
ev0, ev1 = eigenvalues(t)

plt.plot(t, ev0, 'r')
plt.plot(t, ev1, 'g')
plt.xlabel('t')
plt.ylabel('eigenvalues')

plt.show()

output plot

Идея Большинство собственных вычислений итеративно аппроксимируют собственные векторы и собственные значения. Подавая собственную систему матрицы h (t_k) в решатель в качестве начального предположения для диагонализации h (t_ {k + 1}), можно получить результат, упорядоченный по «характеру собственного вектора».

Можно ли добиться этого с помощью scipy или, в более общем смысле, с python? Преимущественно большая диагонализация должна быть делегирована выделенной скомпилированной библиотеке (например, Lapack in scipy). Есть ли подходящая процедура Лапака, может быть, уже завернутая в scipy?

Есть ли альтернативный метод, который достигает того же? Как это можно реализовать в python?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...