erst einmal vielen Dank für die ganzen Lösungen zu Problemen, die ich bereits als Gast in diesem Forum von euch erhalten habe! Mein aktuelles Problem konnte ich jedoch trotz intensiver Suche nicht lösen, daher bitte ich euch vielmals um Hilfe (und bedanke mich im Voraus).
Ich möchte nacheinander die Nullstellen von 2484 Gleichungen ermittelt, in eine Matrix gespeichert und abschließend ausgespuckt bekommen. Leider wächst mein Arbeitsspeicher mit jeder Berechnung um etwa 2,5MB an, was die ganze Geschichte sowohl auf meinem 32-bit Win 8 als auch 64bit Win 7 unerträglich macht. Durch googlen bin ich auf Lösungsvorschläge wie preallocation (check), löschen von Variablen (check) und Verwendung vom Datentysp single statt double (check) gekommen. Es hilft mir aber alles nicht. Vorhin habe ich nach etwa 400 Berechnungen mal die Schleife gestoppt und mir alle Variablen des Workspaces speichern lassen, die Dateigröße betrug nur 188kb, der verwendete Arbeitsspeicher war jedoch auf über 1GB aufgequollen.
for k=1:1:n
DAXnormcdf(k)=single(normcdf(DAX_Logrets(k),mean(DAX_Logrets),std(DAX_Logrets)));
BMWnormcdf(k)=single(normcdf(BMW_Logrets(k),mean(BMW_Logrets),std(BMW_Logrets)));
end
RESULT=single(zeros(n,1));
for k=1:1:n
k
a1=log(lambda*(1-exp(-lambda))*exp(-lambda*(DAXnormcdf(k)+BMWnormcdf(k))));
a2=log((1-exp(-lambda))-(1-exp(-lambda*DAXnormcdf(k)))*(1-exp(-lambda*BMWnormcdf(k)))).^2;
a3=(-0.5*log(2*pi)-0.5*log(sig1.^2)-0.5*((DAX_Logrets(k)-m1)/sig1).^2)+(-0.5*log(2*pi)-0.5*log(sig2.^2)-0.5*((BMW_Logrets(k)-m2)/sig2).^2);
LokLik1= a1-a2+a3;
equa=diff(LokLik1,lambda);
RESULT(k)=solve(equa,lambda,'Real',true);
clearvars a1 a2 a3 LokLik1 equa
end
RESULT
vielen Dank für die schnelle Antwort! Dass ich LokLik1 (besser gesagt LogLik1 ) maximieren möchte hast du völlig richtig erkannt.
Mit fminunc (danke für den Tipp!) habe ich leider akute Probleme was meinen Laufindex k und Variablennamen angeht, nach denen ich nicht differenzieren möchte. Gebe ich bspw. ein:
Code:
function f = myfun(lambda)
f = -(log(lambda*(1-exp(-lambda))*exp(-lambda*(DAXnormcdf(1)+BMWnormcdf(1))))-log((1-exp(-lambda))-(1-exp(-lambda*DAXnormcdf(1)))*(1-exp(-lambda*BMWnormcdf(1)))).^2+(-0.5*log(2*pi)-0.5*log(sig1.^2)-0.5*((DAX_Logrets(1)-m1)/sig1).^2)+(-0.5*log(2*pi)-0.5*log(sig2.^2)-0.5*((BMW_Logrets(1)-m2)/sig2).^2));
bekomme ich den Fehler Undefined function 'DAXnormcdf' for input arguments of type 'double'. Meine Daten habe ich zuvor alle wieder auf 'double', da mir fminunc vorher mitteilte, dass es nicht über 'single' minimieren möchte.
Gibt es eine Möglichkeit meine Variablen mit in die Funktion zu übertragen (und auch den Laufindex)?
Hol dir von fminunc am besten auch das dritte Rückgabeaargument exitflag zurück und schau, ob auch wirklich ein lokales Minimum gefunden wurde (exitflag > 0).
Die Berechnungen laufen jetzt sehr schnell, die Ergebnisse sehen absolut plausibel aus, der Arbeitsspeicher freut sich über den entspannten Nachmittag und der Tipp mit der exitflag beantwortet die nächste Frage, vor dem ich gestanden hätte.
Vielen, vielen Dank und einen schönen Sonntag!
Stephan
PS: Sollte ich im Laufe der Zeit mal verstehen, wieso der alte Code soviel Arbeitsspeicher gefressen hat, werde ich den Thread updaten.
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.