Hallo zusammen,
ich muss ein Kalman-Filter mit Beschränkung programmieren. Dafür brauche ich die fmincon Funktion. Das Problem was ich mit dieser Funktion habe, ist:
1- Aufruf von konstanten die in fmincon Funktion benutzt werden.
2- gesucht ist K, sodass trace[(I-K*H)*P*(I-K*H)'} minimum ist und unter der Bedingung A(x+K)<d. I, H und A sind Matrizen, x, K und d Vektoren.
Wenn ich annehme dass:
I ist der Einheitsmatrix
K ist dein Korrekturvektor
z_k = H_k * x_k + v_k
d ist ein Vektor worin alle Fehler der state variables stehen (von x_1 bis x_k)
Die Bedingung A(x+K)<d geben Sie mehreren linear inequalities.
Eine Möglichkeit dieses zu lösen, ist um in Matlab eine Funktion in ein mfile zu kreieren wo deine Constraints definiert sind (z.B. Constrains.m) und dann in deine m-file wo du deine neuer gain K ausrechnest danach zu verweisen. Ein Beispiel wie man dieses machen könnte ist mit http://www.mathworks.com/help/optim/ug/writing-constraints.html.
Hallo Christian.
Vielen Dank für deine Hilfe.
Es läuft aber manchmal zeigt mir (wenn ich dp1 kleiner mache dh. viele Werte zu optimieren) diesen Fehler: fmincon hat aufgehört zu laufen weil 200 optimierung überschritten hat:
Solver stopped prematurely.
fmincon stopped because it exceeded the function evaluation limit,
options.MaxFunEvals = 200 (the default value).
Hast du eine Idee, wie ich es lösen kann.
Vielen Dank im Voraus
VG.
Rita
Code:
% die Beschränkung muss nur auf den 2ten Term (K(1,2)von K bzw. x_k(1,2) % ich hab den Ausdruck A=(I-KH)P(I-KH)´+KRK´ berechnet und den trace(A) % auch und so bekam ich Trace(A)=ax*k(1)^2 + bx*k(1) +cx + dx*k(2)^2 + ex*k(2) + gx % Beim Jeden Takt bekommen die Matrizen H,P,R,Z,YY neue Werte (db1=d(1,2) lassen % wir es ertsmal eine Konstante sein), deswegen habe ich sie als global % deklariert(xh1,z1,yy1..). % P=[p11 p21; p12 p22]; H=[h11 h21; h12 h22]; R=[r11 r21; r12 r22]und K=[k11 0; 0 k22].
% fmincom habe ich als extra mFile wie folgendes geschrieben: % objfun habe ich als extra mFile wie folgendes geschrieben function f = objfun(ck) global ax bx cx dx ex gx
f = ax*ck(1)^2 + bx*ck(1) +cx + dx*ck(2)^2 + ex*ck(2) + gx
% Und confuneq habe ich als extra mFile wie folgendes geschrieben function[c, ceq] = confuneq(ck) % Nonlinear inequality constraints global xh1 z1 yy1 db1
Wenn dieses geklappt hat, aber den Problem noch immer vor steht, könnten Sie versuchen das Problem mit einem anderen Solver zu lösen. (sehe Link von vorherigen Post)
Viel Erfolg!
Vg Christiaan
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.