Verfasst am: 12.06.2019, 18:44
Titel: fmincon zur Parameteridentifikation
Guten Abend,
ich habe folgendes Problem, und zwar möchte ich mittels der Funktion fmincon ein paar Parameter (m, cw...) meines Längsdynamikmodells so anpassen, dass der simulierte Batteriestrom besser zum gemessenen Strom passt. Ich bekomme es aber einfach nicht hin meinen Code, welcher aus mehreren Unterfunktionen besteht, in die passende Syntax zu formen bzw. komme ich mit anonymen Funktionen noch nicht ganz klar. Ich hoffe ihr könnt mir weiterhelfen meine objective function soll der MSE zwischen gemessener Größe und simulierter Größe sein.
Vielen Dank für eure Hilfe!
figure(1) subplot(3,1,1) plot(data.time,data.velocity*3.6);
ylabel('v in km/h') subplot(3,1,2) plot(data.time,data.a_x_derived);
ylabel('a in m/s^2') subplot(3,1,3) plot(data.time,power.rolling_res,data.time,power.air_res,data.time,power.gradient_res,data.time,power.acc_res,data.time,power.all_res);
legend('F_R','F_{Luft}','F_{St}','F_{B}','F_{ges}') ylabel('P in W') xlabel('t in s')
%% Bestimmen des gesamten Wirkungsgrads (Antriebsstrang, Motor, Batterie)
das ist nun einiges an Code, nur finde ich keinen Versuch eines fmincon-Aufrufs.
Bitte auch genauer spezifizieren, welche "Größen" denn betrachtet werden sollen.
Zudem solltest du darauf achten, Funktionsnamen wie power und gradient nicht als Variablennamen zu verwenden. Das kann übel enden, wenn man dann mal doch die Funktion aufrufen will.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Vielen Dank für die schnelle Antwort! Beim Versuch fmincon aufzurufen gibt er mir immer den error "not enough Input Arguments", was ja auch irgendwie logisch erscheint, wenn er über den MSE nur die beiden Ströme betrachtet, jedoch keinen Zugriff auf die anzupassenden Parameter hat. Diese sind konkret die Masse m, der Luftwiderstandsbeiwert cw und der Drehmassenzuschlagsfaktor lambda. Habe mal meinen kläglichen Versuch fmincon aufzurufen unten beigefügt.. ich hoffe jemand kann mir weiterhelfen!
Einen schönen Gruß,
Pascal
Code:
% Startwert
p0 = [1,1000,0]; %für (lambda, m,cw)
% Zielfunktion
objective = immse(-current_avg - current); %current_avg gemessen und current ist simuliert)
% optimize with fmincon
A = [];
b = [];
Aeq = [];
beq = [];
Dabei muss currentValue eine Funktion sein, die aus p den simulierten Wert errechnet.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Okay danke schonmal, jedoch ist das genau das Problem.. ich weiß nicht genau wie ich an die Sache heran gehen soll, weil meine simulierte Größe (currentValue) ja die Endgröße der Simulation ist.. und diese lässt sich nicht so einfach in eine anonyme Funktion überführen.. muss ich das ganze Programm umschreiben oder hast du eine Idee wie das Problem schneller gelöst werden kann?
für den Anfang brauchst du keine anonyme Funktion, sondern nur eine "normale" Funktion. Wenn ich das richtig sehe, ist das im wesentlichen das Skript, das du am Anfang erstellst. Dort wird ja z.B. mit Leistung_Strom das current berechnet. Letzte Zeile der benötigten Funktion ist also:
Code:
[~,~,~,current] = Leistung_Strom( Inputs abhängig von p)
Soll die Berechnung letztlich für eine .mat-Datei durchgeführt werden oder wirklich für mehrere?
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Es würde mir mehr als ausreichen, wenn ich für dieses Programm/mar Datei einen funktionierenden fmincon implementieren könnte.. deine letzte Antwort habe ich leider nicht ganz verstanden, bin noch Anfänger in Sachen Matlab und habe ja für meine Leistung_Strom Funktion schon die Inputs (all_res,eta_gesamt,voltage_nom), welche mir aber auch nicht weiterhelfen, da meine Parameter, die ich anpassen will in der Funktion Widerstaende stecken.. also quasi aus Widerstaende.m als all_res in die Funktion Leistung_Strom.m eingehen, welche daraus wiederum den Strom berechnet, welchen ich vergleiche mit den Messwerten die mir vorliegen.. etwas kompliziert, aber ich hoffe du weisst worauf ich hinaus möchte.
Es würde mir mehr als ausreichen, wenn ich für dieses Programm/mar Datei einen funktionierenden fmincon implementieren könnte..
Das ist mir klar. Allerdings ist dein Code ziemlich verschachtelt. Vermutlich ist er nicht mit der Absicht entstanden, da mal was mit fmincon zu optimieren.
Zitat:
deine letzte Antwort habe ich leider nicht ganz verstanden,
Was genau hast du nicht verstanden?
Zitat:
da meine Parameter, die ich anpassen will in der Funktion Widerstaende stecken.. also quasi aus Widerstaende.m als all_res in die Funktion Leistung_Strom.m eingehen, welche daraus wiederum den Strom berechne
Dann musst du leider dich in der genannten Funktion durch all das durchwursteln. Wenn ich das richtig sehe, dürfte die Funktion etwa so aussehen:
parameter.m = p(2); % <-- soll ja optimiert werden
parameter.A = 2.38; % Fahrzeugstirnfläche (BMW i3) [m^2]
parameter.cw = p(3); % <-- soll ja optimiert werden
parameter.r = 0.155*0.70+19*0.0254/2; % Radius d. Rades (155/70 R19) [m]
parameter.f_r = 0.008; % Rollwiderstand [1]
parameter.lambda = p(1); % <-- soll ja optimiert werden
parameter.voltage_nom = 360; % Nennspannung in V
% Damit werden jetzt Beschleunigungen, Widerstände etc. berechnet. % Mit diesen Daten muss dann noch Leistung_Strom aufgerufen werden [~,~,~,current] = Leistung_Strom()
Soll die Berechnung letztlich für eine .mat-Datei durchgeführt werden oder wirklich für mehrere?
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Hallo und vielen Dank für deine Mühe!
Also es sollen eig. mehrere mat Dateien/Datensätze nacheinander geladen werden.. das macht das Programm auch schon und speichert dann die Ergebnisse ab. Also verstehe ich deinen Lösungsansatz richtig, dass ich direkt am Anfang meines Programmes eine Funktion definiere, mit den Optimierungsparametern p(1), p(2), P(3) und dann in dieser Funktion alle anderen (Widerstände, Leistung_Strom usw...) Unterfunktionen sind?
und dann in dieser Funktion alle anderen (Widerstände, Leistung_Strom usw...) Unterfunktionen sind?
Unterfunktionen oder Funktionen in separaten Dateien.
Zitat:
dass ich direkt am Anfang meines Programmes eine Funktion definiere
Am Anfang würde ich eher den fmincon-Aufruf sehen. Die Zielfunktion wird dort definiert, und das kann dann wieder auf currentValue oder welche Funktionen auch immer verweisen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Alles klar habe es jetzt hinbekommen vielen Dank, hast mir echt geholfen! Hätte jetzt zum Abschluss noch eine Frage und zwar habe ich das Gefühl bei der Optimierung immer in einem lokalen Minimum zu landen, deshalb würde ich gerne MultiStart anwenden.. magst du mir dabei auch noch helfen das wäre super.
Liebe Grüße,
Pascal
Code:
% Startwert
p0 = [0.3,1];
% optimize with fmincon
A = [];
b = [];
Aeq = [];
beq = [];
% bounds
lb = [0.29,0.7];
ub = [0.5,2];
problem = createOptimProblem('fmincon',Laengsdynamik,'x0','lb','ub')
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Einstellungen und Berechtigungen
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.