2013-08-27 15 views
5

MATLAB Optimizasyon Toolboox'unda fmincon kullanarak lineer olmayan bir filtrenin parametrelerini tahmin etmeye çalışıyorum, durum denklem matrisinin özdeğerini birden az tutuyor. 'Sqp' algoritmasını kullanan fmincon için kullanılan belgeler, tüm yinelemelerde kısıtlamalara saygılı olduğunu ve kodumun ilk yinelemesinde kararsız özdeğerleri işaret eden bir nokta denediğini söylüyor. Filtreyi bu parametre değerlerinde kullanamıyorum ve kodum çöküyor.Her adımda fmincon onur kısıtlamaları nasıl yapılır?

Dokümantasyon gerçekten 'AlwaysHonorConstraints' ifadesinin yalnızca vektörler (lb ve ub) olarak geçirilen eşitsizlik kısıtlamaları için geçerli olduğu anlamına mı geliyor? Lineer olmayan kısıtlamaların her adımda tatmin edildiğinden emin olmanın bir yolu var mı?

c = @(x) max(abs(eig(reshape(x(8:16), 3, 3)))) - 1; 
ceq = @(x) [];     
nonlcon = @(x) deal(c(x), ceq(x)); 

obj = @(x) -unscented_kalman1(x, fulldiv, crsp_allEverything); 

fminconOptions = optimset('Display', 'iter-detailed', 'Algorithm', 'sqp', ... 
'TolX', errTol, 'UseParallel', 'always', 'AlwaysHonorConstraints', 'bounds'); 

maxX = fmincon(obj, x0, [], [], [], [], [], [], nonlcon, fminconOptions); 

Teşekkür:

İşte benim kod alakalı parçasıdır!

+1

"Kodumun ilk yinelemesinde dengesiz özdeğerleri işaret eden bir nokta deniyor" derken, "x0" kullanarak fmincon'un ilk yinelemesini mi kastediyorsunuz? Farklı başlangıç ​​değerlerini denediniz mi? X0’yi neye ayarlıyorsunuz? – user1884905

cevap

2

The documentation gerçekten 'AlwaysHonorConstraints' seçenek yüzden, sadece bağlı kısıtlamalara lb ve ub geçerli olduğunu belirtmektedir. Diğer bir deyişle, fmincon, tüm etki alanını [lb ub] uygun alan olarak kabul eder ve tüm doğrusal ve doğrusal olmayan kısıtlamaları yok sayar.

Biraz önce, fminsearch tabanlı optimize yazdım ve on the file exchange kullanılabilir. Şimdi, çok uzun bir süre önce, bu yüzden yanlış tahmin edebilirim, ancak herhangi bir doğrusal ve doğrusal olmayan kısıtlamalar dahil olmak üzere, objektif işlevinin değerlendirilmesini engelleyen bir seçeneği ('superstrict') uygulayarak hatırlıyorum. Bunu denemek isteyebilirsiniz.

function unscented_kalman1(x, ...) 

    %// evaluate constraint (yes, also here, unfortunately) 
    c = @(x) max(abs(eig(reshape(x,2,2)))) - 1; 
    penalties = c > 0; 

    %// modify x by thresholding 
    if penalties   
     x = ... %// [MODIFY x SUCH THAT IT LIES INSIDE THE FEASIBLE REGION] 
    end 

    %// ... remainder of the function here 

    %// then finally: 
    y = ... %// [THE OUTCOME OF THE FUNCTION]; 

    if penalties 
     y = y + c.^3; %// ...or something similar 
    end 

end 

Bu filtreyi çalıştırmak mümkün kılar, ancak hedefi için bir çok yüksek bir değer dönen:

Ama fmincon yapışmasını olası bir geçici çözüm unscented_kalman1 böyle kapsayacak cezaları değiştirmektir Kısıtlamalar bozulduğunda işlev görür. Bu, fmincon'u uygun bölgeye "zorlar".

Kullandığınız ceza işlevi, süreksizliğe neden olmamasına dikkat edin.

y uygulanabilir bölgenin iç sadece ise çünkü döndürülen değer, sadece y olduğunu uygundur ama olmaz

y = y + 1e8*c; 
eğer o zaman sadece sonraki tekrarında bölgenin dışında, o olacak gibi bir şey aniden milyon'a atlayın. Bu sorunludur, çünkü fmincon'daki SQP, y'un birinci ve ikinci türevlerini kullanmaktadır, ki bu da bir sonraki yinelemeyi bertaraf eden bir süreksizlik mahallinde milyonlara dönmektedir.

İlgili konular