เมทริกซ์เลขชี้กำลังของเมทริกซ์อสมมาตรจริงด้วย Fortran 95 และ LAPACK


10

ฉันเพิ่งถามคำถามในบรรทัดเดียวกันสำหรับเมทริกซ์เอียง - เฮอร์เมียน ได้รับแรงบันดาลใจจากความสำเร็จของคำถามนั้นและหลังจากต่อสู้กับกำแพงเป็นเวลาสองสามชั่วโมงฉันกำลังดูเมทริกซ์เลขชี้กำลังของเมทริกซ์สมมาตรจริง เส้นทางในการค้นหาค่าลักษณะเฉพาะและค่าลักษณะเฉพาะนั้นค่อนข้างซับซ้อนและฉันกลัวว่าฉันจะสูญเสียไป

ที่มา: บางครั้งฉันถามคำถามนี้เกี่ยวกับฟิสิกส์เชิงทฤษฎี SE ผลที่ได้ทำให้ฉันสมการวลีหลักเป็นเมทริกซ์แบบอสมมาตรจริง ในกรณีที่ไม่ขึ้นกับเวลาสมการหลักจะถูกแก้ไขโดยการแจกแจงเมทริกซ์นี้ ในกรณีที่ขึ้นอยู่กับเวลามันจะต้องมีการรวม ฉันเกี่ยวข้องกับความเป็นอิสระเวลาเท่านั้นในขณะนี้

เมื่อมองไปที่รูทีนย่อยต่างๆฉันคิดว่าฉันควรจะเรียก ( ? gehrd , orghr , hseqr ... ) มันไม่ชัดเจนว่ามันจะง่ายกว่าที่จะใช้เมทริกซ์จากreal*8ถึงcomplex*16และดำเนินการตามรูทีนเวอร์ชันคู่ที่ซับซ้อนเหล่านี้ หรือติดกับreal*8และใช้การเพิ่มจำนวนของอาร์เรย์ของฉันและสร้างเมทริกซ์ที่ซับซ้อนของพวกเขาในภายหลัง

ดังนั้นฉันควรจะเรียกรูทีนใด (และในลำดับใด) และฉันควรใช้เวอร์ชันสองเท่าจริงหรือเวอร์ชันสองซับซ้อน? ด้านล่างนี้เป็นความพยายามในการทำเช่นนี้กับเวอร์ชันสองเท่าจริง 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

คำตอบ:


8

ก่อนอื่นฉันจะคิดว่ายากจริง ๆ หรือไม่ว่าเมทริกซ์นั้นเป็นกฎเกณฑ์ที่สมบูรณ์จริง ๆ หรือไม่: มีการเปลี่ยนแปลงอะไรบ้างที่จะทำให้เฮอร์มีเนี่ยน? ฟิสิกส์รับประกันได้หรือไม่ว่าเมทริกซ์ควรจะเป็นเส้นทแยงมุม

หากปรากฎว่าไม่มีความสมมาตรในการใช้ประโยชน์จริง ๆ คุณควรเริ่มต้นด้วยการอ่านวิธีที่น่าสงสัยในการคำนวณเมทริกซ์เอกซ์โปเนนเชียลซึ่งเป็นการอ้างอิงมาตรฐาน (และเขียนโดยผู้เขียน MATLAB และผู้เขียนร่วมของ G & vL) .


1
2×24×4

1
ฉันชอบคำตอบนี้ กรณีที่ไม่สมมาตรมีข้อผิดพลาดเพียงพอที่ควรพิจารณาหากอาจมีการกำหนดปัญหาของคุณที่นำไปสู่การฝึกอบรมแบบสมมาตรแทนที่จะเป็นแบบไม่สมมาตร
JM

@ MarkS.Everitt: คุณเกือบจะอยู่ที่นั่น ... เมทริกซ์ใหญ่แค่ไหน? ~ 36 x 36 อีกครั้ง?
Jack Poulson

16×1636×36

2
@ MarkS.Everitt: ดังนั้นปัญหาของคุณได้อย่างมีประสิทธิภาพในขณะนี้เป็นเพียงวิธีการอธิบายการฝึกอบรม 4x4 สิ่งนี้มีขนาดเล็กเพียงพอสำหรับการวิเคราะห์เชิงความรู้สึกที่ไม่เกี่ยวข้องดังนั้นคำตอบจะขึ้นอยู่กับค่าทั้งหมด ฉันไม่สามารถพูดได้อีกต่อไปเว้นแต่คุณจะแปลโพสต์ฟิสิกส์ที่เชื่อมโยงของคุณเป็นพีชคณิตเชิงเส้น (Superoperator คืออะไร?!?)
Jack Poulson

