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

Inner Dimension Error mit fmincon (Drehe langsam durch)

 

gnotari
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2012, 12:42     Titel: Inner Dimension Error mit fmincon (Drehe langsam durch)
  Antworten mit Zitat      
Hallo ihr Lieben

Bin neu hier im Forum und grüsse euch herzlich. Kämpfe jetzt seit nem Tag mit fmincon und muss ehrlich sagen, ich glaube ich habe den noch nicht ganz verstanden.

Folgendes Problem

Code:

function fval = FitnessFunction_MDP(cov, x, stock_risk)
    fval = -((x'*stock_risk)/sqrt(x' * cov * x));      
end
 


ergibt folgenden Error:

Error using *
Inner matrix dimensions must agree.

Error in FitnessFunction_MDP (line Cool
fval = -((x*stock_risk)/sqrt(x' * cov * x));

Error in @(x)FitnessFunction_MDP(covMatrix,x,stock_risk)


Error in fmincon (line 601)
initVals.f = feval(funfcn{3},X,varargin{:});

Caused by:
Failure in initial user-supplied objective function evaluation. FMINCON cannot continue.


Wenn ich die Gleichung aber im Commandfenster eingebe kriege ich einen sauberen Skalar.

Ich hoffe ich drück mich halbwegs gescheit aus. Ist das ok, wie ich post? Oder soll ich den ganzen code liefern?

Lieben Gruss,

Gianni

PS: Wenn ich das Skript nochmals ausführe kriege ich ein brauchbares Resultat. Woran kann das liegen? Bringt mir eben nicht viel weil, ich den Solver in einer Schleife einsetzen möchte.
Private Nachricht senden Benutzer-Profile anzeigen


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2012, 13:10     Titel:
  Antworten mit Zitat      
Hallo gnotari,

setze einen Breakpoint auf die Zeile fval=...
und starte das Programm und schau nach,
welche Dimensionen cov, x und stock_risk
haben. Dann verfolge zurück, wo die Variable,
die nicht die erwarteten Dimensionen hat
gesetzt wird.

Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
gnotari
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2012, 13:22     Titel:
  Antworten mit Zitat      
Wahnsinn wie schnell die Antwort kam. Ich danke dir Sirius. Habe ich gleich getan.

Resultat:

Code:
K>> size(x)

ans =

   191     1

K>> size(stock_risk)

ans =

   191     1

K>> size(cov)

ans =

   191   191


Gibt wenn ich Nenner und Zähler ausrechne:
Code:
K>> nenner = x'*stock_risk

nenner =

    0.0133

K>> zaehler = sqrt(x' * cov * x)

zaehler =

    0.0073


Sieht von meinem bescheidenen Standpunkt her gut aus. *kopfkratz*
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2012, 13:27     Titel:
  Antworten mit Zitat      
also passt ja alles und es kommt ein Skalar als Ergebnis raus.
Private Nachricht senden Benutzer-Profile anzeigen
 
gnotari
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2012, 13:30     Titel:
  Antworten mit Zitat      
Ok... Dann mach ich beim Solver definieren nen Fehler. Ich kopier hier den Teil des Codes rein, der zickt. Ich hoffe ich finde jemand gütigen, der sich das antut.

Code:
   % Covariance matrix of previous two years returns (rolling window of two years: 504 days)
    covMatrix = cov(returns((month-25)*daysPerMonth+1:(month-1)*daysPerMonth,:));
   
    % Volatility of each stock for the rolling window
    for i = 1: numOfStocks,
        stock_risk(i) = std(returns_mt(:,i));
    end
    stock_risk = stock_risk';
   
    Aeq = ones(1,numOfStocks); % Matrix for linear equality constraints
    Beq = 1;
    x = zeros(numOfStocks); % Matrix for linear equality constraints
   
    lbnds = zeros(numOfStocks,1);    %lower bound = 0, no short selling
    ubnds = ones (numOfStocks,1);    %upper bound = 1, no leverage
   
    qoptions = optimset('Display', 'off', ...
                      'Algorithm','interior-point', ...
                      'MaxFunEvals', 500000, ...
                      'TolFun', 1e-20) ;    %optimisation options structure
   
    starting_weight = 1.0/numOfStocks;  

    initial_weights = repmat(starting_weight, numOfStocks, 1) ; % w0 = n1*ones(Ndim,1); sets initially same weights for all stocks, gives matrix
   
    NLLfunction = @(x) FitnessFunction_MDP(covMatrix, x, stock_risk) ;
   
    [weights, fval, sqpExit] = fmincon(NLLfunction, initial_weights, ...  % starts to minimize function NLLfunction with initially estimated equal weights w0
                                     [], [], Aeq, Beq, lbnds, ubnds, [], ...
                                     qoptions) ;
    weights = weights'
    %check if weights sum up to 1
    sumw = sum(weights)


Wie gesagt: Wenn ich den zwei mal mit ctrl+Enter und ner break Anweisung nachher ausführe, dann gibt er mir ein einmaliges Resultat. In der Schleife funktionierts dann sowieso nicht mehr. Komisch...

Lieben Gruss,

Gianni
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: 09.12.2012, 14:06     Titel:
  Antworten mit Zitat      
Hallo,

ich würde cov nicht als Variablenname verwenden, da cov auch eine Funktion ist (die du zudem ja auch verwendest) und man da in diesem Zusammenhang durcheinander kommen könnte.

Als nächstes würde ich
Code:

setzen und dann dieselben Tests bzgl. Dimensionen nochmal machen.

Für weitere Unterstützung müsstest du lauffähigen Beispielcode zur Verfügung stellen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
gnotari
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2012, 14:31     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

Für weitere Unterstützung müsstest du lauffähigen Beispielcode zur Verfügung stellen.

Hi,

Nichts leichteres als das. Im Anhang findest Du die auszuführende und die Funktions-datei. Plus den Datensatz. Es liegt wirklich nur an der Funktion und dem Solver konfigurieren. Der Rest funktioniert.

Ich danke euch jetzt schon 1000 mal. Habe morgen Abgabe Thermin,

Gianni

MDP.zip
 Beschreibung:

Download
 Dateiname:  MDP.zip
 Dateigröße:  3.67 MB
 Heruntergeladen:  748 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: 09.12.2012, 17:44     Titel:
  Antworten mit Zitat      
Hallo,

das Problem ist eine unsaubere Programmierung.

Code:
   for i = 1: numOfStocks,
        stock_risk(i) = std(returns_mt(:,i));
    end
    stock_risk = stock_risk';


Beim ersten Durchlauf wird stock_risk als Zeilenvektor angelegt, danach transponiert --> alles scheint gut.
Beim zweiten Durchlauf ist jedoch stock_risk ein Spaltenvektor, ein paar Elemente wird überschrieben, dann wird es transponiert --> man hat einen Zeilenvektor und wenn fmincon die Zielfunktion auswerten will kommt die Fehlermeldung.

Abhilfe: sauber vorbelegen
Code:
   stock_risk = zeros(numOfStocks,1);
    for i = 1: numOfStocks,
        stock_risk(i) = std(returns_mt(:,i));
    end


Die for-Schleife ist hier sogar unnötig, man könnte auch direkt schreiben:
Code:
stock_risk = std(returns_mt);

da std zu den Funktionen gehört, die spaltenweise angewendet werden.

Ich empfehle dringend, die Code Analyzer-Warnungen (orange Balken rechts im Editor) zu berücksichtigen, dann wäre das Problem gar nicht erst entstanden.

Bei mir läuft der Code inzwischen 5 Minuten und gibt immer mal wieder was im Command Window aus.

Grüße,
Harald

P.S.: mit so relativ umfangreichen Aufgaben sollte man sich nicht am Tag vor der Abgabe beschäftigen müssen, da bei sowas immer mal unerwartete und zeitraubende Probleme auftauchen können.
Private Nachricht senden Benutzer-Profile anzeigen
 
gnotari
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2012, 17:49     Titel:
  Antworten mit Zitat      
Ich danke Dir vielmals Harald. Werde es gleich umsetzen. Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
gnotari
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2012, 18:24     Titel:
  Antworten mit Zitat      
Und ich studiere stundenlang bei meinem Solver rum. Dabei lags an ganz was anderem. Harald, Du bist der Grösste, und hast mir den Tag - oder besser die Nacht - gerettet.

Lieben Gruss,

Gianni
Private Nachricht senden Benutzer-Profile anzeigen
 
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 - 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.