เลขชี้กำลังเมทริกซ์ของเมทริกซ์แบบเอียง - เฮอร์มีเชียนที่มี Fortran 95 และ LAPACK


11

ฉันเพิ่งเข้าสู่ Fortran 95 สำหรับการจำลองกลศาสตร์ควอนตัม สุจริตฉันถูกนิสัยเสียโดย Octave ดังนั้นฉันจึงได้รับการยกกำลังเมทริกซ์สำหรับการรับ ที่กำหนด (ขนาดเล็ก ) ลาดเมทริกซ์ -Hermitian ขนาดn × nสิ่งที่เป็นวิธีที่มีประสิทธิภาพมากที่สุดของการใช้ LAPACK ที่จะแก้ปัญหานี้หรือไม่ ฉันไม่ได้ใช้เครื่องห่อหุ้ม LAPACK95 เพียงโทรไปที่ LAPACK โดยตรงn36n×n


2
คุณต้องการเมทริกซ์เลขชี้กำลังด้วยตัวเองหรือคุณต้องการเมทริกซ์เลขชี้กำลังคูณด้วยเวกเตอร์หรือไม่?
เปาโล

@ พอล: ขออภัยไม่เห็นก่อนหน้านี้ ไม่ฉันต้องการเมทริกซ์ทั้งหมด
qubyte

ทำไมบางคนถึงลงคะแนนคำถามนี้ หากคุณลงคะแนนโปรดทิ้งเหตุผลไว้ในความคิดเห็น! บางทีคำถามนี้สามารถปรับปรุงได้ด้วยวิธีนี้
qubyte

เราพึ่งพาDGPADMแต่ที่ Jack Poulson กล่าวว่าอาจมีวิธีที่ดีกว่า
Mike Dunlavey

คำตอบ:


16

เลขชี้กำลังเมทริกซ์ของเมทริกซ์ความเอียง - Hermitian มีราคาถูกเพื่อคำนวณ:

สมมติว่าเป็นเมทริกซ์เอียงของคุณแล้วฉันAคือ Hermitian และผ่านzheevdและเพื่อน ๆ คุณจะได้รับการสลายตัวAiA

iA=UΛUH,

ที่เป็นเมทริกซ์วิคเตอร์รวมกันและΛเป็นจริงและในแนวทแยง จากนั้นเล็กน้อยUΛ

A=U(iΛ)UH.

เมื่อคุณมีและΛแล้วมันง่ายในการคำนวณUΛ

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

โดยการแจกแจงค่าลักษณะเฉพาะครั้งแรกให้ตั้งค่าผ่านzcopyดำเนินการ B : = B exp ( - i Λ )โดยเรียกใช้zscalในแต่ละคอลัมน์ด้วยค่าลักษณะเฉพาะเชิง exponentiated และสุดท้ายตั้งค่าผลลัพธ์ของคุณเป็นB:=UB:=Bexp(iΛ)

exp(A):=BUH

ผ่านzgemm


ขอบคุณ! ฉันพลาดเคล็ดลับที่ชัดเจนกับiฉันคุณนำฉันไปสู่รูทีนย่อย LAPACK เฉพาะที่ฉันต้องการขอบคุณมากสำหรับสิ่งนั้น ฉันยังไม่ได้ทำเครื่องหมายว่าถูกต้อง (ต้องการทดสอบก่อน)
qubyte

1
ไม่รีบ. ก่อนหน้านี้ฉันเคยติดตั้งใช้งานจริงดังนั้นฉันค่อนข้างมั่นใจ :-)
Jack Poulson

นี่จะเป็นส่วนหนึ่งของรหัสขลังที่ฉันใช้ไปทั่ว สำหรับสิ่งที่คุ้มค่าฉันจะใส่คำขอบคุณไว้ในบรรทัดความคิดเห็นที่อาจไม่มีใครเห็น
qubyte

2
@ JackPoulson: เล่นได้ดีครับ นี่คือสิ่งที่ฉันได้รับสำหรับการเลือกวิชาเอกที่ไม่เชื่อในจำนวนจินตภาพ (นอกเหนือจากค่าลักษณะเฉพาะ)
Geoff Oxberry

1
@JackPoulson: มันใช้งานได้อย่างสวยงาม ขอบคุณอีกครั้งสำหรับสิ่งนี้ โดยเฉพาะอย่างยิ่งบิต zscal ฉันมีรหัสที่เหลืออยู่ในรูทีนย่อยอื่น แต่นี่คือสิ่งที่ฉันมองข้าม
qubyte

5

