Matris Dengeleme Algoritması


9

Sıfırdan ve tamamen Python3 (utanmaz fiş:) bir kontrol sistemi araç kutusu yazıyorum harold. Geçmişteki araştırmamdan, Riccati çözücüsü hakkında her zaman care.mteknik / alakasız nedenlerden dolayı şikayetlerim var .

Bu yüzden kendi rutinlerimi yazıyorum. Bir yol bulamadığım bir şey, en azından kadar iyi bir yüksek performanslı dengeleme algoritması elde etmektir balance.m. Bahsetmeden önce, xGEBALaile Scipy'de ortaya çıkar ve temel olarak Scipy'den aşağıdaki gibi çağrı yapabilirsiniz, şamandıra tipi bir 2D diziniz olduğunu varsayalım 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 )

Şimdi aşağıdaki test matrisini kullanırsam

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

alırım

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

Ancak, bunu geçersem 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

Permütasyon kalıplarını kontrol ederseniz, bunlar aynıdır ancak ölçeklendirme kapalıdır. gebalbirlik ölçeklendirmesi verirken matlab 2 [-5,0,8,0,2].

Görünüşe göre, bunlar aynı makineleri kullanmıyor. Lemonnier, Van Dooren iki taraflı ölçekleme, orijinal Parlett-Reinsch ve ayrıca literatürde yoğun versiyonu gibi daha az bilinen diğer yöntemler gibi çeşitli seçenekler denedim SPBALANCE.

Belki vurgulayabileceğim bir nokta, Benner'in çalışmalarının farkında olduğumdur; özellikle de bu amaç için özel olarak Hamilton Matrislerinin Sezgisel Dengelenmesi . Bununla birlikte, bu tip tedavinin gcare.m(genelleştirilmiş Riccati çözücü) içinde yapıldığını ve dengelemenin doğrudan yoluyla yapıldığını unutmayın balance.m. Bu nedenle, birisinin beni gerçek uygulamaya yönlendirip yönlendiremeyeceğini takdir ediyorum.


Açıklama: Gerçekten mühendislik matematik kodunu tersine çevirmeye çalışmıyorum: Aslında bu sorunun motivasyonu da dahil olmak üzere çeşitli nedenlerle ondan kurtulmak istiyorum, yani bana ne kadar pahalıya mal olduğunu bilmiyorum gün içinde geri döndü. Amacım, Newton yineleme yöntemlerini normal çözücünün üstüne uygulayabileceğim şekilde CAREX örneklerini geçmeme izin veren tatmin edici bir dengeleme algoritması elde etmektir.

Yanıtlar:


7

Bunu anlamaya oldukça zaman ayırdım ve her zamanki gibi suçluyu bulduktan sonra belirginleşiyor .

David S. Watkins bildirilen sorunlu vakaları kontrol ettikten sonra . Dengelemenin zararlı olduğu bir durum. Elektron. Trans. Numer. Anal, 23: 1–4, 2006 ve ayrıca buradaki tartışma (her ikisi de arXiv: 1401.5766v1'de alıntılanmıştır ), matlab'ın önce diyagonal elemanları ayırarak dengelemeyi kullandığı ortaya çıkıyor.

İlk düşüncem, LAPACK fonksiyonları hakkındaki klasik sınırlı belgelere göre GEBAL bunu otomatik olarak gerçekleştirdi. Ancak, köşegen öğeleri yok sayarak yazarların ne anlama geldiğini sanıyorum , satır / sütun toplamlarından çıkarmıyorlar.

Aslında, çaprazlamayı diziden manuel olarak kaldırırsam, her iki sonuç çakışır, yani

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 )  

aynı sonucu verir balance.m(tabii ki köşegen girişleri olmadan).

Herhangi bir Fortran meraklısı kullanıcı dgebal.f'yi kontrol ederek bunu onaylayabilirse , minnettar olurum.

DÜZENLEME: Yukarıdaki sonuç, bunun tek fark olduğu anlamına gelmez. GEBAL ve balance.m'nin köşegenler ayrıldıktan sonra bile farklı sonuçlar ürettiği farklı matrisler de oluşturdum.

Farkın ne olabileceğini oldukça merak ediyorum ama bir matlab yerleşik ve dolayısıyla kapalı kod olduğu için bilmenin bir yolu yok gibi görünüyor.

EDIT2 : Matlab'ın eski bir LAPACK sürümü (muhtemelen 3.5.0 öncesi) kullandığı ortaya çıkıyor ve 2016b'ye göre daha yeni sürüme yükseltilmiş gibi görünüyor. Şimdi sonuçlar test edebildiğim kadar uyumlu. Bence bu sorunu çözüyor. Eski LAPACK sürümleriyle test etmeliydim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.