Ma trận theo cấp số nhân của ma trận xiên-Hermiti với fortran 95 và LAPACK


11

Tôi chỉ bị cuốn vào fortran 95 cho một số mô phỏng cơ học lượng tử. Thành thật mà nói, tôi đã bị Octave làm hỏng nên tôi đã được cấp phép lũy thừa ma trận. Cho một (nhỏ, ) nghiêng ma trận -Hermitian kích thước n × n , cách hiệu quả nhất của việc sử dụng LAPACK để giải quyết vấn đề này là gì? Tôi không sử dụng trình bao bọc LAPACK95, chỉ gọi trực tiếp đến LAPACK.n36n×n


2
Bạn có cần chính số mũ của ma trận hay bạn cần số mũ của ma trận nhân với một vectơ?
Paul

@Paul: Xin lỗi, trước đây không thấy điều này. Không, tôi cần toàn bộ ma trận.
qubyte

Tại sao ai đó đánh giá thấp câu hỏi này? Nếu bạn downvote, xin vui lòng để lại một lý do trong các ý kiến! Có lẽ câu hỏi có thể được cải thiện theo cách này.
qubyte

Chúng tôi dựa vào DGPADM , nhưng tại Jack Poulson nói, có thể có một cách tốt hơn.
Mike Dunlavey

Câu trả lời:


16

Số mũ ma trận của ma trận xiên-Hermiti rẻ để tính toán:

Giả sử là ma trận xiên của bạn, sau đó là Hermiti , và thông qua zheevd và bạn bè, bạn có thể nhận được phân táchi AAiA

iA=UΛUH,

Trong đó là ma trận eigenvector đơn nhất và là số thực và đường chéo. Sau đó, tầm thường,ΛUΛ

A=U(iΛ)UH.

Khi bạn có và , thật dễ dàng để tính toánΛUΛ

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

bằng cách lũy thừa đầu tiên các giá trị riêng, đặtB : = B exp ( - i Λ )B:=U qua zcopy , thực hiện bằng cách chạy zscal trên mỗi cột với giá trị riêng lũy ​​thừa, và cuối cùng đặt kết quả của bạn thànhB:=Bexp(iΛ)

exp(A):=BUH

qua zgemm .


Cảm ơn! Tôi đã bỏ lỡ một mẹo rõ ràng ở đó với . Bạn đã đưa tôi vào các chương trình con LAPACK cụ thể mà tôi cần, vì vậy xin cảm ơn thêm vì điều đó. Tôi sẽ không đánh dấu điều này là chính xác (muốn kiểm tra trước).i
qubyte

1
Không vội. Tôi thực sự đã thực hiện nó trước đây, vì vậy tôi khá tự tin :-)
Jack Poulson

Đây sẽ là một trong những đoạn mã kỳ diệu mà tôi sử dụng ở mọi nơi. Đối với những gì nó có giá trị, tôi cũng sẽ cảm ơn bạn trong một dòng bình luận mà có lẽ không ai khác sẽ nhìn thấy.
qubyte

2
@JackPoulson: Chơi tốt, thưa ngài. Đây là những gì tôi nhận được khi chọn một chuyên ngành không tin vào những con số tưởng tượng (ngoài giá trị bản địa).
Geoff Oxberry

1
@JackPoulson: Nó hoạt động rất đẹp. Cảm ơn một lần nữa cho điều này. Đặc biệt là bit zscal. Tôi đã có hầu hết phần còn lại của mã trong một chương trình con khác, nhưng đây là điều mà tôi đã bỏ qua.
qubyte

5

