Verfasst am: 05.05.2020, 15:46
Titel: Numerisches Lösungsverfahren für Standard Nash Gleichgewic
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;
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!
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 ;)
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.
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?
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:
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, 10:06, insgesamt einmal bearbeitet
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:
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.
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 ;)
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)
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 ;)
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.
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 ;)
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.