2013-08-27 2 views
5

Ich versuche, die Parameter eines nichtlinearen Filters mit fmincon im MATLAB Optimization Toolboox zu schätzen, wobei die Eigenwerte der Zustandsgleichungsmatrix kleiner als eins bleiben. Die Dokumentation für fmincon, die den 'sqp'-Algorithmus verwendet, sagt, dass sie die Einschränkungen bei allen Iterationen respektiert, und dennoch versucht sie bei der ersten Iteration meines Codes einen Punkt, der instabile Eigenwerte impliziert. Ich kann den Filter bei diesen Parameterwerten nicht ausführen, und so stürzt mein Code ab.Wie fmincon Ehre Einschränkungen bei jedem Schritt machen?

Bedeutet die Dokumentation wirklich, dass "AlwaysHonorConstraints" nur für die Ungleichheitsbeschränkungen gilt, die als Vektoren (lb und ub) übergeben werden? Gibt es eine Möglichkeit sicherzustellen, dass die nichtlinearen Einschränkungen bei jedem Schritt erfüllt sind?

Hier ist der relevante Teil meines Code:

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

Dank!

+1

Wenn Sie sagen "bei der allerersten Iteration meines Codes versucht es einen Punkt mit instabilen Eigenwerten" meinen Sie die erste Iteration von 'fmincon' mit' x0'? Hast du verschiedene Startwerte ausprobiert? Was setzt du 'x0'? – user1884905

Antwort

2

The documentation heißt es in der Tat, dass die 'AlwaysHonorConstraints' Option auf die nur gebundenen Einschränkungen gilt, so lb und ub. Mit anderen Worten, fmincon berücksichtigt die gesamte Domäne [lb ub] als mögliche Region und ignoriert alle linearen und nichtlinearen Integritätsbedingungen.

Vor einiger Zeit schrieb ich optimize, die auf fminsearch basiert und ist verfügbar on the file exchange. Nun, es ist lange her, also könnte ich mich falsch erinnern, aber ich erinnere mich an die Implementierung einer Option ('superstrict'), die jede Auswertung der Zielfunktion außerhalb der realisierbaren Bereich einschließlich linearen und nichtlinearen Einschränkungen vermeidet. Vielleicht möchten Sie das ausprobieren.

Aber das Festhalten an fmincon, eine mögliche Abhilfe ist unscented_kalman1 wie schließen Strafen zu ändern:

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 

Dies ermöglicht es, den Filter zu laufen, aber ein viel höheren Wert für das Ziel der Rückkehr Funktion, wenn die Einschränkungen unterbrochen sind. Dies "zwingt" fmincon in den machbaren Bereich.

Achten Sie jedoch darauf, dass die von Ihnen verwendete Penalty-Funktion keine Diskontinuitäten verursacht. So etwas wie

y = y + 1e8*c; 

nicht geeignet sein würde, denn wenn y ist nur innerhalb des zulässigen Bereichs, der zurückgegebene Wert nur y ist, aber wenn es dann nur außerhalb der Region bei der nächsten Iteration, wird es plötzlich aufspringen von Millionen. Dies ist problematisch, da SQP in fmincon erste und zweite Ableitungen von y verwendet, die in der Nachbarschaft einer solchen Diskontinuität ebenfalls Millionen werden, was die nächste Iteration zunichte macht.

Verwandte Themen