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