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

Numerisches Lösungsverfahren für Standard Nash Gleichgewic

 

DominicAlp
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 05.05.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2020, 16:46     Titel: Numerisches Lösungsverfahren für Standard Nash Gleichgewic
  Antworten mit Zitat      
Hallo, ich habe ein Problem bei der Implementierung eines Lösungsverfahrens (überein Jacobi-Diagonalisierungsverfahren für ein nichtlineares Optimierungsproblem) für ein Nash-Gleichgewichtsproblem.
Das Beispiel findet sich im Detail auf Seite 95-98 in:
Kanzow, Schwartz (2018): Spieltheorie. Theorie und Verfahren zur Lösung von Nash- uund verallgemeinerten Nash-Gleichgewichtsproblemen.
https://doi.org/10.1007/978-3-319-96679-3

Das Beispiel, das ich implementieren möchte findet sich auf Seite 97-98.

Was ich bisher habe ist der Code für das Jacobi-Verfahren

Code:

%
%   Jacobi.m
%   ========
%
%   M-file with the main program for the numerical solution of
%   standard Nash games via the diagonalization method by Jacobi.
%   The current implementation is designed for solving the
%   Cournot oligopoly problem only.
%
% c = [10;8;6;4;2];
% beta = [1.2;1.1;1.0;0.9;0.8];
% L = 5*ones(5,1);
% alpha = 5000;
% gamma = 1.1;
% N=1:5;


eps=1e-5;
kmax=1000;

format long
format compact

warning off

options=optimset('LargeScale','off','Display','off');

[N,x,alpha,gamma,c,beta,L]=feval(@teta_function);
%xhist=[x];

% Initial output
k=0;
disp('  k      x(1)        x(2)        x(3)       x(4)       x(5)    || x_new-x ||')
disp('=============================================================================')
fprintf('%4.0f %11.6f %11.6f %11.6f %11.6f %11.6f\n',k,x(1),x(2),x(3),...
         x(4),x(5));

term=1;





while term==1 & k<kmax

   % Inner loop for Jacobi diagonalization method



   xnew=zeros(N,1);
   for i=1:N

      xi=x(i);
      ximinus=sum(x)-xi;
      [xinew,fval,exitflag,output]=...
      fmincon(@teta_function,xi,[],[],[],[],zeros(N,1),[],[],options,ximinus,...
              c(i),beta(i),L(i),alpha,gamma);
      xnew(i)=xinew;

   end
   
   % Update

   normstop=norm(xnew-x);
   x=xnew;

   %xhist=[xhist x];

   k=k+1;

   % Output at each iteration

   fprintf('%4.0f %11.6f %11.6f %11.6f %11.6f %11.6f %11.7f\n',k,x(1),...
            x(2),x(3),x(4),x(5),normstop);

   % Check termination

   if normstop<eps
      term=0;
   end
   
end

normstop

x

%plot(xhist(1,:),xhist(2,:))
 


Der Code wurde mir von einem der Autoren des Buches zur Verfügung gestellt, da ich mich eigentlich nicht wirklich in Matlab auskenne. Die notwendigen Parameter habe ich am Anfang eingefügt.
Dort wird vor dem eigentlich Jacobi-Verfahren über feval eine Teta-Funktion ausgewertet. Dass das nicht funktionieren kann, ist mittlerweile auch mir klar.

Meine Frage: wie binde ich das Beispiel in das Programm ein?
Ich habe noch eine weiteres .m-File, in dem ich die Auszahlungsfunktion (Theta), die Kostenfunktion sowie die inverse Nachfragefunktion definiert habe.
Mir ist ehrlich gesagt auch nicht 100% klar, wie ich unter
"[N,x,alpha,gamma,c,beta,L]=feval(@teta_function);"
genau die Parameter abrufen soll. Mit der Teta_function kann es nicht funktionieren, soviel ist klar.

