Matriks eksponensial dari matriks miring-Hermitian dengan fortran 95 dan LAPACK

11

Saya baru saja dimasukkan ke fortran 95 untuk beberapa simulasi mekanika kuantum. Jujur, saya telah dimanjakan oleh Oktaf jadi saya telah mengambil matriks eksponensial begitu saja. Dengan kemiringan (kecil, ) - Matriks Jerman dengan ukuran , apa cara paling efisien menggunakan LAPACK untuk menyelesaikan masalah ini? Saya tidak menggunakan pembungkus LAPACK95, hanya panggilan langsung ke LAPACK.n × nn36n×n

qubyte
sumber
2
Apakah Anda memerlukan matriks eksponensial dengan sendirinya, atau apakah Anda memerlukan matriks eksponensial dikalikan dengan vektor?
Paul
@ Paul: Maaf, tidak melihat ini sebelumnya. Tidak, saya perlu seluruh matriks.
qubyte
Mengapa seseorang membatalkan pertanyaan ini? Jika Anda downvote, silakan tinggalkan alasan di komentar! Mungkin pertanyaannya bisa diperbaiki dengan cara ini.
qubyte
Kami mengandalkan DGPADM , tetapi di Jack Poulson mengatakan, mungkin ada cara yang lebih baik.
Mike Dunlavey

Jawaban:

16

Matriks eksponensial dari matriks condong-Hermitian murah untuk dihitung:

Misalkan adalah matriks miring-Hermitian Anda, maka adalah Hermitian, dan melalui zheevd dan teman-teman Anda bisa mendapatkan dekomposisii AAiA

iA=UΛUH,

di mana adalah matriks vektor eigen kesatuan dan adalah nyata dan diagonal. Kemudian, sepele,ΛUΛ

A=U(iΛ)UH.

Setelah Anda memiliki dan , mudah untuk menghitungΛUΛ

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

dengan terlebih dahulu menghitung nilai eigen, menetapkan melalui zcopy , melakukan dengan menjalankan zscal pada setiap kolom dengan nilai eigen yang eksponensial, dan akhirnya mengatur hasil Anda keB : = B exp ( - i Λ )B:=UB:=Bexp(iΛ)

exp(A):=BUH

melalui zgemm .

Jack Poulson
sumber
Terima kasih! Saya melewatkan trik yang jelas di sana dengan . Anda telah menempatkan saya pada subrutin LAPACK spesifik yang saya butuhkan, jadi terima kasih banyak untuk itu. Saya belum akan menandai ini sebagai benar (ingin mengujinya terlebih dahulu). i
qubyte
1
Tidak terburu-buru. Saya sebenarnya sudah menerapkannya sebelumnya, jadi saya cukup percaya diri :-)
Jack Poulson
Ini akan menjadi salah satu bit ajaib kode yang saya gunakan di semua tempat. Untuk apa nilainya, saya juga akan mengucapkan terima kasih di baris komentar yang mungkin tidak akan dilihat orang lain.
qubyte
2
@JackPoulson: Dimainkan dengan baik, tuan. Inilah yang saya dapatkan untuk memilih mata kuliah utama yang tidak percaya pada angka imajiner (selain nilai eigen).
Geoff Oxberry
1
@JackPoulson: Ini bekerja dengan indah. Terima kasih lagi untuk ini. Terutama bit zscal. Saya memiliki sebagian besar sisa kode dalam subrutin lain, tetapi ini adalah sesuatu yang saya abaikan.
qubyte
5

Karena saya menggunakan ponsel, saya tidak dapat menautkan sesuatu dengan mudah, dan akan menambahkan tautan nanti. Anda mungkin ingin melihat kertas "19 Cara Meragukan untuk Menghitung Eksponensial Matriks", perpustakaan Fortran EXPOKIT, makalah Jitse Niesen tentang metode Krylov untuk menghitung eksponensial Matriks, dan beberapa makalah terbaru Nick Higham tentang matriks eksponensial matriks. Lebih umum membutuhkan produk dari matriks eksponensial dan vektor daripada matriks eksponensial sendiri, dan di sini, metode Krylov bisa sangat membantu. Untuk matriks yang lebih kecil dan padat seperti yang Anda gambarkan, metode Padé mungkin lebih baik, tetapi saya telah banyak sukses dengan metode Krylov ketika digunakan dalam metode eksponensial untuk integrasi numerik ODE.

Geoff Oxberry
sumber
Terima kasih. Saya mengetahui 19 cara yang meragukan , dan juga menghapus, tetapi beberapa orang yang bekerja dengan saya ada di industri, jadi saya ingin menghindarinya karena alasan hak cipta. Saya tertarik mengimplementasikannya dengan LAPACK / BLAS karena saya sudah menautkan ke perpustakaan ini. Satu hal; Saya perlu matriks eksponensial itu sendiri. Saya sedang mengerjakan varian tomografi proses kuantum, dan proses yang dimaksud diwujudkan oleh matriks. Nanti saya akan berurusan dengan integrator dalam kombinasi dengan matriks eksponensial ini, yang ketika itu menjadi sangat menarik!
qubyte
1

Pendekatan eigensolusi yang kompleks secara matematis benar, tetapi lebih banyak bekerja daripada yang diperlukan. Sayangnya, pendekatan yang ditingkatkan yang akan saya uraikan tidak dapat diimplementasikan dengan panggilan LAPACK.

X

X=UDUT

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

exp(0tt0)=(costsintsintcost)

Matriks eksponensial yang Anda inginkan kemudian diberikan oleh

exp(X)=Uexp(D)UT

Saya telah menggunakan pendekatan ini dalam kode kimia kuantum saya selama beberapa dekade dan saya tidak pernah memiliki masalah dengan salah satu perangkat lunak yang terlibat.

Ron Shepard
sumber
Halo @Ron Shepard, dan selamat datang di Computational Exchange SE. Bisakah Anda mengedit persamaan kedua dan ketiga Anda? Mereka agak sulit dimengerti.
nicoguaro
0

Jika yang Anda butuhkan hanyalah matriks eksponensial yang dikalikan dengan vektor, maka subrutin fortran ini mungkin berguna bagi Anda. Itu menghitung:

(eA)v

di mana v adalah vektor, dan A adalah matriks hermitian reguler. Ini adalah subrutin dari perpustakaan EXPOKIT

Kalau tidak, Anda mungkin ingin mempertimbangkan subrutin ini , yang berfungsi untuk semua matriks kompleks A. umum

Paul
sumber
Itu tidak terlihat seperti referensi ke perpustakaan Fortran.
Geoff Oxberry
@ GeoffOxberry: Saya menulis ulang untuk memasukkan subrutin fortran
Paul
@ Paul: Tidak baik, saya takut. Apa yang saya lakukan adalah variasi semua-matriks pada proses tomografi. Selain itu condong -Hermitian!
qubyte
Saya menghargai bahwa Anda menulis ulang jawaban Anda, tetapi berdasarkan jejak edit, sepertinya Anda benar-benar mengubah jawaban Anda, mengambil elemen jawaban kronologis saya sebelumnya, dan menambahkan tautan.
Geoff Oxberry
@ GeoffOxberry: Sebaliknya ... Hasil saya datang secara independen dari Anda, tetapi Anda memposting sebelum saya mendapat kesempatan untuk menulis ulang jawaban saya :)
Paul