Ma trận theo cấp số nhân của ma trận bất đối xứng thực với Fortran 95 và LAPACK


10

Gần đây tôi đã hỏi một câu hỏi dọc theo các dòng tương tự cho ma trận xiên-Hermiti. Lấy cảm hứng từ sự thành công của câu hỏi đó và sau khi đập đầu vào tường trong vài giờ, tôi đang nhìn vào ma trận theo cấp số nhân của ma trận bất đối xứng thực sự. Con đường tìm kiếm giá trị bản địa và người bản địa dường như khá phức tạp và tôi sợ rằng mình đã bị lạc.

Bối cảnh: Cách đây một thời gian tôi đã hỏi câu hỏi này về vật lý lý thuyết SE. Kết quả cho phép tôi diễn đạt các phương trình tổng thể dưới dạng ma trận bất đối xứng thực. Trong trường hợp độc lập với thời gian, phương trình chính được giải bằng cách lũy thừa ma trận này. Trong trường hợp phụ thuộc vào thời gian, nó sẽ yêu cầu tích hợp. Hiện tại tôi chỉ quan tâm đến sự độc lập về thời gian.

Khi nhìn vào chương trình con khác nhau tôi nghĩ rằng tôi nên gọi ( ? Gehrd , ? Orghr , ? Hseqr ...) không rõ nếu nó sẽ đơn giản hơn để cast ma trận từ real*8đến complex*16và điền đầy đủ các phiên bản đôi phức tạp của những thói quen, hoặc gắn bó real*8và thực hiện việc nhân đôi số lượng mảng của tôi và tạo ra một ma trận phức tạp của chúng sau này.

Vì vậy, những thói quen nào tôi nên gọi (và theo thứ tự nào), và tôi nên sử dụng phiên bản đôi thực hay phiên bản đôi phức tạp? Dưới đây là một nỗ lực để làm điều này với các phiên bản kép thực sự. Tôi đã bị mắc kẹt trong việc tìm kiếm giá trị bản địa và người bản địa của L*t.

function time_indep_master(s,L,t)
  ! s is the length of a side of L, which is square.
  ! L is a real*8, asymmetric square matrix.
  ! t is a real*8 value corresponding to time.
  ! This function (will) compute expm(L*t).

  integer, intent(in)    :: s
  real*8,  intent(in)    :: L(s,s), t
  real*8                 :: tau(s-1), work(s), wr(s), wi(s), vl
  real*8, dimension(s,s) :: time_indep_master, A, H, vr
  integer                :: info, m, ifaill(2*s), ifailr(2*s)
  logical                :: sel(s)

  A = L*t
  sel = .true.

  call dgehrd(s,1,s,A,s,tau,work,s,info)
  H = A
  call dorghr(s,1,s,A,s,tau,work,s,info)
  call dhseqr('e','v',s,1,s,H,s,wr,wi,A,s,work,s,info)
  call dhsein('r','q','n',sel,H,s,wr,wi,vl,1,vr,s,2*s,m,work,ifaill,ifailr,info)

  ! Confused now...

end function

Câu trả lời:


8

Trước tiên tôi sẽ suy nghĩ thực sự khó khăn về việc liệu ma trận có thực sự hoàn toàn độc đoán hay không: Có sự biến đổi nào có thể biến nó thành Hermiti không? Liệu vật lý có đảm bảo rằng ma trận phải có đường chéo (với ma trận eigenvector có điều kiện hợp lý) không?

Nếu nó thực sự không có bất kỳ sự đối xứng nào để khai thác, thì bạn nên bắt đầu bằng cách đọc Nineteen Cách để tính toán số mũ ma trận , là tài liệu tham khảo tiêu chuẩn (và được viết bởi tác giả của MATLAB và đồng tác giả của G & vL) .


1
2×24×4

1
Tôi thích câu trả lời này; trường hợp không đối xứng sở hữu đủ những cạm bẫy đáng để xem xét nếu có thể có một công thức của vấn đề của bạn dẫn đến ma trận đối xứng thay vì ma trận không đối xứng.
JM

@ MarkS.Everitt: Bạn dường như gần như ở đó ... ma trận lớn đến mức nào? ~ 36 x 36 nữa?
Jack Poulson

