Matrice exponentielle d'une matrice skew-hermitienne avec fortran 95 et LAPACK

11

Je viens de me retrouver dans fortran 95 pour quelques simulations de mécanique quantique. Honnêtement, j'ai été gâté par Octave, donc j'ai pris l'exponentiation matricielle pour acquis. Étant donné un (petit, ) skew -matrice hermitienne de taille , quel est le moyen le plus efficace d'utiliser LAPACK pour résoudre ce problème? Je n'utilise pas le wrapper LAPACK95, juste des appels directs à LAPACK.n36n×n

qubyte
la source
2
Avez-vous besoin de l'exponentielle de matrice par elle-même, ou avez-vous besoin de l'exponentielle de matrice multipliée par un vecteur?
Paul
@ Paul: Désolé, je n'ai pas vu ça avant. Non, j'ai besoin de toute la matrice.
qubyte
Pourquoi quelqu'un voterait-il contre cette question? Si vous dévaluez, veuillez laisser une raison dans les commentaires! Peut-être que la question peut être améliorée de cette façon.
qubyte
Nous comptons sur DGPADM , mais selon Jack Poulson, il pourrait y avoir une meilleure solution.
Mike Dunlavey

Réponses:

16

Les exponentielles matricielles des matrices asymétriques-hermitiennes sont peu coûteuses à calculer:

Supposons que est votre matrice hermitienne asymétrique , alors est hermitien, et via zheevd et ses amis, vous pouvez obtenir la décompositioni AAiA

iA=UΛUH,

où est la matrice de vecteur propre unitaire et est réel et diagonal. Puis, trivialement,ΛUΛ

A=U(iΛ)UH.

Une fois que vous avez et , il est facile de calculerΛUΛ

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

en exponentiant d'abord les valeurs propres, en définissant via zcopy , en exécutant en exécutant zscal sur chaque colonne avec une valeur propre exponentiée, et enfin en définissant votre résultat surB : = B exp ( - i Λ )B:=UB:=Bexp(iΛ)

exp(A):=BUH

via zgemm .

Jack Poulson
la source
Merci! J'ai raté là un truc évident avec le . Vous m'avez mis sur les sous-programmes LAPACK spécifiques dont j'ai besoin, alors merci encore pour cela. Je ne marquerai pas encore ceci comme correct (je veux d'abord le tester). i
qubyte
1
Pas de précipitation. Je l'ai déjà implémenté auparavant, donc je suis assez confiant :-)
Jack Poulson
Ce sera l'un de ces morceaux de code magiques que j'utilise partout. Pour ce que ça vaut, je mettrai aussi un merci dans une ligne de commentaire que personne d'autre ne verra probablement jamais.
qubyte
2
@JackPoulson: Bien joué, monsieur. C'est ce que j'obtiens pour choisir un majeur qui ne croit pas aux nombres imaginaires (autres que les valeurs propres).
Geoff Oxberry
1
@JackPoulson: Cela fonctionne à merveille. Merci encore pour ça. Surtout le bit zscal. J'avais la plupart du reste du code dans un autre sous-programme, mais c'était quelque chose que j'avais oublié.
qubyte
5

Étant donné que je suis sur mon téléphone, je ne peux pas lier les choses facilement et j'ajouterai des liens plus tard. Vous voudrez probablement consulter l'article "19 manières douteuses de calculer l'exponentielle de la matrice", la bibliothèque Fortran EXPOKIT, l'article de Jitse Niesen sur les méthodes de Krylov pour calculer l'exponentielle de la matrice, et certains des articles récents de Nick Higham sur les exponentielles de la matrice. Il est plus courant d'avoir besoin du produit d'une matrice exponentielle et d'un vecteur que de la matrice exponentielle seule, et ici, les méthodes de Krylov peuvent être très utiles. Pour les matrices plus petites et denses comme celles que vous décrivez, les méthodes Padé pourraient être meilleures, mais j'ai eu beaucoup de succès avec les méthodes Krylov lorsqu'elles sont utilisées dans des méthodes exponentielles pour l'intégration numérique des ODE.

Geoff Oxberry
la source
Merci. Je connais 19 façons douteuses et aussi des expokits, mais certaines des personnes avec qui je travaille sont dans l'industrie, donc je veux l'éviter pour des raisons de droit d'auteur. Je suis impatient de l'implémenter avec LAPACK / BLAS car je suis déjà lié à ces bibliothèques. Une chose cependant; J'ai besoin de la matrice exponentielle elle-même. Je travaille sur une variante de la tomographie par processus quantique, et le processus en question est incarné par la matrice. Plus tard, je traiterai d'un intégrateur en combinaison avec cette matrice exponentielle, ce qui est vraiment intéressant!
qubyte
1

L'approche complexe de la résolution électronique est mathématiquement correcte, mais elle fait plus de travail que nécessaire. Malheureusement, l'approche améliorée que je vais décrire ne peut pas être mise en œuvre avec les appels LAPACK.

Regardez RC Ward et LJ Gray, ACM Trans. Math. Doux. 4, 278, (1978). Ceci décrit le logiciel disponible dans l'algorithme TOMS 530 et que vous pouvez télécharger à partir de netlib. Ceci décrit comment factoriser la matrice symétrique tant queX

X=UDUT

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

exp(0-tt0)=(cost-péchétpéchétcost)

La matrice exponentielle que vous souhaitez est alors donnée par

exp(X)=Uexp()UT

J'utilise cette approche dans mes codes de chimie quantique depuis plusieurs décennies et je n'ai jamais eu de problème avec aucun des logiciels impliqués.

Ron Shepard
la source
Bonjour @Ron Shepard et bienvenue dans Computational Exchange SE. Pouvez-vous modifier vos deuxième et troisième équations? Ils sont un peu difficiles à comprendre.
nicoguaro
0

Si tout ce dont vous avez besoin est l'exponentielle de la matrice multipliée par un vecteur, alors ce sous - programme fortran peut vous être utile. Il calcule:

(eUNE)v

où v est un vecteur et A est une matrice hermitienne régulière. Il s'agit d'un sous-programme de la bibliothèque EXPOKIT

Sinon, vous voudrez peut-être considérer ce sous - programme, qui fonctionne pour toute matrice complexe générale A.

Paul
la source
Cela ne ressemble pas à une référence aux bibliothèques Fortran.
Geoff Oxberry
@GeoffOxberry: Je l'ai réécrit pour inclure les sous
Paul
@ Paul: Pas bon, j'ai peur. Ce que je fais est une variation matricielle sur la tomographie par processus. De plus fausser -Hermitien!
qubyte
J'apprécie que vous ayez réécrit votre réponse, mais sur la base de la piste d'édition, il semble que vous ayez complètement changé votre réponse, pris des éléments de ma réponse chronologiquement antérieure et ajouté des liens.
Geoff Oxberry
@GeoffOxberry: Au contraire ... Mes résultats sont venus indépendamment des vôtres, mais vous avez posté avant d'avoir la chance de réécrire ma réponse :)
Paul