7

เพื่อสร้างสิ่งที่แจ็คได้กล่าวไว้วิธีการมาตรฐานที่ดูเหมือนว่าจะใช้ในซอฟต์แวร์ (เช่น EXPOKIT ที่กล่าวถึงในคำถามก่อนหน้านี้) เป็นการปรับขนาดและการยกกำลังสองตามด้วยการประมาณPadé (วิธีที่ 2 และ 3) หรือวิธีการย่อย Krylov 20) โดยเฉพาะอย่างยิ่งหากคุณกำลังมองหาผู้รวมระบบแบบเอ็กซ์โพเนนเชียลคุณจะต้องพิจารณาวิธีการที่สเปซย่อยของ Krylov และดูเอกสารเกี่ยวกับการรวมตัวแบบเอ็กซ์โปเนนเชียล (การอ้างอิงบางอย่างระบุไว้พร้อมกับวิธีที่ 20

หากคุณรู้สึกแย่กับการใช้ eigenvector ลองใช้ระบบสามเหลี่ยมของ eigenvector (วิธีที่ 15) เนื่องจากเมทริกซ์ของคุณอาจไม่สามารถปรับเปลี่ยนได้วิธีนี้อาจไม่ดีที่สุด แต่เป็นการดีกว่าการลองคำนวณค่าลักษณะเฉพาะและค่าลักษณะเฉพาะโดยตรง (เช่นวิธีที่ 14)

การลดลงของแบบฟอร์ม Hessenberg ไม่ใช่ความคิดที่ดี (วิธีที่ 13)

ไม่ชัดเจนสำหรับฉันว่าคุณจะได้รับบริการดีกว่าด้วยเลขคณิตจริงหรือแบบซับซ้อนเนื่องจากเลขคณิตเชิงซ้อนของ Fortran นั้นเร็ว แต่อาจล้น / อันเดอร์โฟล์ล (ดู"คอมไพเลอร์ Fortran จะดีกว่ากันมากแค่ไหน?" )

คุณสามารถเพิกเฉยวิธีที่ 5-7 ได้อย่างปลอดภัย (วิธีการแก้ปัญหา ODE ไม่มีประสิทธิภาพ), วิธีที่ 8-13 (แพง), วิธีที่ 14 (การคำนวณ eigenvectors ของเมทริกซ์ขนาดใหญ่นั้นทำได้ยากโดยไม่มีโครงสร้างพิเศษและมีแนวโน้มที่จะเกิดข้อผิดพลาดเชิงตัวเลขในกรณีที่ป่วย และวิธีที่ 16 (การคำนวณการสลายตัวของจอร์แดนของเมทริกซ์นั้นไม่เสถียรเชิงตัวเลข) วิธีที่ 17-19 ยากที่จะนำไปใช้ โดยเฉพาะอย่างยิ่งวิธีการที่ 17 และ 18 จะต้องอ่านเพิ่มเติม วิธีที่ 1 เป็นตัวเลือกการถอยกลับสำหรับการปรับขนาดและการยกกำลังสองหากการประมาณของPadéทำงานได้ไม่ดี

Bj

Bj=γjI+Ej,

γjjEj


1
O(n2)O(n3)

ไม่ต้องสงสัยเลยว่าพวกเขารู้ว่ากำลังทำอะไรอยู่ ฉันไม่กังวลเกี่ยวกับการนำ LAPACK ไปใช้ ฉันประหลาดใจมากขึ้นเกี่ยวกับพฤติกรรมของคอมไพเลอร์ Fortran
Geoff Oxberry

2
ใช่คอมไพเลอร์อาจมีปัญหามากกว่า LAPACK ที่เขียนได้ดี มันอาจเป็นเรื่องอึกทึกที่พบว่าโปรแกรมของคุณล้มเหลวเพียงเพราะการใช้งานสำหรับค่าสัมบูรณ์และการหารที่คอมไพเลอร์ใช้นั้นถูกทำให้เรียบร้อย ...
JM

-1

ฉันมีรูทีนย่อย Fortran ง่าย ๆ ที่คำนวณเลขชี้กำลังของเมทริกซ์โดยพลการ ฉันตรวจสอบกับคำสั่ง Matlab แล้วและก็ใช้ได้ มันขึ้นอยู่กับการปรับขนาดและกำลังสอง ฉันเขียนมันเมื่อไม่กี่ปีก่อน

ฉันต้องการครีบรูทีนย่อยอื่นเช่นที่ฉันดาวน์โหลดจาก gams.nist.gov แต่ยังไม่มีโชค

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.