Thuật toán cân bằng ma trận


9

Tôi đã viết một hộp công cụ hệ thống điều khiển từ đầu và hoàn toàn bằng Python3 (plugin không biết xấu hổ harold:). Từ nghiên cứu trước đây của tôi, tôi luôn phàn nàn về người giải Riccati care.mvì những lý do kỹ thuật / không liên quan.

Do đó, tôi đã viết ra các thói quen của riêng mình. Một điều tôi không thể tìm ra cách để có được một thuật toán cân bằng hiệu suất cao, ít nhất là tốt như balance.m. Trước khi bạn đề cập đến nó, xGEBALgia đình được hiển thị trong Scipy và về cơ bản bạn có thể gọi từ Scipy như sau, giả sử bạn có một mảng 2D kiểu float 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 )

Bây giờ nếu tôi sử dụng ma trận kiểm tra sau

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.      ]])

tôi có

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.      ]])

Tuy nhiên, nếu tôi chuyển cái này cho balance.m, tôi nhận được

>> 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

Nếu bạn kiểm tra các mẫu hoán vị, chúng giống nhau tuy nhiên tỷ lệ bị tắt. gebalcung cấp tỷ lệ thống nhất trong khi MATLAB cho các quyền hạn sau 2 : [-5,0,8,0,2].

Vì vậy, rõ ràng, đây không phải là sử dụng cùng một máy móc. Tôi đã thử nhiều lựa chọn khác nhau như Lemonnier, Van Dooren chia tỷ lệ hai mặt, Parlett-Reinsch ban đầu và một số phương pháp ít được biết đến khác trong tài liệu như phiên bản dày đặc SPBALANCE.

Một điểm có lẽ tôi có thể nhấn mạnh là tôi nhận thức được công việc của Benner; đặc biệt là Cân bằng Symplectic của Ma trận Hamilton đặc biệt cho mục đích này. Tuy nhiên, lưu ý rằng loại điều trị này được thực hiện trong gcare.m(bộ giải Riccati tổng quát) và việc cân bằng được thực hiện trực tiếp thông qua balance.m. Do đó, tôi sẽ đánh giá cao nếu ai đó có thể chỉ cho tôi thực hiện thực tế.


Tiết lộ: Tôi thực sự không cố gắng đảo ngược mã kỹ sư toán học: Tôi thực sự muốn thoát khỏi nó vì nhiều lý do bao gồm cả động lực của câu hỏi này, nghĩa là, tôi không biết nó đang làm gì khiến tôi phải trả giá của thời gian trở lại trong ngày. Ý định của tôi là có được một thuật toán cân bằng thỏa đáng cho phép tôi vượt qua các ví dụ CAREX để tôi có thể thực hiện các phương pháp lặp Newton trên đầu bộ giải thông thường.

Câu trả lời:


7

Mất khá nhiều thời gian để tìm ra điều này và như thường lệ, nó trở nên rõ ràng sau khi bạn tìm ra thủ phạm.

Sau khi kiểm tra các trường hợp có vấn đề được báo cáo trong David S. Watkins. Một trường hợp cân bằng có hại. Điện tử. Dịch. Số. Phân tích, 23: 1 Ném4, 2006 và cũng là cuộc thảo luận ở đây (cả hai được trích dẫn trong arXiv: 1401.5766v1 ), hóa ra matlab sử dụng cân bằng bằng cách tách các phần tử đường chéo trước.

Suy nghĩ ban đầu của tôi là, theo tài liệu giới hạn cổ điển về các chức năng LAPACK, GEBAL đã thực hiện việc này một cách tự động. Tuy nhiên, tôi đoán ý nghĩa của các tác giả bằng cách bỏ qua các yếu tố đường chéo là không loại bỏ chúng khỏi tổng hàng / cột.

Trong thực tế, nếu tôi tự xóa đường chéo khỏi mảng, thì cả hai kết quả đều trùng khớp, đó là

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 )  

cho kết quả tương tự như balance.m(tất nhiên không có các mục chéo).

Nếu bất kỳ người dùng Fortran-savy nào có thể xác nhận điều này bằng cách kiểm tra doltal.f , tôi sẽ rất biết ơn.

EDIT: Kết quả trên không có nghĩa là đây là sự khác biệt duy nhất. Tôi cũng đã xây dựng các ma trận khác nhau trong đó GEBAL và thăng bằng tạo ra các kết quả khác nhau ngay cả sau khi các đường chéo được tách ra.

Tôi khá tò mò về sự khác biệt có thể là gì nhưng dường như không có cách nào để biết vì nó là một MATLAB tích hợp và do đó đóng mã.

EDIT2 : Hóa ra MATLAB đã sử dụng phiên bản LAPACK cũ hơn (có thể là trước 3.5.0) và đến năm 2016b, chúng dường như được nâng cấp lên phiên bản mới hơn. Bây giờ kết quả đồng ý như tôi có thể kiểm tra. Vì vậy, tôi nghĩ rằng giải quyết vấn đề. Tôi nên đã thử nó với các phiên bản LAPACK cũ hơ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.