Fortran 95 ve LAPACK ile çarpık-Hermitian matrisin üstel matrisi


11

Bazı kuantum mekaniği simülasyonları için fortran 95'e sıkıştım. Dürüst olmak gerekirse, Octave tarafından şımartıldım, bu yüzden verilen matris üssünü aldım. N × n boyutunda (küçük, ) bir çarpıklık -Hermitian matrisi verildiğinde, bu sorunu çözmek için LAPACK'i kullanmanın en etkili yolu nedir? LAPACK95 sarmalayıcısını kullanmıyorum, sadece LAPACK'e doğrudan çağrı yapıyorum.n36n×n


2
Matrisin kendi başına üstel olması veya matris üstelinin bir vektörle çarpılması mı gerekiyor?
Paul

@ Paul: Üzgünüm, daha önce görmedim. Hayır, tüm matrise ihtiyacım var.
qubyte

Neden birisi bu soruyu küçümseyesin ki? Eğer indirirseniz, lütfen yorumlarda bir neden bırakın! Belki de soru bu şekilde geliştirilebilir.
qubyte

DGPADM'ye güveniyoruz , ancak Jack Poulson'da daha iyi bir yol olabileceğini söylüyor.
Mike Dunlavey

Yanıtlar:


16

Eğim-Hermitian matrislerinin matris üstelleri hesaplamak ucuzdur:

çarpık Hermitian matrisiniz olduğunu varsayalım , o zaman i A Hermitiyen ve zheevd ve arkadaşları aracılığıyla ayrışmayı alabilirsinizAiA

iA=UΛUH,

burada birimsel özvektör matrisidir ve Λ gerçek ve diyagonaldir. Sonra, önemsiz olarak,UΛ

A=U(-benΛ)U'H.

ve Λ olduktan sonra , hesaplamak kolaydırUΛ

tecrübe(bir)=tecrübe(U(-benΛ)U'H)=Utecrübe(-benΛ)U'H

tarafından, öz exponentiating ayarı ilk ile zcopy , performans B : = B exp ( - ı Λ ) çalıştırarak zscal bir özdeğer exponentiated her kolon üzerinde, ve son olarak da bir sonuç ayarlamaB: =UB: =Btecrübe(-benΛ)

tecrübe(bir): =BU'H

zgemm yoluyla .


Teşekkürler! Orada ile bariz bir hile kaçırdım . Beni ihtiyacım olan spesifik LAPACK altyordamlarına koydun, bunun için çok teşekkürler. Bunu henüz doğru olarak işaretlemeyeceğim (önce test etmek istiyorum). ben
qubyte

1
Acele etme. Aslında daha önce uyguladım, bu yüzden oldukça eminim :-)
Jack Poulson

Bu, her yerde kullandığım büyülü kod parçalarından biri olacak. Değeri ne olursa olsun, muhtemelen başka hiç kimsenin görmeyeceği bir yorum satırına teşekkür ederim.
qubyte

2
@JackPoulson: İyi oynadım efendim. Hayali sayılara (özdeğerler dışında) inanmayan bir ana dal seçmek için aldığım şey bu.
Geoff Oxberry

1
@JackPoulson: Güzel çalışıyor. Bunun için tekrar teşekkürler. Özellikle zscal biti. Kodun geri kalanının çoğunu başka bir altyordamda yaşadım, ama bu göz ardı ettiğim bir şeydi.
qubyte

5

Telefonumda olduğum için işleri kolayca bağlayamıyorum ve daha sonra bağlantılar ekleyeceğim. Muhtemelen "Matris Üstelini Hesaplamak için 19 Zorlu Yol" makalesine, Fortran kütüphanesi EXPOKIT, Matris üstelini hesaplamak için Krylov yöntemleri hakkındaki Jitse Niesen'in makalesine ve Nick Higham'ın matris üstelleriyle ilgili son makalelerinden bazılarına bakmak isteyeceksiniz. Bir matris üstel ve bir vektörün ürününe tek başına matris üstelden daha fazla ihtiyaç duyulur ve burada Krylov yöntemleri oldukça yararlı olabilir. Açıkladığınız gibi daha küçük, yoğun matrisler için Padé yöntemleri daha iyi olabilir, ancak ODE'lerin sayısal entegrasyonu için üstel yöntemlerde kullanıldığında Krylov yöntemleriyle çok başarılı oldum.


