ich habe eine Gui erstellt in der ich Fahrzeug-Messdaten grafisch darstellen kann. Anschließend kann ich über ein Simulink-Modell das simulieren bzw. modellieren, was im Fahrzeug gemessen wird. Da die Simulation möglichst die selben Ergebnisse liefern soll wie das Fahrzeug, möchte ich eine Optimierung durchführen.
Dies versuche ich aktuell mit
lsqnonlin
. Um die Simulationsergebnisse den Messdaten anzugleichen, habe ich ein Kennfeld [12x12] mit Faktoren, die durch den Optimierer geändert werden sollen. Wenn das Kennfeld optimiert wurde, soll am Ende der Graph aus der Simulation dem Graph aus den Messdaten möglichst nah liegen.
Nun ist mir aufgefallen, dass ich mit
lsqnonlin
nur ein Feld aus der Excel nehmen und den enthaltenen Wert optimieren kann.
Die Faktoren im Kennfeld sind abhängig von Temperatur (x-Achse) und Volumenstrom (y-Achse).
Sollte ich mit der Annahme recht haben, dass ich immer nur ein Feld optimieren kann, vermute ich, dass ich das in eine Schleife einsetzen muss. Allerdings habe ich keine Idee, wie ich das umsetzen soll. Zudem weiß ich nicht genau, ob die Syntax meines Optimierers korrekt ist.
Vielleicht könnt ihr mir ja auf die Sprünge helfen.
Code:
%manuelle Auswahl Kennfeldbereich. Wird mehr als ein Feld ausgewählt, wird ein Fehler ausgegeben
%% --------------------- Einstellungen ----------------------------
optimopt = optimoptions('lsqnonlin', 'Algorithm','levenberg-marquardt'); % Optionen für den Optimierer lsqnonlin
optimopt.MaxIterations = 10000; % Maximale Iterationsanzahl (Standardwert 1000 zu gering)
optimopt.MaxFunctionEvaluations = 30000; % Maximale Funktionsauswertungen: Größere Anzahl hilft lokale Minima zu vermeiden (Standardwert 3000 zu gering)
optimopt.PlotFcn = {@optimplotx,@optimplotfval,@optimplotfirstorderopt}; % Auswahl an Plots die während der Optimierung angezeigt werden
optimopt.Display = 'iter'; % Ausgabe des Optimierungsfortschritts in Matlab
%% --------------------- Starte Optimierer ------------------------
data = lsqnonlin(fun,x0,lb,ub, optimopt); % Aufrufen des Optimierers fmincon mit den vorher definitierten Eingangsparametern, Einstellungen und Randbedingungen disp(data); % Anzeigen des Optimierungsergebnis SS.(strcat(Kennfeld))(vZeile:bZeile,vSpalte:bSpalte) = data();
Im ersten Moment ist das bestimmt nicht so verständlich. Letztendlich will ich den Bereich des Kennfelds nicht mehr händisch eingeben, sondern alle Felder aus dem Kennfeld nacheinander optimieren.
die Zielfunktion wird bei mir im weiteren Verlauf des Codes definiert. Hatte nicht daran gedacht die Definition zu posten, da noch einiges dazwischen steht, was für meine Frage nicht relevant ist.
vorab nochmal:
in SS werden die Kennfelder abgelegt
Da ich noch etwas auf dem Schlauch stehe und nicht genau weiß, ob der Optimierer das macht was er soll, habe ich alles vereinfacht, damit du einen besseren Überblick hast und verstehst was ich machen möchte.
Hierfür habe ich ein kurzes Skript geschrieben und ein Simulink-Modell erstellt.
Code:
global x_data y_data Messdaten kennfeld vZ bZ vS bS lb ub data0
Ich weiß, dass du mich für das
global
köpfen wirst aber irgendwie habe ich es eben mit den handles nicht hinbekommen.
Wie schon gesagt, habe ich das 12x12 Kennfeld, in dem die Werte sind, die optimiert werden sollen, damit sich die Simulation der Messung angleicht.
Ich habe mir für das Beispiel willkürlich Werte ausgedacht. Nun weiß ich einfach nicht, ob das sinnvoll ist was ich da mache.
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.