Verfasst am: 19.05.2009, 14:58
Titel: Code läuft nicht - wo könnte der Fehler liegen
Hallo,
ich bin blutiger Anfänger mit Matlab und sitze jetzt seit 6 Stunden an einem leidigen Problem. Matlab wirft aus, dass die variable "vist" nicht definiert ist - dabei soll der genau die doch berechnen. Das ist echt zum verzweifeln. Sieht vielleicht jemand den Fehler an meinem Code?
Würde mich über Hilfe und Hinweise sehr freuen.
%Simulation von M-Preispfaden
S(1,1:M)=S0 %Anfangswert
for i=1:n
S(i+1,:)=S(i,:).*(1+r*k+sigma*dW(i,:));
end
%Volumenrestriktionen
for i=1:n
vmin<=Vist(i,:)
vmax>=Vist(i,:)
Vist(i,:)=V0+Vist(i-1,:)+Vzu(i,:)-Vab(i,:);
c(i,:)=S(i,:)*Vab(i,:);
p(i,:)=S(i,:)*Vzu(i,:);
h(i,:)=p(i,:)-c(i,:);
end
was soll der Bewirken? Aufjedenfall wird vist nie berechnet und damit ist der Fehler korrekt. vim<=vist() versucht zu vergleichen ob vim kleiner ist als der vist wert, der aber wie gesagt nie berechnet wird.
Auch danach wird vist nicht berechnet sondern es soll aus vist generiert werden. (was ja noch nicht berechnet wurde):
danke für die Antwort und den Hinweis.
Aber selbst wenn ich es so umstricke:
Code:
%Volumenrestriktionen
for i=1:n
vmin<=Vist(i,:)
vmax>=Vist(i,:)
Vist(i+1,:)=V0+Vzu(i,:)-Vab(i,:);
c(i,:)=S(i,:)*Vab(i,:);
p(i,:)=S(i,:)*Vzu(i,:);
h(i,:)=p(i,:)-c(i,:);
end
das sollte soweit gehen allerdings müsste es dann so sein:
Code:
%Volumenrestriktionen
for i=1:n
Vist(i+1,:)=V0+Vzu(i,:)-Vab(i,:);
vmin<=Vist(i,:)
vmax>=Vist(i,:)
c(i,:)=S(i,:)*Vab(i,:);
p(i,:)=S(i,:)*Vzu(i,:);
h(i,:)=p(i,:)-c(i,:);
end
Denk daran, dass der Code nacheinander ausgeführt wird, vim<=vist geht nicht wenn vist noch nicht existiert. Es zeigt dir allerdings auch nur einen binären Wert and, der nicht gespeichert wird.
danke, jetzt funktioniert das mit vist, aber nicht mit vzu ... ohje...gibt es da einen trick, dass die werte gespeichert bleiben bzw. kann ich da geschickt mit schleifen vorgehen, denn so ist das ganze ja nicht rechenbar!?
ich habe jetzt hier noch einmal den kompletten Code. Die Variablen sind ja letztendlich Optimierungsvariblen die ja entsprechend der Zielfunktion optimal "eingestellt" werden sollen. Das ist schon echt zum verzweifeln wie viel Zeit man mit so einem Problem zubringen kann.
Hier habe ich noch einmal den überarbeiteten Code:
%Simulation von M-Preispfaden
S(1,1:M)=S0 %Anfangswert
for i=1:n
S(i+1,:)=S(i,:).*(1+r*k+sigma*dW(i,:));
end
%Volumenrestriktionen
for i=1:n; z=1:M
Vist(1,1:M)=V0 % Anfangswert für Speichermenge
Vist(i+1,z)=Vzu(i,:).*ya(i,z)-Vab(i,z).*yb(i,z); %Speicherfüllstand
ya(i,z)+yb(i,z)<=1 %Schaltvariable, die verhindert, dass zeitgleich ein- und ausgespeichert wird.
vmin<=Vist(i,z)%Füllstandsrestriktion - min
vmax>=Vist(i,z)%Füllstandsrestriktion - max
c(i,:)=S(i,z).*Vzu(i,z); %Kosten für Einspeicherung
p(i,:)=S(i,z).*Vab(i,z); %Erträge für Ausspeicherung
h(z)=sum(p(i)-c(i)); %Verrechnung von Kosten und Erträgen
Vzu(i,:)<=izumax; %Leistunggrenze Einspeicherung
Vab(i,:)<=iabmax; %Leistungsgrenze Ausspeicherung
end
U=max(h);
%Berechnung des Speicherwertes
Wert=U
das Problem ist, ich weiß nicht was du machen willst, sieht auch ziemlich kompliziert aus. Ich muss es im Grunde genommen auch nicht wissen. Das eigentliche Problem ist aber, dass ich das Gefühl habe, das du denkst ein paar Sachen funktionieren in Matlab anders als sie wirklich funktionieren. (Ist wirklich nicht böse gemeint.) Leider hast du mir bisher nicht auf meine Fragen geantwortet was einzelne Codeabschnitte bewirken sollen, bzw. ob Sie so funktionieren sollen, wie ich es dir beschrieben habe:
gibt dir jeweils eine 1 oder eine Null zurück, <= und >= heißt: Ist dieser Wert größer/kleiner als der andere Wert. Das heißt die Passagen könnten in if Abfragen genutzt werden oder um während das Program ausgeführt wird Kontrollwerte zu haben. Allerdings muss dann das Semikolon weggelassen werden, ansonsten macht der Code garnichts und speichert auch nichts.
eigentlich will ich Vzu und Vab so berechnen, dass h maximal wird. So habe ich mir das zumindest vorgestellt. Ich habe vorher mit GAMS modelliert und noch nie mit Matlab - der Synthax und die Vorgehensweise scheint doch grundlegend unterschiedlich zu sein.
Wenn dir dazu etwas einfällt - ich bin über jeden Hinweis dankbar.
ich mische mich mal ein, weil ich das Wörtchen "maximal" vernommen habe. Ich habe zwar selbst noch nicht mit GAMS gearbeitet, aber ich weiß zumindest, worum es da geht.
Matlab ist keine Modellierungssprache für Optimierungsprobleme, sondern ein Werkzeug für allgemeine numerische Berechnungen. Die Elemente "<=", ">=" und "max" haben andere Bedeutung als in GAMS.
Ich nehme jetzt mal an, dass Du ein (lineares?) Optimierungsproblem mit Box Constraints (Schrankenbedingungen) numerisch lösen willst. Dafür gibt es die Optimization Toolbox in Matlab. Sie stellt mit Funktionen wie linprog, fmincon etc. Optimierungsalgorithmen bereit. Auch Schranken können dann modelliert und an die Algorithmen übergeben werden.
Die Funktion max macht etwas ganz anderes: Sie sucht in einem konkreten Vektor das größte Element.
Beschreib mir mal das Optimierungsproblem genauer: Was sind die Variablen, wie sieht die Zielfunktion aus? Dann kann ich Dir einen Solver empfehlen und bei der Umsetzung helfen. Und schau mal nach, ob Du die Optimization TB hast mit
Dann möchte ich auf Basis der simulierten Preispfade folgendes Optimierungsprobelm lösen (Dabei soll der Optimierungslauf für jeden Preispfad durchgefürt werden). Dafür soll dieser Teil als Zielfunktion dienen:
Code:
h(z)=sum(p(i)-c(i)); %Verrechnung von Kosten und Erträgen
U=max(h);
Die Zielfunktion wird noch weiter aufgebohrt (eigentlich will ich cashflows berechnen) - also es werden noch ein paar Kosten- und Ertragsterme dazu kommen. Aber vom Prinzip her soll das mal so die Zielfunktion sein. also sind da p(i) und c(i) die Optimierungsvariablen der Zielfunktion, die mit weiteren, nachgeordeneten Variablen verknüpft sind. Tatsächlich werden die Variablen aber nur durch die genannten nachgeordneten Variablen Vzu und Vab optimal eingestellt. Darüber hinaus habe ich noch Nebenbedingungen, da die Optimierungsvariablen nicht beliebige Werte annehmen können und deren Lösungsraum beschränkt ist.
Code:
%Nebenbedingungen
for i=1:n; z=1:M
Vist(1,1:M)=V0 % Anfangswert für Speichermenge
Vist(i+1,z)=Vist(i,z)+Vzu(i,:)-Vab(i,z)%Speicherfüllstand
vmin<=Vist(i,z)%Füllstandsrestriktion - min
vmax>=Vist(i,z)%Füllstandsrestriktion - max
c(i,:)=S(i,z).*Vzu(i,z); %Kosten für Einspeicherung
p(i,:)=S(i,z).*Vab(i,z); %Erträge für Ausspeicherung
Vzu(i,:)<=izumax; %Leistunggrenze Einspeicherung
Vab(i,:)<=iabmax; %Leistungsgrenze Ausspeicherung
end
%Berechnung des Speicherwertes
Wert=U
Also zusammengefasst. Ich möchte Preise simulieren, die als Parameter in das Optimierungsmodell eingehen. Das sind so die Anfänge dazu. Am Ende wird das woll auf dien stochastisches dynamisches Optimierungsproblem hinauslaufen.
Ich glaube ich brauche für Matlab ein anständiges Tutorial - oder meint ihr ich kann mich da selber einarbeiten!?
Würde mich über weitere Hilfe und Hinweise sehr freuen. Vllt. könnt ich auch auf Beispielprogramm verweisen, wo ich den Synthax gut nachvollziehen kann.
Danke und viele Grüße und einen schönen Herrentag.
die Antwort "ans = 0" bedeutet, dass Du nicht über die Optimization Toolbox verfügst. Das ist schlecht, denn so stehen Dir nur wenige Optimierungsfunktionen in Matlab zur Verfügung. Gerade Nebenbedingungen können dann nur trickreich eingebunden werden. Kannst Du die Toolbox vielleicht beschaffen?
Zum Optimierungsproblem:
Nach Deiner Beschreibung vermute ich, dass Vab und Vzu die Eingangsgrößen, die Optimierungsvariablen, die Stellschrauben sind. Wahrscheinlich suchst Du Werte für vab und Vzu im Zeitverlauf, also je einen Vektor für Vab und Vzu? ya und yb scheinen auch Variablen zu sein. Die sind vielleicht sogar binär? Bitte beschreib das mal genauer.
Wofür stehen eigentlich M und n? Ich habe im Folgenden angenommen, dass n Zeitschritte für Vab und Vzu berechnet werden sollen, um einfach mal ein Beispiel für eine korrekte Formulierung zu geben.
Code:
% Eingangsgrößen mit Startwerten (geraten)
Vzu = zeros(1,n);
Vab = zeros(1,n);
ya = ones(1,n);
yb = zeros(1,n);
x0 = [Vzu(:);Vab(:),ya(:),yb(:)]; % x0 muss ein Vektor mit allen Optimierungsvariablen sein
% Zielfunktion: max h(x) (ya und yb werden hier nicht gebraucht) function h = ziel(x)
Vzu = x(1:n);
Vab = x(n+1:end);
c = S.*Vzu;
p = S.*Vab;
h = -sum(c - p);
end
% obere Schranken: Vab<=iabmax, Vzu<=izumax für alle i; 0<=ya<=1; 0<=yb<=1
upperbound = [izumax*ones(1,n);iabmax*ones(1,n);zeros(1,2*n)];
lowerbound = [zeros(1,4*n)];
% Nichtlineare Nebenbedingungen function[c,ceq] = nonlconst(x)
Vzu = x(1:n);
Vab = x(n+1:2*n);
ya = x(2*n+1:3*n);
yb = x(3*n+1:end);
Vist(1) = V0;
for i=1:n-1
Vist(i+1)=Vist(i)+Vzu(i).*ya(i)-Vab(i).*yb(i); %Speicherfüllstand
end % Vist >= vmin; Vist <= vmax; -> c(x)<= 0
c(1:n) = Vist - vmax;
c(n+1:2*n) = vmin - Vist
% ya(i)+yb(i,z)<=1
c(2*n+1:3*n) = ya + yb -1;
% ya und yb dürfen nur 0 oder 1 sein -> ya^2=ya, yb^2=yb
ceq(1:n) = ya.^2 - ya;
ceq(n+1:2*n) = yb.^2 - yb;
end
Um das zu lösen, brauchst Du wie gesagt eigentlich die Optimization Toolbox, weil Matlab sonst nur unrestringierte Probleme behandeln kann. In der größten Not ginge es aber über eine Penalty-Funktion. Bitte frag nach, wenn Du etwas nicht verstehst.
Eins fällt mir noch ein: Wenn man statt Vab und Vzu nur eine Variable Vdiff nehmen würde, die positiv oder negativ sein dürfte, so wäre das Problem viel einfacher zu stellen. Man bräuchte ya und ab gar nicht... Kann das sein?
vielen Dank für die Hilfe. Ja, also Vab und Vzu könnte durchaus auch als deltaV oder Vdiff festgelegt werden. Ich habe die Unterscheidung eigentlich auch nur gemacht, weil mir nicht sicher war, wie ich das in Matlab so formulieren kann.
Jedenfalls werde ich jetzt deinen Code erst einmal nachvollziehen und versuchen das ganze zu verstehen.
Mit der Optimization-Toolbox - da muss ich mal sehen, ob ich die hier am Lehrstuhl irgendwie noch mit beschaffen kann. Soweit erst einmal vielen Dank...
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.