16×1636×36

2
@ MarkS.Everitt: Vì vậy, vấn đề của bạn bây giờ chỉ là làm thế nào để lũy thừa ma trận 4 x 4. Điều này là đủ nhỏ để phân tích tiệm cận là không liên quan, vì vậy câu trả lời sẽ phụ thuộc hoàn toàn vào các giá trị. Tôi thực sự không thể nói nữa trừ khi bạn dịch bài vật lý được liên kết của bạn thành đại số tuyến tính (siêu nhân là gì?!?).
Jack Poulson

7

Để xây dựng dựa trên những gì Jack đã nói, cách tiếp cận tiêu chuẩn dường như được sử dụng trong phần mềm (như EXPOKIT, được đề cập trong câu hỏi trước đó của bạn) là chia tỷ lệ theo phương pháp xấp xỉ Padé (Phương pháp 2 và 3) hoặc phương pháp không gian con Krylov (Phương pháp 20). Đặc biệt, nếu bạn đang xem các nhà tích hợp theo cấp số nhân, bạn sẽ muốn xem xét các phương pháp không gian con Krylov và xem các bài viết về các nhà tích hợp theo cấp số nhân (một số tài liệu tham khảo được đề cập cùng với Phương pháp 20 trong bài viết của Moler & van Loan).

Nếu bạn không muốn sử dụng các hàm riêng, hãy xem xét sử dụng các hệ thống của các hàm riêng (Phương pháp 15); vì ma trận của bạn có thể không thể vượt qua được, nên cách tiếp cận này có thể không tốt nhất, nhưng tốt hơn là cố gắng tính toán trực tiếp các giá trị riêng và giá trị riêng (ví dụ, Phương pháp 14).

Giảm xuống dạng Hessenberg không phải là một ý tưởng tốt (Phương pháp 13).

Tôi không rõ liệu bạn sẽ được phục vụ tốt hơn với số học thực hay phức, vì số học phức tạp của Fortran rất nhanh, nhưng có thể tràn / tràn (xem "Trình biên dịch Fortran thực sự tốt hơn bao nhiêu?" ).

Bạn có thể bỏ qua các Phương thức 5-7 một cách an toàn (Các phương pháp dựa trên bộ giải ODE không hiệu quả), Phương pháp 8-13 (đắt tiền), Phương pháp 14 (tính toán các hàm riêng của ma trận lớn là khó mà không có cấu trúc đặc biệt và dễ bị lỗi số trong các trường hợp không điều kiện) và Phương pháp 16 (tính toán phân tách Jordan của ma trận không ổn định về số lượng). Phương pháp 17-19 là khó hơn để thực hiện; đặc biệt, Phương pháp 17 và 18 sẽ yêu cầu đọc nhiều hơn. Phương pháp 1 là một tùy chọn dự phòng để chia tỷ lệ và bình phương nếu các xấp xỉ Padé không hoạt động tốt.

Bj

Bj= =γjTôi+Ej,

γjjEj


1
Ôi(n2)Ôi(n3)

Không còn nghi ngờ gì nữa, họ biết họ đang làm gì; Tôi không lo lắng về việc triển khai LAPACK. Tôi ngạc nhiên hơn về hành vi của trình biên dịch Fortran.
Geoff Oxberry

2
Vâng, trình biên dịch có thể là một vấn đề nhiều hơn LAPACK được viết tốt. Có thể không hài lòng khi thấy rằng chương trình của bạn bị lỗi chỉ vì việc triển khai cho giá trị tuyệt đối và phân chia được sử dụng bởi trình biên dịch đã bị phá hỏng ...
JM

-1

Tôi có một chương trình con Fortran đơn giản tính toán số mũ của một ma trận tùy ý. Tôi đã kiểm tra nó theo lệnh Matlab và nó vẫn ổn. Nó dựa trên tỷ lệ và bình phương. Tôi đã viết nó một vài năm trước.

Tôi muốn hoàn thành một chương trình con khác, như những chương trình tôi tải xuống từ gams.nist.gov. Nhưng chưa có may mắn.

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.