Optimierung einer Zielfunktion mit symbolischen Summen
Dominicst25
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.12.2018, 13:27
Titel: Optimierung einer Zielfunktion mit symbolischen Summen
Hallo liebe Matlab Begeisterte,
ich möchte ein nichtlineares Optimierungsproblem lösen. Das besondere dabei ist, dass Funktionen, aus denen meine Zielfunktion zusammengesetzt ist, aus Doppelsummen besteht und beide Laufvariablen (k, tau) ebenfalls in der Zielfunktion enthalten sind.
Beide Laufvariablen sind als symbolisch deklariert. Die Variable t nach der optimiert wird besteht aus vier Werten und ist eine 2x2 Matrix. Diese sind zudem Bestandteil der Summengrenzen, die in den Funktionen enthalten sind. Ich optimiere also nach vier Unbekannten. Alle Funktionen habe ich also (fast) immer vier mal und als solche mit ..._11, ..._12 etc. benannt, um sie zu unterscheiden.
Da die Zielfunktion zu komplex ist, um sie in einem geschlossenen Ausdruck zu schreiben, habe ich alle Bestandteile zuvor als Funktionen deklariert und dann die Zielfunktion Stück für Stück aus diesen zusammengesetzt.
Ich habe darauf geachtet, dass alle Funktionen korrekt deklariert sind und habe das auch getestet ohne Fehler.
Die Auswertung der FM und LM NPV´s ab Zeile 424 funktioniert dann nicht mehr und auch die Optimierung funktioniert nicht. Ich habe es auch im kleinen Stil mit einer anderen Funktion getestet und auch da geht es nicht.
Ich vermute also, dass man symbolische Summen nicht als Zielfunktion verwenden kann. Wenn das nicht funktioniert, dann weiß ich nicht, wie ich mein Problem lösen soll. Dann müsste ich versuchen, die Summen in der Zielfunktion händisch auszuschreiben, was natürlich ein riesiger Aufwand wäre, da ich 20 Summanden bräuchte. Möglicherweise liegt es auch daran, dass meine Lösungen ganzzahlig sein müssen, da sie ja die Grenzen einer Summe sind und fmincon das nicht realisiert. Gibt es eigentlich eine Möglichkeit, dies zu steuern? Ich verwende Version 2013.
Ich habe mein File angehängt. Das ist sehr umfangreich. Zusätzlich steht die komplette Optimierung in einer Schleife, da ich die Optimierung für verschiedenen Szenarien durchführen möchte, die zuvor global definiert habe.
Das Problem ist Bestandteil eines wissenschaftlichen Papers, welche ich für meine Promotion benötige. Ich hoffe, mir kann jemand weiterhelfen.
Rückfragen bitte jederzeit gerne. Ich bin wirklich auf eure Hilfe angewiesen.
Verfasst am: 25.12.2018, 10:53
Titel: Kommentar zu meinem Beitrag
Es gibt doch den Befehl "matlabFunction". Damit sollte es doch eigentlich möglich sein, meinen symbolischen Ausdruck in eine für die Optimierungsfunktion verarbeitbare Funktion umzuwandeln.
Dazu formuliere ich alle meine Funktionen in rein symbolische Ausdrücke, also ohne @-Zeichen. Alle Variablen t deklariere ich zusätzlich zu den Laufvariablen k und tau als symbolische Ausdrücke.
Dann kann ich meine Zielfunktion ebenso wie jetzt Stück für Stück aus den symbolischen Ausdrücken zusammensetzen und dann im letzten Schritt mittels dem Befehl "matlabFunction" in eine Funktion umwandeln, so dass ich es an die Optimierungsroutine übergeben kann.
ich habe das an einem einfachen Beispiel gemacht aber leider bekomme ich immer eine Fehlermeldung. Der Code ist im Anhang. Wenn ich es im kleinen Beispiel zum Laufen bekomme, dann sollte es doch auch im großen funktionieren.
Fehlermeldung:
Code:
Warning: Length of lower bounds is > length(x); ignoring extra bounds.
> In checkbounds at 28
In fmincon at 336
In test2 at 43 Warning: Length of upper bounds is > length(x); ignoring extra bounds.
> In checkbounds at 42
In fmincon at 336
In test2 at 43 Warning: To use the default trust-region-reflective algorithm you must supply the gradient in the objective function and set the GradObj option to 'on'.
FMINCON will use the active-set algorithm instead. For information on applicable algorithms, see Choosing the Algorithm in the documentation.
> In fmincon at 520
In test2 at 43 Warning: Your current settings will run a different algorithm (interior-point) in a future release.
> In fmincon at 525
In test2 at 43 Error using makeFhandle/@(t1,t2)-(t1+2.0).*(t1-5.0).*(t1.*(t1-t2+2.0)+(t1+t2).*(t1+2.0)-t1.*(t1+1.0).*(1.0./2.0))
Not enough input arguments.
Error in test2 (line43)
x = fmincon(objective,t0,Ao,bo,Aeq,beq,lb,ub,c,ceq);
Caused by:
Failure in initial user-supplied objective function evaluation. FMINCON cannot continue.
Verfasst am: 27.12.2018, 11:56
Titel: Zusammenfassung aller Punkte meines Optimierungsproblems
Liebe Matlabgemeinde,
bezogen auf meine obige Fragestellung fasse ich hier nochmal meine Punkte zusammen und auch meine versuchten Lösungsansätze.
Ich habe ein Optimierungsproblem mit einer Zielfunktion, die aus mehreren Funktionen zusammengesetzt ist, da die Zielfunktion zu komplex ist, um sie in einem Stück hin zu schreiben. Bis zu dem Punkt, an dem die Zielfunktion aus den einzelnen Funktionen zusammengesetzt werden soll, funktioniert alles problemlos. Das Problem entsteht bei der Formulierung der Summenfunktion der Zielfunktion.
1. Ansatz:
Ich habe alle Teilfunktionen, die in die finale Zielfunktion eingehen als Funktionen deklariert. Die Summe der Zielfunktion habe ich dann symbolisch definiert mit k und tau als symbolische Laufvariablen und t als Optimierungsvariable (nicht symbolisch). Alle drei Variablen sind aber Bestandteil der Zielfunktion. Problem hierbei ist, dass die Optimierungsroutine (fmincon) keinen symbolischen Ausdruck als Eingabeparamter übernimmt.
Lösung: Ich wollte mit matlabFunction den symbolischen Summenausdruck in eine Funktion umwandeln und dann an fmincon übergeben. Das wäre für mich die einfachste und eleganteste Lösung.
Problem hierbei ist, dass der Ausdruck zwar in eine Funktion umgewandelt wird, aber mit allen Variablen als einzelne Inputparameter für die Funktion. Damit meine ich, dass mein Optimierungsproblem aus vier Variablen besteht und ich diese als t (Vektor) mit t(1)...t(4) in meine Funktionen einsetze und für fmincon dann einen Startvektor t0=[t1,...,t4] übergebe. Wenn ich zuvor t als symbolisch oder t1 bis t4 als symbolisch definiere, habe ich das Problem, dass ich am Ende nach Umwandlung des symbolischen Ausdrucks in eine Funktion, eben nur t als Variable oder t1 bis t4 als Variablen habe. Das kann ich aber nicht so wie von fmincon verlangt in Form eines einzelnen Vektors eingeben. Zumindest habe ich es nicht geschafft. Habe alles mögliche probiert. Ich bekomme dann immer als Fehlermeldung "fimcon not enough input arguments".
2. Ansatz
Ich setze meine Zielfunktion mit Hilfe einer for-Schleife zusammen.
In dieser Form (ein kleines Beispielprogramm, um die Routine zu testen und nicht das Original-Problem, Programm im Anhang):
Code:
f1 = @(t) t;
summe = @(t)0;
%symbolische Summenfunktion als Zielfunktion
for t = 1:3
summe = @(t)summe(t) + f1(t);
disp(['f1(t) = ' num2str(f1(t))]) disp(['summe(t) = ' num2str(summe(t))]) end
Dies habe ich in einem Forum gesehen, nur leider funktioniert das nicht so wie ich denke, dass es laufen sollte.
Ich erhalte die folgende Ausgabe, anhand derer ich erkennen kann, dass falsch summiert wird.
Eigentlich sollte summe(t) beim dritten Durchlauf 3 als Ergebnis liefern und nicht 9. Ich verstehe absolut nicht warum hier 9 raus kommt.
Der letzte Ansatz wäre noch, dass ich meine benötigten Laufvariablen k und tau als Vektoren definiere und am Ende die Summenfunktionen vektorisiert erstelle und in einen Vektor schreibe. Dann kann ich mit der sum-Funktion für die erstellten Vektoren k und tau die Funktionen vektorisiert auswerten und summieren.
Ansatz 1 wäre mir allerdings am liebsten, weil am einfachsten zu handeln.
Vielleicht weiß jemand, warum alle bisherigen Lösungen nicht funktionieren.
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.