เนื่องจากฉันใช้โทรศัพท์ฉันไม่สามารถเชื่อมโยงสิ่งต่าง ๆ ได้ง่ายและจะเพิ่มลิงก์ในภายหลัง คุณอาจต้องการดูกระดาษ "19 วิธีที่น่าสงสัยในการคำนวณเมทริกซ์เอกซ์โพเนนเชียล", ห้องสมุด Fortran EXPOKIT, กระดาษของ Jitse Niesen ในวิธี Krylov สำหรับการคำนวณเลขยกกำลังของเมทริกซ์และเอกสารล่าสุดของนิก เป็นเรื่องปกติที่ต้องใช้ผลิตภัณฑ์ของเมทริกซ์เลขชี้กำลังและเวกเตอร์มากกว่าเมทริกซ์เลขชี้กำลังเพียงอย่างเดียวและที่นี่วิธี Krylov อาจมีประโยชน์มาก สำหรับเมทริกซ์ที่มีขนาดเล็กและหนาแน่นเช่นเดียวกับที่คุณอธิบายวิธีการของPadéอาจดีกว่า แต่ฉันประสบความสำเร็จอย่างมากกับวิธี Krylov เมื่อใช้ภายในวิธีเลขชี้กำลังสำหรับการรวมเชิงตัวเลขของ ODE


ขอบคุณ ฉันตระหนักถึง19 วิธีที่น่าสงสัยและ expokit แต่บางคนที่ฉันทำงานด้วยอยู่ในอุตสาหกรรมดังนั้นฉันต้องการหลีกเลี่ยงด้วยเหตุผลทางลิขสิทธิ์ ฉันกระตือรือร้นที่จะใช้มันกับ LAPACK / BLAS เนื่องจากฉันเชื่อมโยงไปยังห้องสมุดเหล่านี้แล้ว สิ่งหนึ่งที่แม้ว่า; ฉันต้องการเมทริกซ์เลขชี้กำลังแทนตัวเอง ฉันกำลังทำงานเกี่ยวกับการแปรปรวนของเอกซ์เรย์กระบวนการควอนตัมและกระบวนการที่เป็นปัญหานั้นเป็นตัวเป็นตนโดยเมทริกซ์ ต่อมาฉันจะติดต่อกับผู้รวมเข้าด้วยกันกับเลขชี้กำลังเลขชี้กำลังนี้ซึ่งก็คือตอนที่มันน่าสนใจจริงๆ!
qubyte

1

วิธีการ eigensolution ที่ซับซ้อนนั้นถูกต้องทางคณิตศาสตร์ แต่มันทำงานได้มากกว่าที่จำเป็น น่าเสียดายที่วิธีการปรับปรุงที่ฉันกำลังจะอธิบายไม่สามารถนำไปใช้กับการโทร LAPACK ได้

Xเป็น

X=UDUT

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

exp(0tt0)=(costsintsintcost)

เมทริกซ์เลขชี้กำลังที่คุณต้องการจะได้รับจากนั้น

exp(X)=Uexp(D)UT

ฉันใช้วิธีนี้ในรหัสเคมีควอนตัมของฉันมาหลายสิบปีและฉันไม่เคยมีปัญหาใด ๆ กับซอฟต์แวร์ใด ๆ ที่เกี่ยวข้อง


สวัสดี @ Ron Shepard และยินดีต้อนรับสู่ Computational Exchange SE คุณสามารถแก้ไขสมการที่สองและสามของคุณได้หรือไม่? พวกเขาเข้าใจยากเล็กน้อย
nicoguaro

0

หากสิ่งที่คุณต้องการคือเมทริกซ์เลขชี้กำลังคูณด้วยเวกเตอร์รูทีนย่อย fortran นี้อาจมีประโยชน์สำหรับคุณบ้าง มันคำนวณ:

(eA)v

โดยที่ v คือเวกเตอร์และ A เป็นเมทริกซ์เฮอร์ทีเมียปกติ มันเป็นรูทีนย่อยจากEXPOKITไลบรารี

มิฉะนั้นคุณอาจต้องการพิจารณารูทีนย่อยนี้ซึ่งใช้ได้กับเมทริกซ์เชิงซ้อนทั่วไป A


ดูเหมือนว่าจะไม่มีการอ้างอิงไปยังไลบรารีของ Fortran
Geoff Oxberry

@GeoffOxberry: ฉันเขียนใหม่เพื่อรวมรูทีนย่อย fortran
Paul

@ พอล: ไม่ดีฉันกลัว สิ่งที่ฉันกำลังทำคือการแปรผันแบบเมทริกซ์ทั้งหมดในเอกซ์เรย์ของกระบวนการ นอกจากความเอียง -Hermitian!
qubyte

ฉันขอขอบคุณที่คุณเขียนคำตอบของคุณใหม่ แต่ดูเหมือนว่าคุณเปลี่ยนคำตอบของคุณอย่างสมบูรณ์โดยใช้องค์ประกอบของคำตอบตามลำดับก่อนหน้าและลิงก์ที่เพิ่มเข้ามา
Geoff Oxberry

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