อัลกอริทึมสมดุลเมทริกซ์


9

ฉันได้รับการเขียนกล่องเครื่องมือระบบการควบคุมจากรอยขีดข่วนและหมดจดใน Python3 (เสียบด้านหน้า: harold) จากการวิจัยที่ผ่านมาของฉันฉันมักจะบ่นเกี่ยวกับนักแก้ปัญหา Riccati care.mด้วยเหตุผลที่เป็นเทคนิค / ไม่เกี่ยวข้อง

ดังนั้นฉันได้เขียนชุดคำสั่งของตัวเอง balance.mสิ่งหนึ่งที่ผมไม่สามารถหาวิธีรอบคือการได้รับขั้นตอนวิธีการสมดุลและมีประสิทธิภาพสูงอย่างน้อยดีเท่า ก่อนที่คุณจะพูดถึงมันxGEBALในครอบครัวเป็นที่เปิดเผยใน SciPy และคุณโดยทั่วไปสามารถโทรจาก SciPy ดังต่อไปนี้สมมติว่าคุณมีชนิดลอย 2D อาร์เรย์A:

import scipy as sp
gebal = sp.linalg.get_lapack_funcs(('gebal'),(A,)) # this picks up DGEBAL
Ab, lo, hi, scaling , info = gebal(A, scale=1 , permute=1 , overwrite_a=0 )

ตอนนี้ถ้าฉันใช้เมทริกซ์ทดสอบต่อไปนี้

array([[ 6.      ,  0.      ,  0.      ,  0.      ,  0.000002],
       [ 0.      ,  8.      ,  0.      ,  0.      ,  0.      ],
       [ 2.      ,  2.      ,  6.      ,  0.      ,  0.      ],
       [ 2.      ,  2.      ,  0.      ,  8.      ,  0.      ],
       [ 0.      ,  0.      ,  0.000002,  0.      ,  2.      ]])

ฉันเข้าใจ

array([[ 8.      ,  0.      ,  0.      ,  2.      ,  2.      ],
       [ 0.      ,  2.      ,  0.000002,  0.      ,  0.      ],
       [ 0.      ,  0.      ,  6.      ,  2.      ,  2.      ],
       [ 0.      ,  0.000002,  0.      ,  6.      ,  0.      ],
       [ 0.      ,  0.      ,  0.      ,  0.      ,  8.      ]])

อย่างไรก็ตามถ้าฉันผ่านสิ่งนี้ไปbalance.mฉันจะได้รับ

>> balance(A)

ans =

    8.0000         0         0    0.0625    2.0000
         0    2.0000    0.0001         0         0
         0         0    6.0000    0.0002    0.0078
         0    0.0003         0    6.0000         0
         0         0         0         0    8.0000

หากคุณตรวจสอบรูปแบบการเรียงสับเปลี่ยนพวกเขาจะเหมือนกัน แต่การปรับขนาดจะปิด gebalให้ scalings ความสามัคคีในขณะ MATLAB ให้อำนาจดังต่อไปของ [-5,0,8,0,2]2:

เห็นได้ชัดว่าสิ่งเหล่านี้ไม่ได้ใช้เครื่องจักรเดียวกัน ฉันได้พยายามตัวเลือกต่างๆเช่น Lemonnier แวน Dooren สองปรับด้านเดิม Parlett-Reinsch และยังมีบางวิธีน้อยอื่น ๆ SPBALANCEที่รู้จักในวรรณคดีเช่นรุ่นหนาแน่น

มีอยู่ช่วงหนึ่งที่ฉันอาจจะเน้นว่าฉันตระหนักถึงงานของเบ็นเนอร์ โดยเฉพาะSymplectic Balancing ของ Hamiltonian Matricesโดยเฉพาะเพื่อจุดประสงค์นี้ อย่างไรก็ตามทราบว่าประเภทของการรักษานี้จะทำภายในgcare.m(generalized แก้ Riccati) balance.mและความสมดุลจะทำโดยตรงผ่านทาง ดังนั้นฉันจะขอบคุณถ้ามีคนชี้ให้ฉันไปสู่การปฏิบัติจริง


