2017-01-15 4 views
0

Мне интересно вычислить матричную экспоненту данной разреженной матрицы H, а затем умножить ее на заданный вектор v. Так как размер матрицы H будет иметь порядок 90 000, то вычислять явно его, а затем умножать на v становится трудным (он тратит много времени). Дело в том, что я хочу, чтобы вычислить временную эволюцию состояния v, где H является гамильтоновой, в течение заданного времени:Умножение матричной экспоненты с заданным вектором в python

U = exp(-i*H*t) 

где i мнимая единица и t это время. Тогда я хочу, чтобы умножить эту матрицу U вектора v для того, чтобы получить эволюцию этого состояния v

С другой стороны, я нашел следующую библиотеку питона:

scipy.sparse.linalg.expm_multiply 

так:

scipy.sparse.linalg.expm_multiply(-(1j)*t*H,v) 

который исходит от https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.sparse.linalg.expm_multiply.html. С этим я могу очень эффективно вычислить только в течение небольшого времени. В течение долгого времени t он проводит много времени, я не знаю, почему ...

Любая идея, почему это происходит? Как можно решить?

Моя цель сделать таблицу с несколькими точками времени и его соответствующих эволюционировали состояний

+0

http://stackoverflow.com/help/mcve –

+0

Документы для этой функции ссылаются на пару научных вычислительных документов. Это также может помочь прочитать код в 'scipy/sparse/linalg/_expm_multiply.py'. – hpaulj

ответ

1

Вы должны первым диагонализирующие H, а затем представить V в этом базисе (энергия основе квантовой механики). Выражение v в этой форме облегчит вам вычисление последующей эволюции времени.

Пусть e_i собственные векторы H. Так как H является гамильтонова это эрмитова, и, следовательно, любой вектор v, имеет полное и уникальное описание в виде линейной суперпозиции в энергетической основе:

v = SUM(v_i * e_i) 

с v_i уникальные константы. Тогда можно вычислить время эволюционировали состояние для любого т, как:

v(t) = SUM(exp(-i*t*lambda_i) * v_i *e _i) 

где lambda_i является собственным значением Н * e_i = lambda_i * e_i. Так как это всего лишь совокупность скалярных умножений и суммы, это достаточно эффективно для вычисления.

Основным замедлением будет диагонализация H, которая алгоритмически имеет порядок O (N^3) (для матрицы N x N).

Для малых t, exp (-itH) составляет приблизительно 1 - itH (это видно из расширения Тейлора), так что, конечно, это будет быстро.

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

+0

Хорошо спасибо, но так как гамильтонова матрица H имеет размерность порядка 90.000, невозможно получить все собственные векторы системы (только основное состояние и возбужденные состояния), так что невозможно выразить состояние v в терминах основы системы. – Joe

+0

@Joe - тогда, возможно, вам нужно сделать какое-то приближение медленного поля. Вычислите только первые несколько собственных векторов/собственных значений и используйте их для получения приблизительной эволюции времени. Это может быть приемлемым, если вас интересуют только «медленные» части динамики, и высокочастотные режимы действительно можно пренебречь. Если вам нужно полное решение, то, к сожалению, математические и вычислительные реалии будут налагать некоторые довольно жесткие ограничения. –

+0

@Joe - возможно, также изучите группу перенормировки и процесс систематического интегрирования высокоэнергетических мод в вашей конкретной проблемной области для генерации действительного гамильтониана с низкой энергией, который можно решить. Там могут быть пакеты и/или документы, которые помогут вам получить динамику приблизительным, но расчетным способом. Однако мы уже находимся вне сферы действия stackoverflow - это лучше подходит для платы физики; –

Смежные вопросы