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

Gleichungssystem abspeichern und iterieren

 

ouou
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 22.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2015, 18:09     Titel: Gleichungssystem abspeichern und iterieren
  Antworten mit Zitat      
Hallo,

ich versuche momentan ein Gleichungssystem über mehrere Perioden zu lösen. Was ich am Ende raushaben will sollte ungefähr so aussehen:

1. Ich setzte die Anfangswerte von 4 Zustandsvariablen: Omeg0, E0, uM0, uI0
2. Die Zustandsvariablen lösen ein Gleichungssystem in einer m-Funktion nach 3 Variablen auf: lambda, thetaM, thetaI
3. Mit den Variablen definiere ich die Werte der Zustandsvariablen in der Folgeperiode, also vereinfacht Omeg1=lambd*Omeg0
4. Ich speichere alle neuen Zustandsvariablen als Startwerte und starte den Prozess von vorne, also z.B. Omeg1 = Omeg0

Leider weiß ich im Moment noch nicht, wie ich den Vektor der Zustandsvariablen mit der m-Funktion verbinde und wie ich die Resultate am besten abspeichere. Anhand von verschiedenen Tutorials habe ich bisher diesen Code geschrieben (3 Dateien, ein Mainfile mit der Iteration, 1 Funktionsdatei und eine Datei mit Parametern die ich für die beiden anderen verwende).

Bin für jede Hilfe sehr dankbar!

Equilibrium.m

Code:
parameters01;
options_fsolve = optimset('Display', 'off', 'TolX', 1e-10, 'TolFun', 1e-10, 'MaxIter', 2500, 'MaxFunEvals', 2500);

x0 = [1, 1, 10];
T = 100;
Omeg0 = 0.15;
E0 = 0.007;
uM0 = 0.4;
uI0 = 0.393;


for i = 1:T
              y0 = [Omeg0, E0, uM0, uI0];
              f01 = @(x) equilibriumfun(x,y0);
              [x01,fv01,ef01,op01,jac01] = fsolve(f01,x0,options_fsolve);
              lbd = x01(1);
              thetM = x01(2);
              thetI = x01(3);
             
             
              % update
              Omeg1 = bet_H*(1-alph*z_M*((Omeg0+(1-lbd)*E0)/uM0*Lbar_M)^(alph-1))*Omeg0;
              E1 = bet_B*(gamm*lbd-delt)*E0;
              uI1 = (1-s_I+mu*thetI^(1-iot))*uI0 + s_I;
              uM1 = (1-s_M+mu*thetM^(1-iot))*uM0 + s_M;
             
             
              % save results
              Omeg(i,1) = Omega0;          
              Eq(i,1) = E0;
              uM(i,1) = uM0;
              uI(i,1) = uI0;
              Lambda(i,1) = x01;
 
              % set next iteration
              Omega0 = Omega1;
              E0 = E1;
              uM0 = uM1;
              uI0 = uI1;
end

   


equilibriumfun.m

Code:
function [eqs] = equilibriumfun(x)
parameters01;


%% assign variables
thet_I = x(1,1);                                              
thet_M = x(2,1);                                              
lambd = x(3,1);



%% assign helpful variables                                      
L_M = (1-uI0)*Lbar_M
L_I = (1-uM0)*Lbar_I;
q_M = mu*thet_M^(-iot);                                        
q_I = mu*thet_I^(-iot);                                        
pi_M = thet_M*q_M;                                            
pi_I = thet_I*q_I;                                            
K_I = E0*lambd;
K_M = Omeg0 + (1-lambd)*E0;
r_M = alph*z_M*(K_M/L_M)^(alph-1);                            
r_I = alph*z_I*(K_I/L_I)^(alph-1);                            
Outp_M = (1/L_M)*(z_M * K_M^alph * L_M^(1-alph));              
Outp_I = (1/L_I)*(z_I * K_I^alph * L_I^(1-alph));              
w_M=(et*(Outp_M-r_M*(K_M/L_M)+kapp*thet_M))/(1-(1-et)*b);      
w_I=(et*(Outp_I-r_I*(K_I/L_I)+kapp*thet_I))/(1-(1-et)*b);      
KT = K_I + K_M;                                                  
bet_FM = 1/(1+r_M);                                            
bet_FI = 1/(1+r_I);                                            
R_B = gamm*lambd-delt;

eqs = ones(length(x),1);                                      
eqs(1,1) = (kapp/q_I)*(1-bet_FI*(1-s_I))-bet_FI*(Outp_I-r_I*(K_I/L_I)-w_I);
eqs(2,1) = (kapp/q_M)*(1-bet_FM*(1-s_M))-bet_FM*(Outp_M-r_M*(K_M/L_M)-w_M);
eqs(3,1) = alph*z_M*((Omeg0+E0-lambd*E0)/(L_M))^(alph-1)*(1-1/lambd)-(1/lambd)+gamm-alph*z_I*(lambd*E0/L_I)^(alph-1);
 


