Я делаю некоторые числовые моделирования квантовых вычислений, и я хотел бы найти собственные векторы большой эрмитовой матрицы (~ 2^14 строк/столбцов)Быстрые собственные векторы нахождения на КВД с использованием Qutip и slepc4py
Я нахожусь работающих на 24-ядерном/48-канальном потоке XEON. Код был первоначально написан с помощью библиотеки Qutip. Я узнал, что включенная функция eigenstates()
использует только один поток на моей машине, поэтому я пытаюсь найти более быстрый способ сделать это.
Я попытался с помощью scipy.linalg
eig()
и eigh()
функции, а также scipy.sparse.linalg
eig()
и eigh()
, но оба, кажется медленнее, чем функция, построенной в Qutip.
Я видел некоторое предположение, что я могу получить некоторое ускорение от использования файла slepc4py, однако документация пакета кажется очень недостаточной. Я не могу понять, как преобразовать комплексный массив numpy в матрицу SLEPC.
A = PETSc.Mat().create()
A[:,:] = B[:,:]
# where B is a scipy array of complex type
TypeError: Cannot cast array data from dtype('complex128') to dtype('float64') according to the rule 'safe'
Добро пожаловать в Stackoverflow! Кажется, что ваш вопрос похож на http://stackoverflow.com/questions/29525041/petsc4py-creating-aij-matrix-from-csc-matrix-results-in-typeerror. Вам придется перекомпилировать PETSc и SLEPc, установить petsc4py и slepc4py ... Если вас интересуют только квантовые состояния с низкой энергией, вас будут интересовать варианты \t EPS_SMALLEST_MAGNITUDE из EPSSetWhichEigenpairs() и EPSSetDimensions() в сочетании с EPSType, например EPSARNOLDI или EPSLANCZOS. – francis
Кстати, [scipy.sparse.linalg.eigsh] (https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.linalg.eigsh.html) также может доказать полезно ... – francis