Verfasst am: 02.03.2018, 10:51
Titel: Optimization Toolbox, Fmincon Problem
Guten Tag,
ich schreibe zur Zeit meine Masterarbeit und soll diesbezüglich eine Kennfeldbedatung in einem Simulationsmodell durchführen. Leider stoße ich mit meinen erst recht jungen Kenntnissen hier an Grenzen.
Folgende Vorgehensweise. Ich habe in einem Vektor die Sollausgabe, in einem weiteren Vektor Anpassungsfaktoren, und in einem letzten Vektor die ISTausgabe.
Mein Ziel ist nun, den Solver zu nutzen, um die Faktoren in dem Anpassungsvektor so "anzupassen", dass sich die ISTausgabe der Simulation der Sollausgabe annähert.
Ich möchte hierfür den FMINCON_GS nutzen.
Ich habe im ersten Schritt eine Funktion wie folgt geschrieben (soll als objective function genutzt werden)
Code:
function f= myfunc(x, soll_soot_vek, x_neng, y_trq, neng_mes, trq_mes)
x_mat = VektorToMatrix(x); % EIne Funktion die aus einem Vektor eine Matrix macht
CAL.FaktorKennfeld = x_mat; % Hier schreibe ich ANpassungsfaktoren in die Kalibrierung der Simulation sim('SimulationSW.slx'); % Hier wird der IST-Wert ermittelt
[xq,yq] = meshgrid(x_neng, y_trq);
vq2 = griddata(neng_mes,trq_mes,sim_soot,xq,yq); % Zur Übertragung des Sim-Outputs in die Kennfeldrasterung
sim_soot_vek = MatrixToVektor(vq2); % Ist-Output in Vektor umschreiben
f = sim_soot_vek*x-soll_soot_vek; % Berechnung der Abweichung zwischen SOll/IST, diese Abweichung ist zu minimieren end
Leider bekomme ich den Error, dass fmincon eine skalare Größe benötigt, keinen Vektor. Aber ich weiß nicht, was ich ändern könnte, damit es funktioniert.
Es funktioniert jetzt auch, ich bekomme keine Fehlermeldung mehr, aber es wird nicht wirklich was "gesolvt"
Ich habe bereits meine FuncTol auf 0.0001 "erhöht" aber dennoch wird am Ende der Simulation jedesmal zurückgemeldet:
f =
0.9371
Local minimum possible. Constraints satisfied.
fmincon stopped because the predicted change in the objective function
is less than the selected value of the function tolerance and constraints
are satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
No active inequalities.
Mir wird zum Schluss dann auch der unveränderte Vektor x ausgegeben.
Ich weiß nicht, wo der Fehler liegt Hast du oder habt ihr einen Tipp?
habe es auch mal mit dem mean squared error versucht, aber gleiches Ergebnis.
habe jetzt auch mal die Startfaktoren angepasst, keine Veränderung. Probiere jetzt nochmal mit anderen Faktoren und dann werde ich deinen zweiten Vorschlag mal umsetzen.
Hier nochmal das aktuelle Main Script
Code:
%% Kennfelder schreiben
% % Importieren der Soll-Werte in Kennfeld-Auflösung [xq,yq] = meshgrid(x_neng, y_trq); % Raster definieren
vq = griddata(neng_mes,trq_mes,soll_soot,xq,yq);% Einfügen der Messergebnisse (Soll)
soll_soot_vek = MatrixToVektor(vq);
soll_soot_vek(isnan(soll_soot_vek))=0;
da war auf jeden Fall ein Fehler.
Habe es jetzt mit globalen Variablen gelöst. Also die CAL als global definiert und jetzt schreibt er in der myfunc auch die neuen x-Werte in das Simulinkmodell. Es läuft jetzt gerade einmal durch. Aber zunächst einmal ohne GS um zu schauen, ob es überhaupt funktioniert.
Hatte es über Nacht laufen lassen aber wie es so sein muss, ist Matlab natürlich abgeschmiert.
Ich bin immer noch dabei mein Programm ans laufen zu bringen.
Jetzt habe ich aber eine kurze Zwischenfrage bezüglich der Logik meiner Vorgehensweise. Ich habe ja einen Haufen von Daten. Drehzahl, Drehmoment und Ruß zum Beispiel. Wenn ich jetzt diese Daten in ein Kennfeld transportieren möchte, muss ich dies natürlich in die entsprechende Auflösung bringen bzw. Interpolieren.
x_neng, y_trq sind die Stützstellen für meine Kennfeldauflösung. _mes und soll_soot die Daten.
Das klappt jetzt auch so, nur habe ich leider, weil mein Soot noch von einer dritten Variablen abhängt, teilweise für eine Drehzahl/Drehmoment Kombi mehrer Soot-Werte. Diese werden, wenn ich folgende Warnung richtig interpretiere, einfach gelöscht...
>> [xq,yq] = meshgrid(x_neng, y_trq); %Raster definieren
vq = griddata(neng_mes,trq_mes,soll_soot,xq,yq);
Warning: Duplicate data points have been detected and removed - corresponding values have been averaged.
> In griddata>useScatteredInterp (line 184)
In griddata (line 125)
Ich will aber vielmehr, dass er bei doppelten Werten diese zuvor zusammenfasst, beispielsweise durch den Durchschnitt. Gibt es da eine Einstellung für oder einen anderen Ansatz?
Ah ok, ich war jetzt nur verwirrt, weil löschen und mitteln nicht wirklich zusamenpasst, aber dann passt alles. Hatte ich flasch verstanden.
Jetzt habe ich den GlobalSearch mit dem FMIncon durchlaufen lassen können uns es hat auch funktioniert. Keine Fehlermeldung. Allerdings erhalte ich dasselbe Ergebnis, als ob ich lediglich einmal den Fmincon laufen lasse. Und wenn ich die Ergebnisausgabe richtig interpretiere, läuft er auch bloß einmal durch...
25 5881 0.707989 -4.366 1 -0.00448 0.0142
fmincon stopped by the output or plot function.
0 5881 0.708 0.708 -1 Initial Point
GlobalSearch stopped because maximum time is exceeded.
GlobalSearch called the local solver once before exceeding
the clock time limit (MaxTime = 43200 seconds).
0 local solver runs converged with a positive local solver exit flag.
Ich verstehe aber nicht, warum. Ist dir der Fehler bekannt?
Und auch nochmal ein dickes dankeschön an deine Hilfsbereitschaft hier, das hilft mir wirklich immer sehr. Vorallem, weil ich echt noch nicht die große Erfahrung habe
ich habe die Zeit jetzt weiter erhöht und es werden mehr Solver gestartet. Ich denke ich werde dann auch mal einen mit MaxTime Inf starten. Aber zuvor bin ich auf eine neue Version umgestiegen, in der ich selbst Messdaten generiere. Diese Messdateien füttere ich einer von mit erstellten ANN. Diese hatte ich vor einigen Wochen mit Messdateien, welche auf einem Rollenprüfstand aufgenommen worden sind, trainiert.
Die von mit in folgender Weise generierten Messdaten sind aber denke ich diesbezüglich nicht zu verwenden, da sie keiner Realität entsprechen. Ich habe Sprünge von 300Nm in 0.1s Samplingtime usw. ...Das Ergebnis der ANN ist folglich an vielen Stellen gleich null, weil diese Eingangsdaten zu weit vom Training entfernt sind.
Code:
n = 700+(4512-700).*rand(b,1); %Drehzahl zwischen 700 und 3500rpm
T = (420).*rand(b,1); %Last zwischen 0 und 400Nm
lambda = normMax(b,m,sd);
Wie kann ich diese Messdaten realistischer erstellen, also sodass von einer Sekunde auf die nächste maximal um einen Deltawert erhöht oder gesenkt werden kann.
Danke das Problem habe ich jetzt zwar gelöst, aber leider bringt es nicht den erhofften Erfolg. Die Verläufe meiner Zufallsdaten sehen jetzt gut aus, aber mein neuronales Netz liefert in Bezug auf diese Eingangsdaten keine relaistischen Werte. Verwende ich Messungen als Eingangdaten, sind die Ergebnisse realistisch, bei meinen Zufallswerten nicht.
DIe generierten Zufallswerte liegen allesamt in notwendigen Grenzen und ich habe sie auch nochmal geglättet. Leider ohne Erfolg
Kann es sein, dass neuronale Netze, welche mit realen Trainingsdaten trainiert worden sind, in Bezug auf Zufallsdaten nicht zu gebrauchen sind?
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.