Ich hoffe, ich habe alle nötigen Angaben gemacht. Auf das Buch sollte zumindest über ein Uni-Netz in digitaler Form ein Zugriff bestehen. Falls nicht kann ich auch das genaue Beispiel im Detail dazu posten. Vielen Dank im Voraus!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.05.2020, 23:14     Titel:
  Antworten mit Zitat      
Hallo,

teta_function ist eine separate Funktion. Die muss entweder der Autor zur Verfügung stellen oder du musst sie nach seinen wie auch immer gearteten Vorgaben schreiben.

Zitat:
Meine Frage: wie binde ich das Beispiel in das Programm ein?

Was willst du wo "einbinden"?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
DominicAlp
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 05.05.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2020, 08:22     Titel:
  Antworten mit Zitat      
Hallo, vielen Dank für die schnelle Antwort!
Ich möchte die Parameter [N,x,alpha,gamma,c,beta,L] über die Funktion teta_function entsprechend mit einbinden. Das ist letztlich die Funktion, die minimiert werden soll.

Wie du schon sagtest, ist das eine separate Funktion. Aktuell sieht die so aus.

Code:

function [Theta] = teta_function(N,x,alpha,gamma,c,beta,L)
%Auszahlungsfunktion
 
    Theta = cost(x,c,beta,L) - x.*invDemand(x,alpha,gamma);
end

function cx = cost(x,c,beta,L)
    cx = c.*x + beta./(1+beta) .* L.^(-1/beta) .* x.^((1+beta)./beta);
end

function p = invDemand(xi,alpha,gamma)
    p = (alpha./xi).^(1/gamma);
end
 


Allerdings habe ich daran kurzfristig Änderungen vornehmen müssen und jetzt bekomme ich die Fehlermeldung:
"Not enough input arguments.
Error in teta_function (line 4)
Theta = cost(x,c,beta,L) - x.*invDemand(x,alpha,gamma); "

Könnte das daran liegen, dass invDemand erst nach Theta definiert wird?

Grüße,
Dominic
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.05.2020, 09:34     Titel:
  Antworten mit Zitat      
Hallo,

ich bekomme vorher schon eine andere Fehlermeldung:
Zitat:
Error using teta_function
Too many output arguments.
Error in Untitled (line 11)
[N,x,alpha,gamma,c,beta,L]=feval(@teta_function);


Bei deiner Fehlermeldung würde ich eher sagen, dass das Problem die Schnittstelle der Funktion ist. Die Anzahl und Reihenfolge der Argumente scheint mir nicht zusammenzupassen. Setze mal einen Haltepunkt in die erste Zeile von teta_function und schau, was da im Workspace ist.

Ich möchte auch darauf hinweisen, dass im Beispiel-Code veraltete, nicht mehr dokumentierte und damit auch nicht mehr empfohlene Syntax verwendet wird. Insbesondere sollte der fmincon-Aufruf so aussehen:
Code:
... = fmincon(@(x)teta_function(x,c(i),beta(i),L(i),alpha,gamma),xi,[],[],[],[],zeros(N,1),[],[],options,ximinus);


Korrektur:
Code:
... = fmincon(@(x)teta_function(x,ximinus,c(i),beta(i),L(i),alpha,gamma),xi,[],[],[],[],zeros(N,1),[],[],options);


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)

Zuletzt bearbeitet von Harald am 06.05.2020, 11:06, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
DominicAlp
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 05.05.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2020, 10:12     Titel:
  Antworten mit Zitat      
Hallo,

die erstes Fehlermeldung habe ich behoben, indem ich ein extra .m-File (params.m) angelegt habe für eine Funktion, die die nötigen Parameter ausgibt und diese in feval() einlese:
Code:

function [c,beta,L,alpha,gamma,N,x] = params()
%params contains necessary parameters

c = [10;8;6;4;2];
beta = [1.2;1.1;1.0;0.9;0.8];
L = 5*ones(5,1);
alpha = 5000;
gamma = 1.1;
N=1:5;

end
 


Danke außerdem für den Hinweis! Der Code ist sicher mindestens zwei Jahre alt, ich habe dies entsprechend angepasst.

