2013-08-27 12 views
5

Próbuję oszacować parametry filtra nieliniowego za pomocą fmincon w MATLAB Optimization Toolboox, utrzymując wartości własne macierzy równań stanu mniej niż jeden. Dokumentacja dla fmincon przy użyciu algorytmu "sqp" mówi, że respektuje ograniczenia we wszystkich iteracjach, a jednak na samym początku iteracji mojego kodu próbuje punktu sugerującego niestabilne wartości własne. Nie mogę uruchomić filtra przy tych wartościach parametrów, więc mój kod ulega awarii.jak wykonać ograniczenia honorowe Fmincon na każdym etapie?

Czy dokumentacja rzeczywiście oznacza, że ​​"AlwaysHonorConstraints" ma zastosowanie tylko do ograniczeń nierówności przekazywanych jako wektory (lb i ub)? Czy jest jakiś sposób, aby upewnić się, że ograniczenia nieliniowe są spełnione na każdym etapie?

Oto odnośny fragment mojego kodu:

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

Dzięki!

+1

Kiedy mówisz "na początku iteracji mojego kodu, próbuje punktu oznaczającego niestabilne wartości własne" masz na myśli pierwszą iterację 'fmincon' używając' x0'? Czy próbowałeś różnych wartości początkowych? Do czego służy opcja 'x0'? – user1884905

Odpowiedz

2

The documentation rzeczywiście stwierdza, że ​​opcja 'AlwaysHonorConstraints' dotyczy związanych jedynie ograniczeń, więc lb i ub. Innymi słowy, fmincon uważa całą domenę [lb ub] za możliwy region i ignoruje wszelkie ograniczenia liniowe i nieliniowe.

Całkiem jakiś czas temu napisałem optimize, który jest oparty na fminsearch i jest dostępny on the file exchange. Teraz, to było dawno temu, więc mogę się pomylić, ale pamiętam implementację opcji ('superstrict'), która pozwala uniknąć oszacowania funkcji celu poza możliwym regionem, , włączając w to ograniczenia liniowe i nieliniowe. Możesz spróbować.

Ale trzymanie się fmincon, możliwym rozwiązaniem jest modyfikowanie unscented_kalman1 taki sposób, aby obejmować sankcje:

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 

To sprawia, że ​​możliwe do uruchomienia filtra, ale Zwracanie dużo wyższą wartość dla celu działa, gdy ograniczenia są zerwane. To "zmusza" fmincon do możliwego do wykonania regionu.

Należy jednak pamiętać, że stosowana funkcja kar nie wprowadza nieciągłości. Coś jak

y = y + 1e8*c; 

nie będzie odpowiadało, bo jeśli y jest tylko wewnątrz regionu wykonalnym, zwracana wartość jest tylko y, ale jeśli potem tylko poza regionem w następnej iteracji, to będzie nagle podskoczył o milionów. Jest to problematyczne, ponieważ SQP w fmincon wykorzystuje pierwszą i drugą pochodną y, która również zwraca się do milionów w sąsiedztwie nieciągłości, powodując zerwanie kolejnej iteracji.

Powiązane problemy