Teşekkürler. 19 şüpheli yolun farkındayım ve aynı zamanda expokit, ama birlikte çalıştığım bazı insanlar endüstride, bu yüzden telif hakkı nedeniyle bundan kaçınmak istiyorum. Zaten bu kütüphanelere bağladığım için LAPACK / BLAS ile uygulamaya meraklıyım. Bir şey olsa; Matrisin üsteline ihtiyacım var. Kuantum işlem tomografisinin bir varyantı üzerinde çalışıyorum ve söz konusu işlem matris tarafından somutlaştırılıyor. Daha sonra bu matris üstel ile birlikte bir entegratör ile ilgileneceğim, ki bu gerçekten ilginç hale geliyor!
qubyte

1

Karmaşık özdönüşüm yaklaşımı matematiksel olarak doğrudur, ancak gereğinden fazla iş yapar. Ne yazık ki, açıklamak üzere olduğum geliştirilmiş yaklaşım LAPACK çağrıları ile uygulanamaz.

RC Ward ve LJ Gray, ACM Trans. Matematik. Yumuşak. 4, 278, (1978) 'de tarif edilmektedir. Bu, TOMS algoritması 530'da bulunan ve netlib'den indirebileceğiniz yazılımı açıklar. Bu tanımlıyor faktörü eğimli simetrik matris için olarakX

X=UDUT

burada gerçek ortogonal ve D gerçek eğim-simetrik ve blok köşegendir. Çapraz alt bloklar ya 2 × 2 ya da 1 × 1'dir . Blok köşegen olduğu için, her bir alt bloğu ayrı ayrı üstlenebilirsiniz. 1 x 1 blok sıfır ve vardır exp ( 0 ) = 1 , bu önemsiz, böylece. 2 × 2 altöbeğe ile yapılırUD2x21x11x1tecrübe(0)=12x2

tecrübe(0-tt0)=(marult-günahtgünahtmarult)

Sonra istediğiniz üstel matris tarafından verilir

tecrübe(X)=Utecrübe(D)UT

Bu yaklaşımı onlarca yıldır kuantum kimya kodlarımda kullandım ve hiçbir yazılımla ilgili hiçbir sorun yaşamadım.


Merhaba @Ron Shepard ve Hesaplamalı Exchange SE'ye hoş geldiniz. İkinci ve üçüncü denklemlerinizi düzenleyebilir misiniz? Anlamak biraz zor.
nicoguaro

0

İhtiyacınız olan tek şey matrisin bir vektörle çarpımı ise, bu fortran altyordamının sizin için bir faydası olabilir. Hesaplar:

(ebir)v

burada v bir vektördür ve A düzenli bir hermityan matristir. EXPOKIT'ten bir altyordamdır kütüphanesinden

Aksi takdirde, herhangi bir genel karmaşık matris A için çalışan bu alt rutini düşünmek isteyebilirsiniz .


Bu, Fortran kütüphanelerine bir referans gibi görünmüyor.
Geoff Oxberry

@GeoffOxberry: Fortran altyordamlarını dahil etmek için yeniden yazdım
Paul

@ Paul: Korkarım iyi değil. Yaptığım şey süreç tomografisinde tam bir matris varyasyonu. Ayrıca çarpık -Hermitian!
qubyte

Cevabınızı yeniden yazdığınız için teşekkür ederiz, ancak düzenleme izine dayanarak, cevabınızı tamamen değiştirdiğiniz, kronolojik olarak önceki cevabımın öğelerini aldığınız ve bağlantılar eklediğiniz gibi görünüyor.
Geoff Oxberry

@GeoffOxberry: Aksine ... Sonuçlarım sizden bağımsız olarak geldi, ama cevabımı tekrar yazma şansım olmadan önce yayınladınız :)
Paul
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.