Verfasst am: 08.11.2014, 19:10
Titel: Optimierung Funktion und Nebenbedingungen (fmincon)
Hallo zusammen,
ich beschäftigte mich seit ein, zwei Monaten etwas genauer mit Matlab im Rahmen meiner Bachelorarbeit und stoße nun auf ein Problem, dass ich seit einigen Tagen einfach nicht gelöst bekomme.
Vereinfacht gesagt geht es dabei darum, die Maxima einer Funktion "abzuschneiden" und entsprechend die Täler "aufzufüllen". Bei der Funktion handelt es sich um die Leistung P mehrerer Bremsscheiben über die Geschwindigkeit v.
Vorab: ein qualitativen Verlauf meiner Ausgangsfunktion (schwarz) und meines bisherigen Ergebnisses (rot) habe ich angehangen.
Meine Idee war bisher, dass ich die Leistung als quadratische Funktion ausdrücke (so umgehe ich die 2 Peaks). Es soll als Randbedingung dabei gelten, dass die maximale Leistung, also das Maximum der quadratischen Funktion so gering wie möglich ist. Außerdem soll die Summe aller Funktionswerte in der Ausgangsfunktion gleich die der Funktionswerte der Endfunktion sein. Ich habe dabei für jede Geschwindigkeit mit der Schrittweite ein, genau einen entsprechenden Leistungswert (Funktionswert).
Im Netz bin ich dabei auf die Funktion fmincon gestoßen, jedoch schaffe ich es einfach nicht damit eine Optimierung durchzuführen, da ich nicht weiß wie ich die Nebenbedingungen vernünftig ausdrücken soll. Mein bisheriges Ergebnis habe ich mit Hilfe eines Gleichungssystems gelöst, jedoch wird dabei die Höhe nicht minimal gewählt.
Ich wäre super dankbar, falls mir jemand einen Tipp oder Ähnliches geben könnte. Vielleicht bin ich auch einfach nur auf dem falschen Weg und sehe den Wald vor lauter Bäumen nicht mehr.
Es soll als Randbedingung dabei gelten, dass die maximale Leistung, also das Maximum der quadratischen Funktion so gering wie möglich ist.
Das klingt eher nach Zielfunktion als nach Nebenbedingung.
Insgesamt muss ich sagen, dass ich der Beschreibung nicht ganz folgen kann. Oft hilft es, Zielfunktion und Nebenbedingungen als Formeln hinzuschreiben.
da ich noch relativ neu in dem Thema bin, habe ich wohl die Begriffe verwechselt. Meine Zielfunktion beschreibt, den Abstand zwischen dem Maximum der Funktion und der x-Achse zu minimieren.
Meine Funktion ist eine quadratische Funktion der Form:
Hierbei weiß ich, dass sich das Maximum der Funktion an der Stelle befindet, sodass sich die Funktion, die minimiert werden soll zu vereinfacht. Die Koeffizient und sollen nun entsprechend der Nebenbedingung minimiert werden. Die Nebenbedingung lautet dann wie folgt:
ergeben. ist dabei gegeben.
Ich hoffe, ich konnte mein Problem etwas genauer erklären. Es spielen leider sehr viele Überlegungen mit in die Berechnung ein, sodass es nicht immer ganz einfach ist, die Problematik auf's einfachste runterzubrechen.
das sieht doch schon viel besser aus. P wird also deine Zielfunktion, und als Nebenbedingung haben wir umgeformt:
also eine lineare Gleichungsnebenbedingung.
die einfache Umstellung hat mich schon etwas näher an meine Lösung gebracht. Ich weiß weiterhin, dass meine Parabel nach unten geöffnet ist, d.h. für muss und es soll außerdem gewählt werden. Ich schaffe es jedoch nicht, diese Bedingungen entsprechend zu formulieren, da mit Hilfe der Funktion fmincon keine echt kleiner Formulierungen zugelassen sind, oder sehe ich das falsch?
Hallo,
vielen Dank für den Hinweis! Die Bedingungen für die Koeffizienten a und b werden nun auch erfüllt. Jedoch wird meine weitere Nebenbedingung nicht erfüllt.
So weit mein Skript:
Code:
% gegebene Werte
Pges = 2.1021e+15;
v = [0:360]';
% beschreibe weitere Nebenbedingungen % es soll gelten, dass a < 0 sowie b > 0, sodass ich folgendes % Ungleichungssystem ergibt
A = [10;
0-1];
b = [0;0];
% setze den Startwert fuer die Optimierung
startwert = [-10,1];
% Aufruf der Optimierungsroutine [x fval] = fmincon(@(a) maxFun(a), startwert,...
A, b, [], [], [], [], @(a) nebenbed( a, v, Pges ));
function[ yMax ] = maxFun( a ) % Zielfunktion := Minimierung des Maximums einer parabolischen Funktion der % Form f(x) = c(1)*x^2 + c(2)*x % Das Maximum dieser Funktion liegt bei x0 = - c(2)^2/(4*c(1))
function[ ceq, c ] = nebenbed( a, x, Pges ) % Definition der Nebenbedingung % Es muss gelten, dass die Summe aller Eintraege im Array gleich einem % vorgegebenen Wert Pges ist % Es gilt folglich eine Gleichungsnebenbedingung
ceq = [a(1)*sum(x.^2) + a(2)*sum(x) - Pges];
% Es gibt keine Ungleichungsbedingung
c = [];
Es ist zudem immer eine gute Idee, die Bedingungen so einfach wie möglich zu formulieren, also:
a < 0, b > 0 --> Schrankenbedingungen
--> wie gesagt eine lineare NB
Vielen Dank! Endlich funktioniert der Algorithmus. Ich weiß die Hilfe wirklich zu schätzen. Das hat mich in meiner Bachelorarbeit wieder ein Stück weitergebracht. Danke nochmals
Ich wünsche noch einen schönen Sonntag
Philipp
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.