Saya telah menulis toolbox sistem kontrol dari awal dan murni di Python3 (plug shameless:) harold
. Dari penelitian saya sebelumnya, saya selalu mengeluh tentang pemecah Riccati care.m
karena alasan teknis / tidak relevan.
Karenanya, saya telah menulis serangkaian rutinitas saya sendiri. Satu hal yang saya tidak dapat menemukan jalan keluar adalah untuk mendapatkan algoritma penyeimbangan kinerja tinggi, setidaknya sebaik balance.m
. Sebelum Anda menyebutkannya, xGEBAL
keluarga terpapar dalam Scipy dan pada dasarnya Anda dapat memanggil dari Scipy sebagai berikut, misalkan Anda memiliki array 2D tipe 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 )
Sekarang jika saya menggunakan matriks tes berikut
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. ]])
saya mendapat
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. ]])
Namun, jika saya meneruskan ini balance.m
, saya mengerti
>> 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
Jika Anda memeriksa pola permutasi, mereka sama namun penskalaannya tidak aktif. gebal
memberikan kerak kesatuan sedangkan Matlab memberikan kekuatan berikut 2: [-5,0,8,0,2]
.
Jadi ternyata, ini tidak menggunakan mesin yang sama. Saya sudah mencoba berbagai opsi seperti Lemonnier, Van Dooren skala dua sisi, Parlett-Reinsch asli dan juga beberapa metode lain yang kurang dikenal dalam literatur seperti versi padat SPBALANCE
.
Satu hal yang mungkin saya tekankan adalah bahwa saya sadar akan pekerjaan Benner; khususnya Balancing Matriks Hamiltonian Symplectic khusus untuk tujuan ini. Namun, perhatikan bahwa jenis perawatan ini dilakukan di dalam gcare.m
(solver Riccati umum) dan penyeimbangan dilakukan secara langsung melalui balance.m
. Karena itu, saya akan sangat menghargai jika seseorang dapat mengarahkan saya ke implementasi yang sebenarnya.
Pengungkapan: Saya benar-benar tidak berusaha untuk membalikkan kode matematika insinyur: Saya benar-benar ingin menjauh darinya karena berbagai alasan termasuk motivasi dari pertanyaan ini, yaitu, saya tidak tahu apa yang dilakukannya yang membuat saya harus mengeluarkan banyak biaya waktu kembali pada hari itu. Tujuan saya adalah untuk mendapatkan algoritma balancing yang memuaskan yang memungkinkan saya untuk lulus contoh CAREX sehingga saya dapat menerapkan metode iterasi Newton di atas pemecah reguler.