Verfasst am: 21.01.2013, 23:11
Titel: fmincon & "Warning:Matrix is singular, close to sin
Hallo,
ich versuche gerade die Eingangsgrößen (Wichtungsmatrizen eines optimalen Reglers) in mein Simulink-MOdell so zu optimieren, dass die Ausgangsgröße (Soll-Regel und Stellgrößenänderungen) minimal wird!
% PT1-Zeitkonstante
T_PT1 = 2; % für AGRstat --> AGRdyn
% Laden der MAT-Files für die Streckenmodelle und Ableitungsmodelle load('modLOLIMOT_3In_CA50');
load('modLOLIMOT_3In_IMEP');
load('modLOLIMOT_3In_DPMAX');
load('modLOLIMOT_3In_HC');
load('modLOLIMOT_3In_NOX');
Da ich am Regelkreis nichts verändern kann (gehe zumindest momentan davon aus), gibt es vielleicht andere Möglichkeiten, wie ich das Problem lösen kann?
Wäre super, wenn jemand eine Tipp für mich hätte.
MfG, Waldemar
PS: Bin recht neu im Thema Optimierung.
_________________
danke für deine Antwort und entschuldige meine späte Antwort...musste mich ein wenig mehr in die Materie einlesen.
Jedenfalls habe ich deinen Ratschlag ausprobiert, die Nicht-Negativbedingungen als "untere Grenze" zu deklarieren. In Kombination mit neuen Startwerten,
einer maximalen Iterationsanzahl - notwendig, weil Matlab, aufgrund der Tatsache, dass ein Gradient nicht berechenbar ist, dass ableitungsfreie Verfahren 'active-set' nutzt, welches durch eine sehr langsame Kovergenz gekennzeichnet ist (stimmt's?) - und der Funktion:
% Simulationsschrittweite
stepSize = 0.03; % 10 ms % Anstelle von 0.06!
% Simulationsdauer vordefinieren
simTime = 12;
% PT1-Zeitkonstante
T_PT1 = 2; % für AGRstat --> AGRdyn
% Laden der MAT-Files für die Streckenmodelle und Ableitungsmodelle load('modLOLIMOT_3In_CA50');
load('modLOLIMOT_3In_IMEP');
load('modLOLIMOT_3In_DPMAX');
load('modLOLIMOT_3In_HC');
load('modLOLIMOT_3In_NOX');
bekomme ich für manche Arbeitspunkte Ergebnisse (Optimierung wird beendet, allerdings bin ich mir nicht sicher, ob es sicher hierbei um globale Minima handelt)....für andere kommt wieder die Warnung/ derFehler:
Dabei taucht die Meldung, bei unterschiedlichen Arbeitspunkten bei unterschiedlichen Iterationsschritten auf (also nicht immer am Anfang!)!
Welche Möglichkeiten/Eingriffsmöglichkeiten bleiben mir?
Analyse: Zielfunktion:
Bei meinem Simulationsmodell - meiner Zielfunktion - handelt es sich um einen Regelkreis, der für den Motor ein linearisiertes Modell des Verbrennungsmotors nutzt, dessen Ausgangsgrößen die Regelgrößen (CA50, IMEP, NOx) sind. Die von außen zugeführten Sollwerte (Arbeitspunkt: CA50, IMEP, NOx) werden mit einem modellbasierten Regler (iterativ--> prädiktiver Regler) und einem Kalmanfilter eingeregelt (Genutzt wird ebenfalls das linearisierte Modell, allerdings diesmal in der Zustandsraumdarstellung).
Warum ich das erwähne?...Frage mich die ganze Zeit, ob es sich bei mir um eine lineare oder um eine nichtlineare Optimierung handelt?
(Nebenbedingungen sind ja linearer Natur, nicht wahr?)
Allerdings ist für die Austellung der Optimierung in Matlab mit fmincon egal, ob es sich um eine lineare oder nichtlineare Optimierung handelt, da fmincon sowohl für die lineare als auch für die nichtlineare Optimierung gilt, nicht wahr?
Welcher Algorithmus bietet sich eigentlich für welchen Fall am ehesten an?
Was muss ich noch beachten, was ich kann noch anpassen?
Oder geht da nix mehr?
einer maximalen Iterationsanzahl - notwendig, weil Matlab, aufgrund der Tatsache, dass ein Gradient nicht berechenbar ist, dass ableitungsfreie Verfahren 'active-set' nutzt, welches durch eine sehr langsame Kovergenz gekennzeichnet ist (stimmt's?)
Grundsätzlich würde ich die max. Iterationszahl nur beschränken, wenn es sonst zu extrem langen Rechenzeiten kommt. 15 erscheint mir extrem niedrig.
Es ist zu unterscheiden zwischen "Gradient angegeben" und "Gradient nicht angegeben, aber sinnvoll annäherbar" und "Gradient nicht sinnvoll annäherbar". Ich würde sagen, dass du dich auf das zweite beziehst.
Was ist denn der Wert von exitflag?
Zitat:
Matrix is singular, close to singular....
Wo genau kommt diese Warnung her? Bitte die komplette Fehlermeldung inkl. Bezug auf Codezeile kopieren, und auch MATLAB-Release angeben.
Zitat:
Welche Möglichkeiten/Eingriffsmöglichkeiten bleiben mir?
Ich vermute, dass dann Parameter für das Simulink-Modell verwendet werden, die nicht sinnvoll sind. So etwas kann man durch Nebenbedingungen vermeiden. Welche Nebenbedingungen sinnvoll sind, musst du aus der konkreten Anwendung heraus entscheiden.
% Laden der MAT-Files für die Streckenmodelle und Ableitungsmodelle load('modLOLIMOT_3In_CA50');
load('modLOLIMOT_3In_IMEP');
load('modLOLIMOT_3In_DPMAX');
load('modLOLIMOT_3In_HC');
load('modLOLIMOT_3In_NOX');
Dabei entstehen unzählige Warnungen im Command Window folgender Art:
(Command Window):
Code:
Optimale_Wichtung_mit_fmincon
Warning: To use the default trust-region-reflective algorithm you must
supply the gradient in the objective function and set the GradObj option
to 'on'. FMINCON will use the active-set algorithm instead. For
information on applicable algorithms, see Choosing the Algorithm in the
documentation.
> In fmincon at 491
In Optimale_Wichtung_mit_fmincon at 95
MaxLine search Directional First-order
Iter F-count f(x) constraint steplength derivative optimality Procedure
073242.56-0.1 Warning: Matrix is singular to working precision.
> In Regelung at 44
In nlconst at 743
In fmincon at 794
In Optimale_Wichtung_mit_fmincon at 95 Warning: Matrix is singular, close to singular or badly scaled. Results
may be inaccurate. RCOND = NaN.
> In Regelung at 44
In nlconst at 743
In fmincon at 794
In Optimale_Wichtung_mit_fmincon at 95 Warning: Matrix is singular, close to singular or badly scaled. Results
may be inaccurate. RCOND = NaN.
> In Regelung at 44
In nlconst at 743
In fmincon at 794
In Optimale_Wichtung_mit_fmincon at 95
.
.
.
Kann es sein, dass innerhalb deines Modells, beispielsweise innerhalb eines MATLAB-Function - Blocks, ein lineares Gleichungssystem gelöst oder eine Inverse berechnet werden soll?
Eine Idee: die Simulationsgenauigkeit im Modell sollte hoch (z.B. 1e-9) sein, um Simulationsfehler klein zu halten.
Hintergrund: fmincon ist gradientenbasiert. Die Gradienten werden über Differenzenquotienten gebildet, und die können bei fehlerbehafteten Funktionsauswertungen unsinnig werden.
Alternativ: fminsearch oder patternsearch verwenden; diese beiden Algorithmen sind ableitungsfrei.
Grüße,
Harald
P.S.: Die Anzahl der Iterationen ist begrenzt. Auch wenn es so scheinen mag, wirst du also sicher nicht unendlich viele dieser Warnungen bekommen ;)
Denke, dass du möglicherweise ins Schwarze getroffen hast, da im MP-Regler, zur Berechnung der optimalen Stellgrößen, eine Inverse berechnet wird.
Werde es morgen mal mit deinen vorgeschlagenen Funktionen probieren.
Wenn ich dich um noch einen Ratschlag bitten dürfte,...
...wenn du dir mein Simulink-Modell anschauen würdest (Anhang), welche Funktion wäre deiner Meinung am ehesten geeignet!
(Mir fehlt da einfach der Überblick!)
(Bei der Regelstrecke handelt es sich um LOLIMOT-(LOcal LInear Modell Tree)-Modelle (linearsierte Darstellung des Motors im jeweiligen Arbeitspunkt) (Funktionsname: Jacobi) des echten Motors.
Vielen lieben Dank für deine bisherige Hilfe.
MfG, Waldemar
PS: Dann haben mir die vielen Warnungen einfach nur Angst gemacht...und wenn es emotional wird, hört der Verstand bei mir auf.
...oder so ähnlich!
warum verwendest du einen fixed-step-Solver? Damit handelst du dir Simulationsungenauigkeiten beispielsweise bei Nulldurchgängen ein, während du diskrete Systeme mit variable-step exakt simulieren kannst - abgesehen natürlich davon, was in den MATLAB Functions passiert, und das ist bei dir leider ein sehr großer und vor allem unübersichtlicher Teil, z.B. was MPC_OPT2 angeht.
Meine Kenntnisse bzgl. Regelungstechnik halten sich in Grenzen. Ich würde jedoch vermuten, dass eine Linearisierung problematisch ist, wenn man sich zu weit vom Arbeitspunkt entfernt. Und es würde mich nicht überraschen, wenn das auch für die zu bestimmenden Parameter gilt.
Du kannst ja in deinem Code an die vermutete Stelle mal cond(matrix) schreiben, dann siehst du ja ob es daran liegt. Und wenn es daran liegt, solltest du dir überlegen, ob du im Falle singulärer Matrizen sinnvolle Ergebnisse bekommst oder auch, was eine singuläre Matrix hier für deine Anwendung bedeutet.
ich denke, dass ich langwierigste Variante versuche, und einfach mal:
- patternsearch
- fminsearch
- fmincon (interior-point)
- fmincon (sqp)
ausprobiere und schaue was die Ergebnisse sind!
Hättest du einen Tipp, wie ich die Nicht-Negativ-Nebenbedingungen bei fminsearch einbinden kann?
Hab die ganze Zeit gegoogelt, allerdings keinen Referenzfall gefunden!
z.B. folgendes zur Zielfunktion addieren
100*sum(x<0)
Wie soll ich das denn zu meiner Zielfunktion (Simulink-Modell) addieren?
Etwa in die in das Simulink-Modell eingebetteten Matlabfunktionen if-Abfragen einbauen?
sum steht für Summe. Damit werden die Elemente in x, die kleiner als 0 sind, gezählt. Die 100 ist ein Gewichtungsfaktor. Für jedes x, das < 0 ist, gibt es also 100 "Strafpunkte".
Je nachdem wie groß yout typischerweise ist, muss man das größer wählen.
Alle Optimierungsfunktionen geben einen Minimalpunkt in der Nähe der Startwerte aus!
Dabei verhält sich fmincon ('interior-point') gegenüber fminsearch noch besser, zum einen weil die Zielfunktion ein wenig geringer ist und zum anderen weil der Minimalpunkt ein wenig weiter von den Startwerten entfernt liegt!
Kann man gegen diese - ich nenne es mal - 'Startwertabhängigkeit' unter Verwendung dieser Solver etwas unternehmen? Gibt es da noch ein paar Schrauben, an denen man drehen kann, damit man einen größeren Bereich abdeckt?
Wäre über eine Antwort sehr dankbar.
MfG, Waldemar
PS: patternsearch dauert schon länger, wobei ein besseres Ergebnis - zumindest gilt diese Aussage für die bisher untersuchten Arbeitspunkte - nicht garantiert wird!
PPS: Da ich für ungefähr 30 Arbeitspunkte die optimalen Wichtungen suche, spielt der Zeitfaktor schon eine erhebliche Rolle.
_________________
die Solver in der Optimization Toolbox suchen nach einem lokalen Minimum in der Nähe des Startwerts. Wenn es viele lokale Minima gibt und man das globale sucht, sollte man Solver aus der Global Optimization Toolbox verwenden (patternsearch, ga, MultiStart, ...) oder über mehrere Startpunkte iterieren. Dafür muss man allerdings auch Zeit mitbringen.
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.