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

Code läuft nicht - wo könnte der Fehler liegen

 

thomas0815
Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2009, 14:58     Titel: Code läuft nicht - wo könnte der Fehler liegen
  Antworten mit Zitat      
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.


Code:
k=0.01; n=365; W(1)=0; r=0.1; sigma=0.0945; S0=80; M=500; dt=1;
V0=0; vmin=0; vmax=100

%Wiener Prozess
dW=randn(n,M)*sqrt(k);

%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

deltav=Vist(i+1,:)-Vist(i,:);

max(E==sum(exp(-sigma*dt)*h(i)+exp(-sigma*(n+1))*h(i)));

Wert=E

plot(S);plot(deltav);


Vielen Dank und viele Grüße,
Thomas[/code]
Private Nachricht senden Benutzer-Profile anzeigen


derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 19.05.2009, 15:10     Titel:
  Antworten mit Zitat      
Hi,

den Fehler verursacht dieser Absatz:

Code:

vmin<=Vist(i,:)
vmax>=Vist(i,:)
 


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):


Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2009, 15:26     Titel:
  Antworten mit Zitat      
Hallo Oli,

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


funktioniert das nicht. Dabei müssten noch dann Vzu und Vab Optimierungsvariablen sein, aus denen dann Vist hervorgeht - oder sehe ich das falsch?

Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 19.05.2009, 17:23     Titel:
  Antworten mit Zitat      
Hi,

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.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2009, 18:10     Titel:
  Antworten mit Zitat      
Hi oli,

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!?

Viele Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 20.05.2009, 11:01     Titel:
  Antworten mit Zitat      
Hi,

keine Ahnung, in dem Code oben wird Vzu auch nie berechnet, wie berechnest du das?

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2009, 11:25     Titel:
  Antworten mit Zitat      
Hey Oli,

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:

Code:
k=0.01; n=365; W(1)=0; r=0.1; sigma=0.0945; S0=80; M=500; dt=1;
V0=0; Vmin=0; Vmax=100; delta=0.03; izumax=500; iabmax=500;

%Wiener Prozess
dW=randn(n,M)*sqrt(k);

%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

plot(S);plot(deltav);


Bin über jede Hilfe sehr, sehr dankbar.

Viele Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 20.05.2009, 11:49     Titel:
  Antworten mit Zitat      
Hi Thomas,

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:

Code:

Vist(1,1:M)=V0 % Anfangswert für Speichermenge  
 


Ist sinnlos, da der Wert am Ende der Schleife wieder überschrieben wird.


Code:

Vist(i+1,z)=Vzu(i,:).*ya(i,z)-Vab(i,z).*yb(i,z); %Speicherfüllstand
 


Nutzt Vzu, welches noch nicht berechnet wurde und auch nicht berechnet wird.

Code:

Vzu(i,:)<=izumax; %Leistunggrenze Einspeicherung
Vab(i,:)<=iabmax; %Leistungsgrenze Ausspeicherung
 


genauso wie:

Code:

vmin<=Vist(i,z)%Füllstandsrestriktion - min
vmax>=Vist(i,z)%Füllstandsrestriktion - max
 


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.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2009, 13:37     Titel:
  Antworten mit Zitat      
Hey Oli,

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.

Viele Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 20.05.2009, 14:11     Titel:
  Antworten mit Zitat      
Hallo Thomas,

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

Code:
license('test','Optimization_Toolbox')


Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 20.05.2009, 18:58     Titel:
  Antworten mit Zitat      
Hi Bijick,

danke fürs einmischen Smile

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2009, 10:46     Titel:
  Antworten mit Zitat      
Hallo Bijick, Hallo Oli,

also, wenn ich den Code eingebe
Code:
license('test','Optimization_Toolbox')


und komiliere, dann kommt "ans = 0" keine Ahnung wie das zu interpretieren ist.

Nun zu meinem Optimierungsproblem:

In einem ersten Schritt möchte ich Preispfade entsprechend der Monte-Carlo-Simulation simulieren...dafür ist dieser Teil des Codes zuständig.

Code:
%Wiener Prozess
dW=randn(n,M)*sqrt(k);

%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


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.

Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 22.05.2009, 11:28     Titel:
  Antworten mit Zitat      
Hallo Thomas,

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?

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.05.2009, 12:53     Titel:
  Antworten mit Zitat      
Hallo Bijick,

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

Viele Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2009, 09:34     Titel:
  Antworten mit Zitat      
Hallo,

brauche ich um den Code laufen zu lassen die Optimization toolbox - weil so gibt der mir beim Compilieren einen Fehler in der Zeile 9 wieder.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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