Nun erhalte ich allerdings eine neue Fehlermeldung:
"Error using zeros
Size inputs must be scalar.
Error in Jacobi (line 49)
xnew=zeros(N,1); "

Das wundert mich aber, da zeros(N,1) doch einen Vektor mit 0-Einträgen erzeugt (richtig?) und im Verfahren selbst ja jeweils nur der i-te Eintrag verwendet wird. Insbesonder deshalb, weil xnew auch nur ein Vektor ist und mit zeros(N,1) eine n x 1 Matrix erzeugt wird.

Gruß
Dominic
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.05.2020, 10:25     Titel:
  Antworten mit Zitat      
Hallo,

meine Vermutung ist, dass N fälschlicherweise ein Vektor ist. Statt N = 1:5 erscheint mir N = 5 sinnvoller.

Ich würde sagen, dass die Syntax seit über 10 Jahren nicht mehr empfohlen ist. ;)

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
DominicAlp
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 05.05.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2020, 10:39     Titel:
  Antworten mit Zitat      
Hallo,

danke für den Hinweis! Es passieren allerdings seltsame Dinge bei params und ich sehe auch das Problem.

N wird (ob nun als N=1:5; oder N = 5) im global environment immer als Vektor ausgegeben mit den Einträgen von c, also [10;8;6;4;2], c wiederum nimmt den Wert von alpha an, gamma ist plötzlich ein Vektor und L eine Konstante (es sollte aber andersherum sein), etc....
Alles ist durcheinander und interagiert miteinander und ich verstehe nicht genau, warum.

Ich möchte an dieser Stelle nochmal anmerken, dass ich Matlab Einsteiger bin.

Habe ich die params Funktion falsch definiert? Oder hätte ich diese gar nicht erst als Funktion, sondern als eine Art data frame definieren sollen? (so hätte ich das jetzt in R gemacht)

Gruß
Dominic
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.05.2020, 11:05     Titel:
  Antworten mit Zitat      
Hallo,

wie gesagt: die Reihenfolge im fmincon-Aufruf und die Reihenfolge in teta_function passen m.E. nicht zusammen. Konkret:

fmincon übergibt: ximinus, c(i),beta(i),L(i),alpha,gamma
teta_function erwartet: N,x,alpha,gamma,c,beta,L

In meinem Beitrag von 09:34 war noch ein Fehler, den ich korrigiert habe.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
DominicAlp
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 05.05.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2020, 16:47     Titel:
  Antworten mit Zitat      
Hallo,

ich habe die Reihenfolge angepasst aber dazu eine Frage:

Wenn ich vor dem Jacobi-loop schon
Code:

teta_function = @(x) teta_function(x,ximinus,c,beta,L,alpha,gamma);
 

festlege, muss ich dann in fmincon noch mal alle Parameter eingeben, oder kann ich auch einfach
Code:

fmincon(@(x)teta_function,xi,[],[],[],[],zeros(5,1),[],[],options);
 

festlegen?

Dazu erhalte ich aber folgende Fehlermeldung:
"FMINCON requires all values returned by functions to be of data type double."

Nach wie vor wird mir N im global environment als Vektor angegeben, deswegen habe ich vorerst zeros(5,1) geschrieben, um zu prüfen, ob die Funktion so auch funktioniert, da ich sonst eine Fehlermeldung erhalte dass für zeros(N,1) nur Skalare übergeben werden können.

Gruß

Dominic
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.05.2020, 17:42     Titel:
  Antworten mit Zitat      
Hallo,

du verwendest den Namen teta_function doppelt. Das ist keine gute Idee. Außerdem ist die Definition des Function Handles doppelt gemoppelt.

Was funktionieren sollte:
Code:
teta_fun = @(x) teta_function(x,ximinus,c,beta,L,alpha,gamma);
 
fmincon(@teta_fun,xi,[],[],[],[],zeros(5,1),[],[],options);


Zitat:
Nach wie vor wird mir N im global environment als Vektor angegeben

Dann wirst du N noch irgendwo als Vektor definiert haben.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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 - 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.