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

Frage zu fmincon

 

psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 14:57     Titel:
  Antworten mit Zitat      
Wenn ich in mycon mit dem Curser über j fahre kommt die Nachricht:Replace complex i und j by 1i for speed and rubstnuess.

Das verstehe ich überhaupt nicht. Das sind doch ganz simple natürliche Zahlen .
Private Nachricht senden Benutzer-Profile anzeigen


psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 15:00     Titel:
  Antworten mit Zitat      
Wenn ich in mycon mit dem Curser über j fahre kommt die Nachricht:Replace complex i und j by 1i for speed and rubstnuess.

Das verstehe ich überhaupt nicht. Das sind doch ganz simple natürliche Zahlen .

Also unterm Strich kriege ich einfach nicht gebacken, dass mycon die Parameter übernimmt. Ich hab jetzt auch schon alles versucht...so kommts mir vor.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.02.2011, 15:51     Titel:
  Antworten mit Zitat      
Hallo,

schnelle Antwort: i und j ist per Default die imaginäre Einheit.
Wenn es nicht überschrieben wird, bleibt es dabei.

Unterfunktionen haben einen getrennten Workspace(Arbeitsbereich). Alle benötigten Variablen müssen also übergeben werden.

Ich kann das später gerne probieren; hilfreich wäre ein *ausführbarer* Beispielaufruf (also kleine Testdaten für j, koschiefe etc.).

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 17:08     Titel:
  Antworten mit Zitat      
Es wird jetzt sicher kompliziert, aber ich habe mal ein rar file angehnagen.

Der Aufruf würde so aussehen z.B.

Code:

Gewichte=mark_opt(datenvektor_bereinigt,numel(find(datenvektor_bereinigt{1,i}{2,1}(:,1))),i,koschiefe{1,i}{1,1})
 


Ich würde i=5 nehmen. Dann sieht man wenigstens was. Am fünten Tag sollen 3 Aktien im Portfolio sein. Anvielen anderen TZag nur eine. Da gibt es ja nichts zu optimieren.

Code:

Gewichte=mark_opt(datenvektor_bereinigt,numel(find(datenvektor_bereinigt{1,5}{2,1}(:,1))),5,koschiefe{1,5}{1,1})
 



datenvektor_bereinigt enthält 16 Tage, für jeden Tag sind Rendite Prognosen, die Kovarianzmatrix der betrachteten Aktien und ein paar andere Dinge eingetragen, die hier nicht gebraucht werden. In der dritten Zelle jedes Arrayeintrages befindet sich die Kovarianzmatrix und in der fünften Zelle sind die Renditen.

Dieser Befehl:
Code:

numel(find(datenvektor_bereinigt{1,5}{2,1}(:,1)))
 


Gibt die Anzahl der Aktien an. Wenn man mal in datenvektor_bereinigt{1,5}{2,1} schaut, sieht man, dass am fünften Tag drei der 15 Aktien in Portfolio sollen. Aktien 2/4/7.

Die Koschiefe übergebe ich auch, aber ich kann sie ja im Moment noch nicht benutzen.

Ineffizienter Weise übergebe ich im Aufruf des Files immer das komplette Array Datenvektor und suche erst in dem mfile aus, was ich davon brauche.


In Dem mfile mark_opt entspricht j einfach der Anzahl der x Variablen, die ich brauche (im Fall i=5 brauche ich drei) und k gibt an, wo ich mich in datenvektor_bereinigt befinde (i=k), damit er weiß, welche Daten er nehmen muss.

Die neuen Sachen, unten, habe ich natürlich auskommentiert, weil sonst ja nichts funktioniert. Es muss wie gesagt nur j=Anzahl der Aktien und die koschiefe Matrix nach unten in diese Subfunktion übergeben werden. Und diese ist dann die nonlcon Bedingung.