การเปิดเผยข้อมูล: ฉันไม่ได้พยายามที่จะย้อนกลับรหัสทางคณิตศาสตร์ของคณิตศาสตร์: ฉันต้องการที่จะหนีจากมันด้วยเหตุผลหลายประการรวมถึงแรงจูงใจของคำถามนี้คือการพูดว่าฉันไม่รู้ว่ามันทำอะไร ย้อนเวลากลับไปในวันนั้น ความตั้งใจของฉันคือการได้อัลกอริธึมการสร้างสมดุลที่น่าพอใจซึ่งทำให้ฉันสามารถส่งตัวอย่าง CAREX เพื่อให้ฉันสามารถใช้วิธีการวนซ้ำแบบนิวตันที่อยู่ด้านบนของตัวแก้ไขแบบปกติ

คำตอบ:


7

เอาฉันสักครู่เพื่อคิดออกและตามปกติจะเห็นได้ชัดหลังจากที่คุณพบผู้กระทำผิด

หลังจากตรวจสอบกรณีที่มีปัญหาที่รายงานใน David S. Watkins กรณีที่การทรงตัวเป็นอันตราย อิเล็กตรอน. ทรานส์ numer Anal, 23: 1–4, 2006 และการสนทนาที่นี่ (ทั้งคู่ถูกอ้างถึงในarXiv: 1401.5766v1 ) ปรากฎว่า matlab ใช้การทรงตัวโดยการแยกองค์ประกอบในแนวทแยงก่อน

ความคิดเริ่มต้นของฉันคือตามเอกสารที่ จำกัด แบบคลาสสิกในฟังก์ชั่น LAPACK, GEBAL ดำเนินการนี้โดยอัตโนมัติ อย่างไรก็ตามฉันเดาว่าผู้เขียนหมายถึงอะไรโดยไม่คำนึงถึงองค์ประกอบในแนวทแยงนั้นไม่ได้ลบออกจากผลรวมของแถว / คอลัมน์

ในความเป็นจริงถ้าฉันลบเส้นทแยงมุมออกจากอาร์เรย์ด้วยตนเองผลลัพธ์ทั้งสองตรงกันนั่นคือ

import scipy as sp
gebal = sp.linalg.get_lapack_funcs(('gebal'),(A,)) # this picks up DGEBAL
Ab, lo, hi, scaling , info = gebal(A - np.diag(np.diag(A)), scale=1 , permute=1 , overwrite_a=0 )  

ให้ผลเหมือนกับbalance.m(โดยไม่มีเส้นทแยงมุมแน่นอน)

หากผู้ใช้ Fortran-savy คนใดสามารถยืนยันสิ่งนี้ได้โดยการตรวจสอบdgebal.fฉันจะขอบคุณ

แก้ไข:ผลลัพธ์ข้างต้นไม่ได้หมายความว่านี่เป็นความแตกต่างเพียงอย่างเดียว ฉันได้สร้างเมทริกซ์ที่แตกต่างกันซึ่ง GEBAL และ balance.m ให้ผลลัพธ์ที่แตกต่างกันแม้ว่าจะแยกจากกันในแนวทแยงมุม

ฉันค่อนข้างอยากรู้อยากเห็นความแตกต่างอาจเป็น แต่ดูเหมือนว่าไม่มีทางรู้เพราะเป็น MATLAB ในตัวและด้วยเหตุนี้รหัสปิด

แก้ไข 2 : ปรากฎว่า matlab ใช้ LAPACK รุ่นเก่ากว่า (อาจเป็นก่อน 3.5.0) และภายในปี 2559 ดูเหมือนว่าพวกเขาจะได้รับการอัพเกรดเป็นรุ่นใหม่กว่า ตอนนี้ผลลัพธ์เห็นด้วยเท่าที่ฉันสามารถทดสอบได้ ดังนั้นฉันคิดว่านั่นเป็นปัญหา ฉันควรทดสอบกับ LAPACK เวอร์ชั่นเก่ากว่า

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