parameters01.m

Code:
alph = 0.36;    
bet_B = 0.98895;                                          
bet_H = 0.9956;                                          
delt = 0.005354932;                                      
gamm = 0.1121;                                          
z_I = 1.0704;                                            
z_M = 1;                                                  
b = 0.4;                                                  
et = 0.5;                                                
kapp = 0.213;                                            
Lbar_I = 0.66;                                            
Lbar_M = 1;                                              
s_M = 0.03451;                                          
s_I = 0.03451;                                            
mu = 0.8;                                              
iot = 0.72;                                              
rh_H = (1/bet_H)-1;                                                    
rh_B = (1/bet_B)-1;                                      
 
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.08.2015, 23:05     Titel: Re: Gleichungssystem abspeichern und iterieren
  Antworten mit Zitat      
Hallo ouou,

Das ist ein großes Stück Code und auf Anhieb sehe ich nicht, zu welchem Teil genau diese Aussage passt:
Zitat:
Leider weiß ich im Moment noch nicht, wie ich den Vektor der Zustandsvariablen mit der m-Funktion verbinde und wie ich die Resultate am besten abspeichere.

Ich kann mir unter "Vektor mit M-File verbinden" nichts vorstellen.
Wie Du die Resultate "am besten" abspeicherst, hängt von Deinen Wünschen ab. Was wäre denn da wichtig?

Ich rate Dir, zunächst viel konkretere Fragen zu formulieren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ouou
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 22.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.08.2015, 23:57     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für deine Antwort. Ich weiß das es sehr viel Code ist, ich wollte vollständigkeitshalber alles posten, das File mit den Parametern und der Teil mit den Hilfsgleichungen kann getrost ignoriert werden.

Mit

Zitat:
Leider weiß ich im Moment noch nicht, wie ich den Vektor der Zustandsvariablen mit der m-Funktion verbinde und wie ich die Resultate am besten abspeichere.


meine ich konkret zwei Sachen:

1. Ich möchte folgende Startwerte für die Funktion equilbiriumfun.m einfügen:

Omeg0 = 0.15;
E0 = 0.007;
uM0 = 0.4;
uI0 = 0.393;

2. Nach der ersten Iteration sollen diese überschrieben werden mit den errechneten Werten Omeg1, E1, uM1 und uI1.

Daraus folgen die 2 Fragen:

1. Wie kann ich die Funktion so umschreiben, dass sie sich die Startwerte aus dem Mainfile holt?
2. Wie kann ich dem Mainfile sagen, dass es die Startwerte nach der ersten Berechnung mit den neuen Werten ersetzt?
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: 23.08.2015, 09:52     Titel:
  Antworten mit Zitat      
Hallo,

da kannst du doch genau die gleiche Vorgehensweise anwenden wie in deinem anderen Thread.

1.
Code:
function [eqs] = equilibriumfun(x, y0)

und in equilibriumfun die Komponenten wie Omeg0 aus y0 extrahieren.

2.
machst du doch schon in dem 'set next iteration' - Teil?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 22.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2015, 16:44     Titel:
  Antworten mit Zitat      
1. Genau, ist eigentlich das selbe Problem, allerdings dachte ich, dass ich y0 jetzt als anonyme Funktion festgesetzt habe, so wie du es dort vorgeschlagen hattest. Im Beispiel in der Dokumentation http://de.mathworks.com/help/optim/.....parameters.html#brhkghv-9 sieht es so aus, als könnte die Funktion die Sachen selbstständig aus dem Masterfile extrahieren, aber d.h. ich muss das noch extra festlegen? In der Dokumentation zu http://de.mathworks.com/help/matlab.....cripts-and-functions.html sieht es so aus als könnte ich es mit GLOBAL machen, da kommt bei mir aber auch nur wieder "Undefined function or variable 'uI0'." raus...

Und es ist kein Problem für die späteren Iterationen, dass ich am Anfang des Skripts sowas wie "Omeg0=0.15" stehen habe?
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: 23.08.2015, 18:45     Titel:
  Antworten mit Zitat      
Hallo,

hast du meien Vorschläge umzusetzen versucht? Mit welchem Ergebnis?

Zitat:
y0 jetzt als anonyme Funktion festgesetzt habe

y0 ist ein ganz normaler Vektor.

Zitat:
sieht es so aus, als könnte die Funktion die Sachen selbstständig aus dem Masterfile extrahieren, aber d.h. ich muss das noch extra festlegen?