Vielen Dank nochmal für die Hilfe.
Ich hoffe, Du kommst damit klar. Ich würde es so mal eben nicht (-:[/code]

Test.rar
 Beschreibung:

Download
 Dateiname:  Test.rar
 Dateigröße:  3.08 KB
 Heruntergeladen:  274 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.02.2011, 19:24     Titel:
  Antworten mit Zitat      
Hallo,

hier ein lauffähiger Vorschlag mit minimalen Änderungen und einer, der etwas mehr verändert, meines Erachtens besser aussieht und dieselben Resultate bringt. Allerdings habe ich meine Zweifel, dass dein Problem in der gewünschten Form gelöst wird, weil die Gewichte Unsinn sind.

Insbesondere ist koschiefe ja keine 3D-Matrix, sondern ein "komisches" Cell-Array.

Du solltest vor allem auch versuchen, der Übersichtlichkeit halber deine ganzen Schleifen in Matrix-Vektor-Operationen umzuwandeln.

Grüße,
Harald

mark_opt_besser.m
 Beschreibung:

Download
 Dateiname:  mark_opt_besser.m
 Dateigröße:  1.12 KB
 Heruntergeladen:  380 mal
mark_opt.m
 Beschreibung:

Download
 Dateiname:  mark_opt.m
 Dateigröße:  1.01 KB
 Heruntergeladen:  387 mal

_________________

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 19:28     Titel:
  Antworten mit Zitat      
Warum wird mein Problem nicht gelöst? Also dieses Problem (i=5) kann tatsächlich nicht geköst werden, weil die Renditeprognosen nicht so groß sind, dass das Portfolio die 5% -Hürde knacken könnte. Aber insgesamt funktioniert, meiner Nachrechnungen nach, das Prinzip. Wenn ich mich da natrülich irgendwo vertan habe, was mir bis jetzt wie gesagt noch nicht aufgefallen ist, dann wäre das seeeeehr schlecht.

Ich habe die Koschiefe nur in dieser Form geschrieben, weil ich so sehr gut die Indizies im Auge behalte.
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 19:32     Titel:
  Antworten mit Zitat      
Es wird ja im Prinzip nur folgendes Zusammengesetzt:

http://studix.wiwi.tu-dresden.de/Wi.....5f1d43e98cc8c7011f095.png

Das ist die das QUADRAT DER Funktion z.

Zuletzt bearbeitet von psigh am 23.02.2011, 19:40, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 19:39     Titel:
  Antworten mit Zitat      
Und noch ein Frage. Was ich schon lange nicht kapiere ist folgendes: Ich sehe z.B. schon ein Ergebnis, bei dem ein Gewicht die Größe 0.001 hat. Das ist doch aber in der Minimierungsfunktion schon gar nicht gestattet. Ich habe doch die lower bounds auf 0.05 gesetzt.

Zuletzt bearbeitet von psigh am 23.02.2011, 19:53, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.02.2011, 19:52     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Warum wird mein Problem nicht gelöst?

Eine Antwort auf deine Frage gibst du ja unmittelbar danach: wenn es keine Lösung gibt, kann auch keine gefunden werden. Die Richtigkeit der Problemstellung und ihrer Umsetzung kann ich nun beim besten Willen nicht überblicken.

Im schlimmsten Fall ist es so, dass die Vorgaben widersprüchlich sind: einfaches Beispiel: Bonds A, B und C haben 2, 3 und 4% Rendite. Konstruiere ein Portfolio daraus, das positive Gewichte hat und 5% Rendite abwirft -> geht nicht. Wenn also Nebenbedingungen verletzt sind, kann das daran liegen.

Am einfachsten wäre es, ein lösbares Problem, bei dem man die annähernde Richtigkeit der Lösung verifizieren kann, als Testproblem zu verwenden.

Wenn du koschiefe als Cell Array haben willst, schön. Dann ist es aber meines Erachtens unsinnig, da mit 3 Indizes hineinzuindizieren.

Zum Link: das sollte sich übersichtlicher umsetzen lassen. Letztlich ist das x'*M*x mit einer geeigneten Matrix M.

Grüße,
Harald

Edit: Zusatzinfo: Du solltest dir auf jeden Fall exitflag ansehen. Wenn exitflag <= 0 ist, heißt das, dass die Ergebnisse mit Vorsicht zu genießen sind - siehe Doku von fmincon.
_________________

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 20:01     Titel:
  Antworten mit Zitat      
Also zuerst einmal: Vielen Dank für die Arbeit, die Du Dir gemacht hast. Das hat mir super geholfen!


Das Beispiel mit den Bonds kann des öfteren vorkommen. Aber was macht der Algo dann? Eigentlich dürfte ja dann gar keine Lösung rauskommen. Oder auch gut wäre, wenn Folgendes passieren würde:

Eine Nebenbedingung ist nicht erfüllbar->dann diese weglassen und nur mit der übrigen arbeiten (Hier Mindestrendite). Wenn die nächste Nebenbedingung auch nicht erfüllbar ist->auch diese weglassen und einfach nur z minimieren. Aber der Punkt ist: Die Bedingungen oben (Grenzen/Summer der Gewichte gleich ein) müssen IMMER eingehalten werden.

Das mit der Koschiefe ist auch etwas neues für mich. Ich habe einfach die Definition umgesetzt, die ich gefunden habe.

Die Kurtosis/CoKortosis Matrix wäre 4-dimensional.


Mein Problem mit fmincon ist einfach folgendes: Es kommt anscheinend immer was raus (-: Ich mache ja Massendaten. Da kann ich nicht immer bei jedem nachgucken, ob das kleinste Gewicht auch wirkich >=0.05 ist usw. Deshalb bin ich jetzt etwas geschockt. Das sollte nicht passieren. Ich habe auch noch zusätzliche Nebenbedingungen, die ich hinzufügen möchte. Und wenn dann einfach kein Portfolio mehr machbar ist, soll eben nur die Varianz minimiert werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.02.2011, 21:38     Titel:
  Antworten mit Zitat      
Hallo,

dein Vorschlag ist nicht umsetzbar, da ja andererseits alle NB gleich behandelt werden sollten. Man kann also nicht einfach irgendeine weglassen.
Zudem geht man allgemein davon aus, dass der Anwender ein Problem stellt, das auch eine Lösung hat.

Du sollst ja auch nicht von Hand nachsehen.
Beispiel eines Umgangs mit dem Ergebnis:
Code:
if exitflag <= 0
warning('Optimierung könnte falsche Ergebnisse liefern')
if any(x < lb - 1e-6) % Standardtoleranz
disp('untere Schranke verletzt')
end
if any(x > ub - 1e-6)
disp('obere Schranke verletzt')
end
[c, ceq] = mycon(x, j,koschiefe);
if any(c) > 1e-6
disp('Ungleichungs-NB verletzt')
end
if any(abs(ceq)) > 1e-6
disp('Gleichungs-NB verletzt')
end


Natürlich kannst du diese Informationen auch zurückgeben und in irgendeiner Form mit den Ergebnissen speichern. Und du kannst auch so vorgehen, dass du im Falle einer erfolglosen Optimierung einfach eine neue Optimierung anwirfst, in der du (nach deiner [!!] Wahl) Bedingungen weglässt.

Vor allem aber würde ich versuchen nachzuvollziehen, ob die Ergebnisse bei bestimmten Daten auch sinnvoll sind. Ansonsten darfst du dich in deiner Implementierung auf die Fehlersuche machen.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2011, 14:44     Titel:
  Antworten mit Zitat      
Vielen Dank für die Antwort. Ich werde veruschen, diese Warnunge da einzubauen. Was ich aber immer noch grundsätzlich nicht verstanden habe ist:


Wenn doch eine oder mehrere Bedingungen nicht erfüllbar sind, wie interpretiere ich denn dann das Ergbniss? Matlab sagt dann ja nicht "Error, Minimierung klappt nicht", sondern es kommt ja was raus. Wie interpretiert man das?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.02.2011, 15:20     Titel:
  Antworten mit Zitat      
Hallo,

fmincon versucht, ein lokales Minimum zu finden, das die NB erfüllt.
Wenn der Algorithmus daran scheitert, wird neben dem letzten Vektor x eine exitflag ausgegeben, die angibt, woran der Algorithmus gescheitert ist.

Man könnte also x als den Punkt interpretieren, an dem fmincon nicht mehr weitergekommen ist. Wenn dieser Punkt (wie in deinem Fall) wichtige Nebenbedingungen nicht erfüllt, kann dieses x auch vollkommen wertlos sein, und es kann heißen, dass du evtl. dein Problem umformulieren oder bestimmte NB weglassen musst - siehe letzter Beitrag.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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 - 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.