WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Excel-Kennfeld zeilenweise optimieren

 

Krys
Forum-Anfänger

Forum-Anfänger



Beiträge: 33
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2018, 12:24     Titel: Excel-Kennfeld zeilenweise optimieren
  Antworten mit Zitat      
Moin moin liebes Forum,

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

        vZeile = str2double(S.vZeile.String);  
        bZeile = str2double(S.bZeile.String);
        vSpalte = str2double(S.vSpalte.String);
        bSpalte = str2double(S.bSpalte.String);
       
        SS.Kennfeldauswahl = SS.(strcat(Kennfeld))(vZeile:bZeile,vSpalte:bSpalte); %Zuweisung des zu Optimierenden Bereichs
        data0 = SS.Kennfeldauswahl;   % Startwert
       
        %Auswahl der Grenzwerte
        lb = str2double(S.lb.String);
        ub = str2double(S.ub.String);

fun = @lsqnonlin_optichem;                                                           % Zielfunktion
        x0 = data0;                                                                  % Startwert
        A = [];                                                                      % linear inequalities A*x ? b (siehe Dokumentation Matlab)
        b = [];                                                            
        Aeq = [];                                                                    % linear equalities Aeq*x = beq and A*x ? b (siehe Dokumentation Matlab)
        beq = [];                                                          
     
        lb = zeros(size(SS.Kennfeldauswahl)+lb);                                     % Untergrenze vom Kennfeld: 0 auf jedem Feld
        ub = (zeros(size(SS.Kennfeldauswahl))+ub);                                   % Obergrenze vom Kennfeld: 100 auf jedem Feld
%        

%__________________________________________________________________

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

        %__________________________________________________________________
        %% --------------------- Zielfunktion -----------------------------
       
        function F = lsqnonlin_optichem(data)
            %% --------------------- Laden  -------------------------------
         

            %disp (handles.choice);
            %     choice = data();
            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.


Viele Grüße
Krys
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.06.2018, 14:21     Titel:
  Antworten mit Zitat      
Hallo,

die Zielfunktion sieht merkwürdig aus. Wo wird F definiert?

Wie sollen denn die Bereiche aussehen, die jeweils genommen werden sollen?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Krys
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 33
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2018, 07:21     Titel:
  Antworten mit Zitat      
Hallo Harald,

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

Code:
SS = load (Kennfelder.mat)


Die Zielfunktion lautet wie folgt:

Code:
F = (sum((SS.Messdaten - Simulationsergebnis).^2);


Die Grenzen können Werte von 0 bis 100 annehmen.

Grüße,
Krys
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.06.2018, 08:31     Titel:
  Antworten mit Zitat      
Hallo,

mir fehlt noch der Überblick, aber ich würde sagen:

Code:
for k = 1: ...
SS.(strcat(Kennfeld))(k,vSpalte:bSpalte) = data();


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Krys
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 33
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2018, 13:21     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Antwort.

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


x_data = [1:1:10; 1:1:10]';
y_data = [1:1:10; 10:1:19]';
Messdaten = randi ([0 70],10,2);


kennfeld = randi ([0 100],12,12);


prompt = {'von Zeile','bis Zeile','von Spalte','bis Spalte','unterer Grenzwert','oberer Grenzwert'};
defaultans = {'','','','','',''};
Params = inputdlg(prompt, 'MyTitle', 1, defaultans);


 C = num2cell(str2double(Params));
 [vZ,bZ,vS,bS,lb,ub] = C{:} ;
data0 = zeros (size(kennfeld(vZ:bZ,vS:bS)))+1;  
fun = @opt
x0 = data0;
A = [];
b = [];
Aeq = [];
beq = [];


optimopt = optimoptions('lsqnonlin', 'Algorithm','levenberg-marquardt');                                % Optionen für den Optimierer
optimopt.MaxIterations = 10000;                                                                         % Maximale Iterationsanzahl
optimopt.MaxFunctionEvaluations = 30000;                                                                % Maximale Funktionsauswertungen
optimopt.PlotFcn = {@optimplotx,@optimplotfval,@optimplotfirstorderopt};                                % Auswahl an Plots die während der Optimierung angezeigt werden
optimopt.Display = 'iter';

data = lsqnonlin(fun,x0,lb,ub, optimopt);

ergebnis = data();

function F = opt(data)
global Messdaten kennfeld vZ bZ vS bS


kennfeld(vZ:bZ,vS:bS) = data();

sim Simulation_test_opt.slx;

Simulationsergebnis = Simulationsergebnis';

F = (((Messdaten(:,2) - Simulationsergebnis).^2));


end
 


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.

Simulation_test_opt.slx
 Beschreibung:

Download
 Dateiname:  Simulation_test_opt.slx
 Dateigröße:  19.86 KB
 Heruntergeladen:  170 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.