Ich habe keine Ahnung, was du meinst. Man muss lediglich darauf achten, was die festen und was die variablen Parameter sein sollen. Anhand des Beispiels in der Doku und deines eigenen funktioniernden Beispiels sollte das doch nun wirklich kein Problem sein?

Zitat:
sieht es so aus als könnte ich es mit GLOBAL machen, da kommt bei mir aber auch nur wieder "Undefined function or variable 'uI0'." raus

Man kann es mit global machen, es ist aber unübersichtlich, schwierig zu debuggen, und daher nicht empfehlenswert. Ohne zu wissen, was du nun wo mit global machst, ist es nicht möglich, einen Korrekturvorschlag zu machen.

Zitat:
Und es ist kein Problem für die späteren Iterationen, dass ich am Anfang des Skripts sowas wie "Omeg0=0.15" stehen habe?

Nein, weil du das außerhalb der for-Schleife und damit nur einmalig setzt. Wenn du den Debugger nutzt, kannst du dich auch wunderbar selbst davon überzeugen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 22.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2015, 23:24     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Hilfe, es tut mir Leid, wenn meine Fragen überflüssig erscheinen oder ich den Anschein erwecken, dass ich mich nicht ausreichend mit deinen Antworten befasse, ich versuche bestmöglich deine Tipps umzusetzen. Leider habe ich wirklich nicht viel Basiswissen, ich habe deshalb auch gerade erst verstanden, was du im anderen Thread meintest. Ich dachte die "anonymous function" wäre schon ausreichend mit einem Vektor im Mainfile definiert (hatte damals direkt das mit der Struktur ausprobiert und die anonymous function nicht weiter verfolgt, deswegen habe ich kein funktionierendes Beispiel).

Nach erneuter Lektüre der Dokumentation, habe ich jetzt den Teil mit dem normalen Vektor y0 = [...] ersetzt durch:

Code:
f00 = @(y)myfun(y,Omeg0,E0,uM0,uI0);
y0 = f00(ones(4,1));


und dazu passend ein myfun.m erstellt, die so aussieht:

Code:
function y = myfun(y,Omeg0,E0,uM0,uI0)

y(1)*Omeg0
y(2)*E0
y(3)*uM0
y(4)*uI0


Ist dass ungefähr, was du meintest? Im Moment bekomme ich die Fehlermeldung:

Code:
Warning: Struct field assignment overwrites a value with class "double". See MATLAB R14SP2 Release Notes, Assigning
Nonstructure Variables As Structures Displays Warning, for details.
> In createOptionFeedback (line 33)
  In prepareOptionsForSolver (line 31)
  In fsolve (line 141)
  In Equilibrium (line 19)
Error using @(x)equilibriumfun(x,y0)
Too many input arguments.

Error in fsolve (line 219)
            fuser = feval(funfcn{3},x,varargin{:});

Error in Equilibrium (line 19)
              [x01,fv01,ef01,op01,jac01] = fsolve(f01,x0,y0,options_fsolve);

Caused by:
    Failure in initial user-supplied objective function evaluation. FSOLVE cannot continue.
 
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: 24.08.2015, 09:41     Titel:
  Antworten mit Zitat      
Hallo,

das ist nicht ganz das, was ich meinte. Es sind keine Änderungen nötig außer:

Funktionsinterface
Code:
function [eqs] = equilibriumfun(x, y0)


In der Funktion Variablen extrahieren
Code:
%% Extract
%  y0 = [Omeg0, E0, uM0, uI0];
Omeg0 = y0(1);
E0 = y0(2);
uM0 = y0(3);
uI0 = y0(4);


Der Startvektor x0 muss transponiert werden, weil du in equilibriumfun von einem Spaltenvektor ausgehst.

Jetzt gibt es noch eine Fehlermeldung wegen mu, da es als Funktionsaufruf interpretiert wird, obwohl es als Variable gedacht ist. Man sollte also mu durch einen anderen Variablennamen (z.B. mue) ersetzen.

Wie angehängt läuft der Code durch. Bitte die Änderungen nachvollziehen und überprüfen.
Schließlich gibt es im Editor noch den Code Analyzer, der per roter / oranger Markierung Verbesserungsvorschläge im Code macht. Diese solltest du dir noch ansehen.

Grüße,
Harald

equi.zip
 Beschreibung:

Download
 Dateiname:  equi.zip
 Dateigröße:  1.58 KB
 Heruntergeladen:  273 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
ouou
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 22.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2015, 17:29     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Hilfe und deine Gedulg, ich hatte ursprünglich etwas ganz ähnliches probiert, aber es hat nicht auf Anhieb funktioniert und ich dachte dann, dass es zu leicht wäre. Falls ich eine Dankeswidmung für meine Masterarbeit schreibe, kriegst du auf alle Fälle einen Platz Smile
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.