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

Optimization Toolbox, Fmincon Problem

 

Daniel2211
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.02.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2018, 11:51     Titel: Optimization Toolbox, Fmincon Problem
  Antworten mit Zitat      
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
 

Im nächsten Schritt rufe ich in dem TopLevel die Funktion in einen function handle und setze alle Parameter für die Optimierung

Code:


h3 = @(x)myfunc(x,soll_soot_vek, x_neng, y_trq, neng_mes, trq_mes);

x_0 = MatrixToVektor(x_fac);
lb = MatrixToVektor(0.001*ones(15));
ub = MatrixToVektor(1000*ones(15));
Aeq = [];
beq = [];
A_uneq = [];
b_uneq = [];


    options = optimoptions('fmincon','Algorithm','active-set', 'FunctionTolerance', 0.0001);
    problem = createOptimProblem('fmincon','objective', h3, 'x0', x_0, 'Aineq', A_uneq,'bineq', b_uneq,...
                'Aeq', Aeq, 'beq', beq, 'lb', lb, 'ub', ub, 'options', options);

     gs = GlobalSearch('StartPointsToRun', 'bounds-ineqs','TolX',0.0001, 'TolFun',0.0001,'Display','iter',...
                         'MaxTime',180,'NumStageOnePoints',2000,'NumTrialPoints',10000);

[x, ~] = run(gs, problem); % starts GlobalSearch
 


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.

Brauche eure Hilfe, danke Smile
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.03.2018, 18:39     Titel:
  Antworten mit Zitat      
Hallo,

bei GlobalSearch ist die einzige Möglichkeit, die Norm der Abweichungen zu minimieren:
Code:
f = norm(sim_soot_vek*x-soll_soot_vek);


Alternativ könntest du MultiStart verwenden und als lokalen Solver lsqnonlin statt fmincon.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.02.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2018, 17:45     Titel:
  Antworten mit Zitat      
Vielen Dank für die Hilfe!

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 Crying or Very sad Hast du oder habt ihr einen Tipp?

Vielen Dank Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.03.2018, 19:20     Titel:
  Antworten mit Zitat      
Hallo,

welchen der beiden Ansätze nutzt du denn jetzt?

Ein Vorschlag wäre, auch den anderen zu nutzen.
Ein weiterer, es auch mal mit anderen Startwerten zu versuchen.

Mehr kann man wohl nur mit einem reproduzierbaren Beispiel helfen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.02.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.03.2018, 12:33     Titel:
  Antworten mit Zitat      
Ich habe bislang deinen ersten Vorschlag umgesetzt. die myfunc sieht jetzt wie folgt aus
Code:




function f= myfunc(x, soll_soot_vek, x_neng, y_trq, neng_mes, trq_mes)

x_mat = VektorToMatrix(x);
CAL.PFlt_facCorSotLamBas6_M.data = x_mat;
sim('SimulationSW.slx');

[xq,yq] = meshgrid(x_neng, y_trq);
vq2 = griddata(neng_mes,trq_mes,sim_soot,xq,yq);

sim_soot_vek = MatrixToVektor(vq2);
sim_soot_vek(isnan(sim_soot_vek))=0;

sim_soot_vek
g = sim_soot_vek.*x-soll_soot_vek;
g
f = norm(g);
f

%% Mean Squared Error Liste
% err = sim_soot_vek.*x-soll_soot_vek;
% sqerr = err.^2;
% mse = mean(sqerr);
% f = sqrt(mse);

end
 

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;

% Startwerte für Faktoren schreiben
x_fac = 5*ones(15);
CAL.PFlt_facCorSotLamBas6_M.data = x_fac;

%% Solver

x = MatrixToVektor(CAL.PFlt_facCorSotLamBas6_M.data);

h3 = @(x)myfunc(x,soll_soot_vek, x_neng, y_trq, neng_mes, trq_mes);
f = myfunc(x,soll_soot_vek, x_neng, y_trq, neng_mes, trq_mes);

x_0 = MatrixToVektor(x_fac);
lb = MatrixToVektor(0.001*ones(15));
ub = MatrixToVektor(1000*ones(15));
Aeq = [];
beq = [];
A_uneq = [];
b_uneq = [];


    options = optimoptions('fmincon','Algorithm','active-set', 'FunctionTolerance', 0.0001);
    problem = createOptimProblem('fmincon','objective', h3, 'x0', x_0, 'Aineq', A_uneq,'bineq', b_uneq,...
                'Aeq', Aeq, 'beq', beq, 'lb', lb, 'ub', ub, 'options', options);


     x = fmincon(problem)

 

Natürlich sind alle erwähnten Variablen zurvor definiert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.03.2018, 09:53     Titel:
  Antworten mit Zitat      
Hallo,

ist sichergestellt, dass Simulink sich die Parameter aus dem richtigen Workspace zieht? Falls nicht, versuch mal
Code:
sim('SimulationSW.slx', 'SrcWorkspace', 'current');


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.02.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.03.2018, 12:57     Titel:
  Antworten mit Zitat      
Hallo,

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.

Gruß
Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.03.2018, 13:46     Titel:
  Antworten mit Zitat      
Hallo,

globale Variablen halte ich generell für keine gute Idee. Es besteht immer die Gefahr, dass man irgendwas irgendwo unbeabsichtigt aktualisiert.

Paralleles Rechnen kann das deutlich beschleunigen.
(Bei Optionen 'UseParallel' auf true setzen)

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.02.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2018, 13:58     Titel:
  Antworten mit Zitat      
Hallo,

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.

bislang mache ich es so

Code:


[xq,yq] = meshgrid(x_neng, y_trq); %Raster definieren
vq = griddata(neng_mes,trq_mes,soll_soot,xq,yq);

 

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?

Vielen Dank Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.03.2018, 20:16     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich will aber vielmehr, dass er bei doppelten Werten diese zuvor zusammenfasst, beispielsweise durch den Durchschnitt.

Und genau das macht MATLAB laut der Meldung: averaged = gemittelt. Solange du keine andere Form der Zusammenfassung brauchst, passt also alles.

Wenn du eine andere Form der Zusammenfassung willst, müsstest du die Daten selbst vorverarbeiten.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.02.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2018, 12:00     Titel:
  Antworten mit Zitat      
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 Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.03.2018, 23:46     Titel:
  Antworten mit Zitat      
Hallo,

Global Search bricht ab, weil es sehr lange brauchen würde. Du musst die Option MaxTime entsprechend anpassen, siehe z.B.
https://www.mathworks.com/help/gads/change-options.html#bsc5_dk

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.02.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.03.2018, 09:57     Titel:
  Antworten mit Zitat      
Guten Morgen,

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

 


Code:

function y = normMax(n,m,sd)

y = randn(n,1)*sd+m;
yrep = y<0.01 | y>1;

if any(yrep)
 
    y(yrep) = normMax(nnz(yrep),m,sd);

end
 


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.

Vielen Dank
Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

du kannst z.B. mit randn zufällige Drehzahländerungen erzeugen und das dann mit cumsum aufaddieren.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.02.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.03.2018, 18:05     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.