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

Optimierung einer Zielfunktion mit symbolischen Summen

 

Dominicst25

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.12.2018, 13:27     Titel: Optimierung einer Zielfunktion mit symbolischen Summen
  Antworten mit Zitat      
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.

Viele Grüße
Dominic

test_otse.m
 Beschreibung:

Download
 Dateiname:  test_otse.m
 Dateigröße:  20.68 KB
 Heruntergeladen:  211 mal


Dominicst25

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.12.2018, 10:53     Titel: Kommentar zu meinem Beitrag
  Antworten mit Zitat      
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 fmincon (line 635)
      initVals.f = feval(funfcn{3},X,varargin{:});

Error in test2 (line 43)
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.
 


Ich bin für jede Hilfe dankbar.

Viele Grüße
Dominic

test2.m
 Beschreibung:

Download
 Dateiname:  test2.m
 Dateigröße:  786 Bytes
 Heruntergeladen:  199 mal
 
Dominicst25

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.12.2018, 11:56     Titel: Zusammenfassung aller Punkte meines Optimierungsproblems
  Antworten mit Zitat      
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.

Code:

f1(t) = 1
summe(t) = 1
f1(t) = 2
summe(t) = 4
f1(t) = 3
summe(t) = 9
 


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.

Viele Grüße
Dominic

test2.m
 Beschreibung:

Download
 Dateiname:  test2.m
 Dateigröße:  764 Bytes
 Heruntergeladen:  188 mal
 
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.