|
|
constraints in richtige Form bringen |
|
tomsra101 |

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 10.09.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 10.09.2013, 11:33
Titel: constraints in richtige Form bringen
|
 |
|
 |
|
Hi Leute,
ich bin ganz neu hier im Forum und nachdem ich eine Zeit lang nur im Forum gelesen hab, will ich nun auch mal eine Frage stellen. Ich hoffe sie ist verständlich undihr könnt mir dabei helfen.
Ich hab ne Frage zur Optimierung einer Funktion, genauer gesagt dazu, wie ich die constraints richtig formuliere.
Ausgangslage ist folgende: Ich habe ein Portfolio mit Bonds (Wertpapieren) und den Index (Gesamtheit aller auf dem Markt verfügbaren Bonds). Meine Funktion f berechnet das Transaktionsvolumen (die Menge an Bonds die ich insgesamt kaufe und verkaufe) und ist definiert als
wobei x(i,1)=angibt, wieviel Bonds von Typ i ich nach allen Transaktionen habe und currentweight(i,1) wieviel davor.
So weit so gut, die Funktion und alle benötigten Datenstrukturen sind erstellt.
Mein Problem liegt jetzt bei den constraints:
Ich habe 8 Stück davon und keine ist in der Form geschrieben, wie man sie in Matlab eingeben kann (z.B. x(2)<0)
Die beiden ersten constraints sind:
1) sum(x)=1
2) f<1
Die andern 6 sind Einschränkungen für Arrays die von x abhängen.
Bsp.: [/code]
, wobei YearDuration ein von x unabhängiges array ist
Die erste constraint würde ich formulieren indem ich Aeq=ones(1,129) und beq=1 setze. Ist das so ok? (x ist 129x1-Array)
Kann mir vielleicht jemand dabei helfen, wie man die 2 anderen constraints in Matlab eingeben kann?
Die andern sind dann ähnlich wie die dritte.
Ich bedanke mich schon im Voraus für die Hilfe
tomsra101
|
|
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 10.09.2013, 20:47
Titel:
|
 |
Hallo,
zu f < 1: du versuchst doch f zu minimieren? Ist diese Beschränkung dann nicht überflüssig?
Zu den anderen NB: zumindest das Beispiel ist linear, du kannst das dann also zu Aeq und beq unten anfügen, z.B.
Grüße,
Harald
|
|
|
tomsra101 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 10.09.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 11.09.2013, 14:09
Titel:
|
 |
Zuerst einmal Danke für deine Antwort Harald, sie hat mir sehr geholfen.
Was das "f<1" angeht, stand da wohl echt auf dem Schlauch ^^
Das mit dem Aeq und beq kann ich für 2 NB anwenden.
Die andern 4 sind ungleichungen in der Form:
"Lower Bound< Werte <Upper Bound"
Die Werte lassen sich auch alle linear berechnen, kann das also durch Matrixmultiplikation darstellen.
Ich habs nun so gemacht, dass ich für jede dieser Ungleichungen 2 Zeilen in A und b eingefügt hab (eine für die obere und eine für die untere grenze)
Ich habe also jetzt die Funktion und alle NBs.
Nun muss ich nur noch den Optimizer aussuchen. Die Funktion ist ja eigentlich nicht linear, aber ich dachte man kann sie iwie auf 2 aufteilen um die Betragsstriche wegzukriegen und sie dann mit linprog() zu lösen.
Ist das möglich oder sollte ich einen anderen Solver wählen um mein f zu minimieren?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 11.09.2013, 20:37
Titel:
|
 |
Hallo,
Zielfunktionen wie deine sind an sich unüblich. Warum? abs ist im Minimum nicht differenzierbar, und die meisten Minimierer sind auf differenzierbare Funktionen ausgelegt.
Ich würde stattdessen:
minimieren.
Ein Solver, der dies direkt macht, ist lsqlin mit C = Identitätsmatrix und d = currentweights.
Aeq und beq haben wir dann ja schon, und lb und ub sind für die lower bounds bzw. upper bounds. Wenn einzelne Variablen unbeschränkt sind, kann man für diese -inf bzw. inf als Schranke angeben.
Falls du deine Originalfunktion nehmen musst, bleibt an sich nur fmincon.
Siehe auch hier:
http://www.mathworks.com/help/optim/ug/choosing-a-solver.html
Grüße,
Harald
|
|
|
tomsra101 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 10.09.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 12.09.2013, 09:35
Titel:
|
 |
Ich dachte einen Moment daran abs(x-currentweights) als sqrt((x-currentweights)^2) zu schreiben, aber das würde ja an der tatsache, dass es im minimum nicht differenzierbar ist wahrscheinlich auch nichts ändern.
Dein Vorschlag klingt gut. Der Global Minimizer x dürfte ja für sum((x-currentweights).^2) und mein f der gleiche sein (da ja für a,b>0 folgt, dass: (a>b) <=> (a^2>b^2) ). Anschliessend würde ich dann mein x in die ursprüngliche funktion f einsetzen um den wert zu erhalten.
Ich werde das jetzt mal versuchen und meld mich dann anschliessend nochmal um Bescheid zu geben ob es geklappt hat
Vielen Dank schon mal soweit!
|
|
|
tomsra101 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 10.09.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 13.09.2013, 15:57
Titel:
|
 |
|
 |
|
So , es hat eigentlich ziemlich gut geklappt, ich habe auf jeden Fall eine gültige Lösung rausbekommen.
Danke schon mal dafür
Ich würde allerdings noch gerne 2 weitere constraints einbringen, sofern ich es iwie schaffe, sie passend zu formulieren.
Zur 1.: ich weiss, dass man integer probleme optimieren kann, dass man beim ga-optimierer also angibt welche der koordinaten von x integer-werte sein sollen. nun ist es bei mir allerdings nicht so, dass x integer-werte annehmen soll, sondern dass die werte von x, multipliziert mit einem skalar und anschliessen paarweise geteilt durch werte eines anderen (konstanten) vektors integer-werte ausgeben sollen:
so was in der art
ist das überhaupt möglich und wenn ja wie?
Zur 2.: Es gibt in meiner Simulation 129 verschiedene Wertpapierarten, die ich kaufen kann, von 23 davon besitze ich Papiere. Die Optimierung soll ja nun das Portfolio ermitteln welches die wenigsten Wertpapierkäufe und -verkäufe benötigt und trotzdem alle NBs erfüllt.
Nun ist es so, dass wenn man von einem Wertpapier nur ganz wenige Exemplare kauft (man also eine x-Koordinate hat, die verdammt nah an 0 ist), es sich meist gar nicht wirklich lohnt, diese Papiere zu kaufen, sondern dieses Geld auch lieber in andere Papiere investiert, von denen man schon welche hat.
Das heisst also, man müsste zeitgleich versuchen die Koordinaten von x, die ungleich 0 sind, zu minimieren.
Eine Möglichkeit wäre wahrscheinlich einzugeben (falls das überhaupt möglich ist), dass eine weitere NB ist, dass jede Koordinate von x ENTWEDER grösser als (z.B.) 0.001 ODER 0 sein muss
Ich weiss halt echt nicht wie ich die beiden NBs eingeben soll und hoffe, mir kann jemand da weiterhelfen..
|
|
|
tomsra101 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 10.09.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 17.09.2013, 08:21
Titel:
|
 |
keiner hier der mir weiterhelfen kann? :/
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 17.09.2013, 09:54
Titel:
|
 |
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
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.
|
|