2013-08-27 8 views
5

Sto provando a stimare i parametri di un filtro non lineare utilizzando fmincon nel toolbox di ottimizzazione MATLAB, mantenendo gli autovalori della matrice di equazioni di stato meno di uno. La documentazione di fmincon che usa l'algoritmo 'sqp' dice che rispetta i vincoli a tutte le iterazioni, eppure alla primissima iterazione del mio codice prova un punto che implica autovalori instabili. Non riesco ad eseguire il filtro con questi valori di parametro, quindi il mio codice si arresta in modo anomalo.come eseguire i vincoli di onore fmincon ad ogni passo?

La documentazione indica realmente che "AlwaysHonorConstraints" si applica solo ai vincoli di disuguaglianza trasmessi come vettori (lb e ub)? Esiste un modo per garantire che i vincoli non lineari siano soddisfatti in ogni fase?

Ecco il pezzo rilevante del mio codice:

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

Grazie!

+1

Quando si dice "alla prima iterazione del mio codice si prova un punto che implica autovalori instabili" si intende la prima iterazione di 'fmincon' usando' x0'? Hai provato diversi valori iniziali? A cosa imposti 'x0'? – user1884905

risposta

2

The documentation afferma, infatti, che l'opzione 'AlwaysHonorConstraints' si applica ai rilegati solo vincoli, in modo lb e ub. In altre parole, fmincon considera l'intero dominio [lb ub] come la regione ammissibile e ignora qualsiasi e tutti i vincoli lineari e non lineari.

Parecchio tempo fa ho scritto optimize, che è basato su fminsearch ed è disponibile on the file exchange. Ora, è passato molto tempo, quindi potrei ricordare, implementando un'opzione ('superstrict') che evita lo valutazione della funzione obiettivo al di fuori della regione ammissibile, compresi vincoli lineari e non lineari. Potresti voler provare.

Ma, nel segno di fmincon, una possibile soluzione è modificare unscented_kalman1 tali da includere sanzioni:

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 

In questo modo è possibile eseguire il filtro, ma tornando a molto valore più alto per l'obiettivo funzione quando i vincoli sono interrotti. Questo "impone" fmincon nella regione ammissibile.

Fare attenzione però che la funzione di penalità che si utilizza non introduce discontinuità. Qualcosa di simile

y = y + 1e8*c; 

non sarebbe adatta, perché se y è solo all'interno della regione ammissibile, il valore restituito è solo y, ma se poi appena fuori della regione alla successiva iterazione, sarà improvvisamente salta di milioni di. Ciò è problematico, poiché SQP in fmincon utilizza le derivate prima e seconda di , che si trasformano anche in milioni in prossimità di una discontinuità del genere, rovinando la successiva iterazione.