Експоненція матриці косо-ермітової матриці з фортраном 95 та ЛАПАК


11

Мене просто втягують у фортран 95 для деяких моделей квантової механіки. Чесно кажучи, мене зіпсувала Октава, тому я сприйняла матричну експонацію як належне. З огляду на (малу, ) косий- гермітську матрицю розміром n × n , який найефективніший спосіб використання LAPACK для вирішення цієї проблеми? Я не використовую обгортку LAPACK95, просто прямі дзвінки в LAPACK.n36n×n


2
Чи потрібен показник матриці сам по собі, чи тобі потрібен показник матриці, помножений на вектор?
Павло

@Paul: Вибачте, раніше цього не бачив. Ні, мені потрібна вся матриця.
квіте

Чому хтось спростував це питання? Якщо ви заявляєте, будь ласка, залиште причину в коментарях! Можливо, питання можна вдосконалити таким чином.
квіте

Ми покладаємось на DGPADM , але, як каже Джек Поулсон, може бути кращий шлях.
Майк Данлаве

Відповіді:


16

Експоненти матриці косо-ермітових матриць обчислити дешево:

Припустимо, - ваша косо-ермітська матриця, тоді я A - ермітинець , і через джеевд та друзів ви можете отримати розкладанняAiA

iA=UΛUH,

де є унітарною матрицею власних векторів і Λ є реальним і діагональним. Тоді, банально,UΛ

A=U(iΛ)UH.

Після того, як у вас є і Λ , можна легко обчислитиUΛ

exp(A)=exp(U(iΛ)UH)=Uexp(iΛ)UH

спочатку виставляючи власні значення, встановлюючи через zcopy , виконуючи B : = B exp ( - i Λ ) , виконуючи zscal на кожному стовпчику з експонованим власним значенням і, нарешті, встановлюючи свій результат наB:=UB:=Bexp(iΛ)

exp(A):=BUH

через zgemm .


Дякую! Я пропустив очевидну хитрість там із . Ви поставили мене на конкретні підпрограми LAPACK, які мені потрібні, тому додаткові подяки за це. Я поки не позначу це як правильне (спершу хочу перевірити це). i
квіте

1
Без поспіху. Я реально реалізував це раніше, тому я досить впевнений :-)
Джек Поульсон,

Це буде одним з тих чарівних біт коду, який я використовую всюди. Що варто, я також покладу подяку в коментарний рядок, який, мабуть, ніхто більше не побачить.
квіте

2
@JackPoulson: Добре зіграно, сер. Це те, що я отримую за вибір основного, який не вірить у уявні числа (крім власних значень).
Джефф Оксберрі

1
@JackPoulson: Це прекрасно працює. Ще раз дякую за це. Особливо біт zscal. Я мав більшу частину решти коду в іншій підпрограмі, але це було те, що я не помічав.
квіте

5

Оскільки я перебуваю на своєму телефоні, я не можу легко зв’язати речі, а посилання додаватимуть пізніше. Ви, напевно, захочете поглянути на статтю "19 сумнівних способів обчислення матричної експоненції", бібліотеку Фортран EXPOKIT, статті Джитза Нісена про методи Крилова для обчислення експоненції матриці, а також деякі з останніх робіт Ніка Хігхема про матричні експоненції. Частіше добуток добутку матриці експоненціального та вектора, ніж показник матриці поодинці, і тут методи Крилова можуть бути дуже корисними. Для менших, щільних матриць, таких, як ви описуєте, методи Padé могли б бути кращими, але я мав великий успіх з методами Крилова, коли використовувався всередині експоненціальних методів для чисельної інтеграції ODE.


Дякую. Мені відомо 19 сумнівних способів , а також експокіт, але деякі люди, з якими я працюю, знаходяться в галузі, тому я хочу уникати цього з міркувань авторських прав. Мені дуже хочеться реалізувати це за допомогою LAPACK / BLAS, оскільки я вже посилаюся на ці бібліотеки. Однак одна річ; Мені потрібна сама матриця експоненції. Я працюю над варіантом квантової технологічної томографії, і процес, про який йде мова, втілюється матрицею. Пізніше я матиму справу з інтегратором у поєднанні з цією матричною експоненцією, що стає, коли це стає цікавим!
квіте

1

Складний підхід до власного рішення є математично правильним, але він робить більше роботи, ніж потрібно. На жаль, вдосконалений підхід, який я збираюся описати, не може бути реалізований за допомогою викликів LAPACK.

X

X=UDUT

UD2×21×11×1exp(0)=12×2

exp(0tt0)=(costsintsintcost)

Після цього задається експоненціальна матриця, яку ви хочете

exp(X)=Uexp(D)UT

Я використовував цей підхід у своїх квантових кодах хімії протягом декількох десятиліть, і жодного разу не мав жодних проблем із програмним забезпеченням.


Привіт @Ron Shepard, і ласкаво просимо до обчислювальної біржі SE. Чи можете ви редагувати друге та третє рівняння? Їх трохи важко зрозуміти.
nicoguaro

0

Якщо все, що вам потрібно, це експоненціальна матриця, помножена на вектор, то ця підпрограма fortran може бути вам корисною . Він обчислює:

(eA)v

де v - вектор, а A - звичайна герміціанова матриця. Це підпрограма з бібліотеки EXPOKIT

В іншому випадку ви можете розглянути цю підпрограму, яка працює для будь-якої загальної складної матриці А.


Це не схоже на посилання на бібліотеки Fortran.
Джефф Оксберрі

@GeoffOxberry: я переписав це, щоб включити підпрограми fortran
Пол

@Paul: Не боюся нічого доброго. Те, що я роблю, - це всематрична варіація процесу томографії. Крім того косого- герміця!
квіте

Я вдячний, що ви переписали свою відповідь, але на основі редагування сліду виходить, що ви повністю змінили свою відповідь, взяли елементи моєї хронологічно попередньої відповіді та додали посилання.
Джефф Оксберрі

@GeoffOxberry: Навпаки ... Мої результати прийшли незалежно від твоїх, але ти опублікував, перш ніж я отримав можливість переписати свою відповідь :)
Пол
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.