Vì tôi đang sử dụng điện thoại, tôi không thể liên kết mọi thứ dễ dàng và sẽ thêm liên kết sau. Có lẽ bạn sẽ muốn xem bài báo "19 cách đáng tin cậy để tính toán hàm mũ ma trận", thư viện Fortran EXPOKIT, bài báo của Jitse Niesen về phương pháp tính toán theo cấp số nhân của ma trận và một số bài báo gần đây của Nick Higham về hàm mũ ma trận. Nó phổ biến hơn khi cần sản phẩm của một hàm mũ ma trận và một vectơ hơn là hàm mũ của ma trận, và ở đây, các phương pháp Krylov có thể khá hữu ích. Đối với các ma trận nhỏ hơn, dày đặc như các ma trận mà bạn mô tả, các phương thức Padé có thể tốt hơn, nhưng tôi đã thành công với các phương pháp Krylov khi được sử dụng bên trong các phương pháp hàm mũ để tích hợp ODE.


Cảm ơn. Tôi biết về 19 cách đáng ngờ , và cũng có thể là lộ ra, nhưng một số người tôi làm việc cùng trong ngành, vì vậy tôi muốn tránh nó vì lý do bản quyền. Tôi muốn triển khai nó với LAPACK / BLAS vì tôi đã liên kết với các thư viện này. Một điều mặc dù; Tôi cần ma trận theo cấp số nhân. Tôi đang nghiên cứu một biến thể của chụp cắt lớp quá trình lượng tử và quá trình được đề cập được thể hiện bằng ma trận. Sau này tôi sẽ làm việc với một nhà tích hợp kết hợp với cấp số nhân ma trận này, đó là khi nó thực sự thú vị!
qubyte

1

Cách tiếp cận eigensolution phức tạp là đúng về mặt toán học, nhưng nó thực hiện nhiều công việc hơn mức cần thiết. Thật không may, cách tiếp cận cải tiến mà tôi sắp mô tả không thể được thực hiện bằng các cuộc gọi LAPACK.

X

X=UDUT

UD2×21×11×1exp(0)=12×2 được thực hiện với

exp(0tt0)=(costsintsintcost)

Ma trận hàm mũ mà bạn muốn sau đó được đưa ra bởi

exp(X)=Uexp(D)UT

Tôi đã sử dụng phương pháp này trong các mã hóa học lượng tử của mình trong nhiều thập kỷ và tôi chưa bao giờ có bất kỳ vấn đề nào với bất kỳ phần mềm nào liên quan.


Xin chào @Ron Shepard, và chào mừng bạn đến Sàn giao dịch tính toán SE. Bạn có thể chỉnh sửa phương trình thứ hai và thứ ba của bạn? Họ hơi khó hiểu.
nicoguaro

0

Nếu tất cả những gì bạn cần là số mũ của ma trận nhân với một vectơ, thì chương trình con fortran này có thể giúp ích cho bạn. Nó tính toán:

(eA)v

Trong đó v là một vectơ và A là ma trận ẩn sĩ thông thường. Nó là một chương trình con từ EXPOKIT thư viện

Mặt khác, bạn có thể muốn xem xét chương trình con này , hoạt động cho bất kỳ ma trận phức tạp chung A.


Điều đó không giống như một tài liệu tham khảo đến các thư viện Fortran.
Geoff Oxberry

@GeoffOxberry: Tôi viết lại nó để bao gồm các chương trình con fortran
Paul

@Paul: Không tốt, tôi sợ. Những gì tôi đang làm là một biến thể tất cả ma trận trên chụp cắt lớp quy trình. Ngoài xiên -Hermiti!
qubyte

Tôi đánh giá cao việc bạn viết lại câu trả lời của mình, nhưng dựa trên đường dẫn chỉnh sửa, có vẻ như bạn đã thay đổi hoàn toàn câu trả lời của mình, lấy các yếu tố của câu trả lời trước đó theo thời gian của tôi và thêm các liên kết.
Geoff Oxberry

@GeoffOxberry: Ngược lại ... Kết quả của tôi đến độc lập với bạn, nhưng bạn đã đăng trước khi tôi có cơ hội viết lại câu trả lời của mình :)
Paul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.