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 × n
11
Jawaban:
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 ASEBUAH saya A
di mana adalah matriks vektor eigen kesatuan dan adalah nyata dan diagonal. Kemudian, sepele,ΛU Λ
Setelah Anda memiliki dan , mudah untuk menghitungΛU Λ
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 : = U B : = B exp( - i Λ )
melalui zgemm .
sumber
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.
sumber
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.
Matriks eksponensial yang Anda inginkan kemudian diberikan oleh
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.
sumber
Jika yang Anda butuhkan hanyalah matriks eksponensial yang dikalikan dengan vektor, maka subrutin fortran ini mungkin berguna bagi Anda. Itu menghitung:
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
sumber