Verfasst am: 22.07.2015, 13:48
Titel: Nullstellen finden
Hallo,
ich bin absoluter matlab Neuling und möchte den Umgang mit dem Programm für meine Masterarbeit in VWL lernen. Ich habe schon einfache Gleichungen programmiert und verschiedenen matlab docs gelesen, aber leider habe ich große Probleme mit dem Schema, dass mein Professor mir gegeben hat.
Es geht um das Programmieren eines ökonomischen Wachstumsmodells. Da ich davon leider noch sehr weit entfernt bin, hat er mir matlab anhand eines sehr einfachen Beispiels erklärt, dass in seiner Sprechstunde auch noch funktioniert hat - danach aber leider nicht mehr. Ich wäre sehr dankbar wenn sich jemand den Code angucken könnte und mir 1-2 Fragen dazu beantwortet.
Kann mir jemand erklären was genau ich da eigentlich berechnet habe? Wenn ich das Gleichungssystem von Hand löse kommen als Nullstellen 3 und -1 raus. Und was bedeuten die [1,2] im Abschnitt "compute steady state"?
warum benutzt du das? hast du angst das du aus versehen sinnvolle hilfsmittel wie den debugger benutzen könntest? clear all ist nur hinderlich. es löscht alles. jede geladene funktion alles was zeit spaart und auch, was am schlimmsten ist, die debug marken.
Verfasst am: 22.07.2015, 15:12
Titel: Re: Nullstellen finden
Hallo ouou,
Das ist ein Beispiel-Code von Deinem Professor?
Mh. Das ist ein schlechtes Beispiel um Matlab zu lernen.
Wenn der Code von Dir stammt: Da gibt es noch Tipps für Verbesserungen.
Du hast noch nicht erklärt, was an dem Beispiel "nicht funktioniert". Oder meinst Du, dass das Ergebnis von Deinen Erwartungen abweicht? Vielleicht sind Deine Erwartungen falsch? Was bekommst Du denn, wenn Du das Ergebnis in die Gleichung einsetzt?
Das ist Unfug.
clearall
löscht alles mögliche aus dem Speicher, z.B. auch die Breakpoints des Debuggers. Der Debugger ist aber eine extrem wichtige Hilfe beim Programmieren. Ihn zu behindern ist ein absolutes DON'T! für ernsthaftes Arbeiten mit Matlab.
Wozu werden hier alle Fenster geschlossen? Zieht's?
Diesen "brutalen Clear Header" findet man beängstigend oft in Code von Matlab-Anfängern. Wie bist Du auf diese Zeile gekommen?
cputime
ist ein nützlicher Matlab-Befehl. Ihn mit einer lokalen Variablen zu überschreiben ist nicht praktisch.
Zitat:
%% Step 1: Global Variables and Parameters
globalvars01;
parameters01;
Das sind keine "globalen" Variablen, also ist der Kommentar verwirrend. Es ist auch nicht klar, welche Werte aus diesen Scripts übernommen werden. Deshalb sind Funktionen mit wohl-definierten Inputs und Outputs besser.
Zitat:
Und was bedeuten die [1,2] im Abschnitt "compute steady state"?
Vielen Dank für die schnellen und ausführlichen Antworten. Die Lösung war dann ja ziemlich einfach - ich habe einfach nicht gewusst, dass die 1,2 Werte für y sind. Ich dachte ich löse ein ganz anderen Gleichungssystem, tut mir Leid für die Mühen.
Das ist in der Tat ein Code von meinem Professor. Letzendlich sollen die eqs-Gleichungen durch Gleichungen aus meinem ökonomischen Modell ersetzt werden und die y-Variablen Parameter aus einem anderen m-file werden - dann macht das mit den vorgegeben y-Werten auch gleich viel mehr Sinn. Leider ist der Code den er mir gegeben hat nicht sehr intruktiv, und die docs von matlab nachzubauen ist irgendwie einfacher als so etwas vorgegebenes mit so vielen Abkürzungen zu verstehen.
Ich habe den Code den Jan kritisiert hat jetzt rausgenommen und versuche im Moment die verschiedenen Files zu verknüpfen. Es wäre super wenn ihr mir dabei nochmal helfen könntet! Leider muss ich weiterhin die verschiedenen Mfiles benutzen und verknüpfen und habe im Moment Probleme mit der Anzahl der Input Variablen. Aber der Reihe nach:
Mein Modell lässt sich im Steady State auf vier Gleichungen reduzieren, à la K=(alpha*beta)/r. Wenn ich dem obigen Schema folge, sollten das also meine neuen Funktionen für die eqs(1,1)..etc. sein. Also müsste ich die Gleichungen so umstellen, dass 0 rauskommt (also eqs(1,1) = K-(alpha*beta)/r) und eigentlich sollten dann die Steady State Werte rauskommen. Leider klappt das nicht einfach. Im Moment arbeite ich mit drei Files, die meinem Beispiel aus dem Anfang sehr ähnlich sind: Masterfile, Steadystatefunktion und Parameterfile.
Das Masterfile ist genau wie zuvor, allerdings ohne Werte für y. Die sollen aus dem dazugehörigen parameters01.m und der Funktion kommen kommen. In parameters01.m sind 15 verschiedenen Parametern numerische Werte zugeordnet (à la alph = 0.5). Die eigentliche Funktion, steadystate.m, soll diese Parameter aufgreifen und sie als Input Werte für die Funktion benutzen. Das genau scheint aber nicht zu funktionieren, matlab sagt mir als Fehlermeldung "Not enough input arguments".
Ist auch nicht weiter verwunderlich, weil für die Definition des Function Handles y verwendet wird. y wird aber nirgends definiert.
Wenn ich y mit Dummy-Werten belege, ist das nächste Problem, dass du als Startvektor einen Zeilenvektor angibst, in der Zielfunktion aber als Spaltenvektor verwendest. Startvektor transponieren, und es sollte klappen.
Vielen Dank für deine Antwort, Harald. Im handle Tutorial sieht es so aus als würde es reichen y zu definieren indem ich es in die Funktion mit aufnehme, also:
Das ist nicht, wie du fss zuvor definiert hattest. Vor allem aber ist es so nicht sinnvoll: fsolve versucht die Funktion mit einem Argument aufzurufen, fss erfordert aber zwei.
Falls y auch minimiert werden soll, muss man x und y zu einem Vektor (z.B. u) zusammenfassen.
Falls y fest sein soll, muss man es (wie gesagt) vorab definieren.
Was mir gerade erst auffällt: wieso holst du die Parameter aus y heraus und führst ein Skript aus, in dem sie definiert werden? Ist so nicht wirklich sinnvoll.
Also eigentlich soll y nicht minimiert werden, sondern nur die Werte aus dem parameters01.m rausgeholt werden, die bleiben auch so. Warum ich dafür zwei files verwenden muss, weiß ich nicht, aber mein Professor hat mir die Struktur mit einer extra Datei für die Parameter wärmstens ans Herz gelegt...
D.h. ich nehme y wieder raus aus dem handle - aber wie kriege ich die Werte dann in meine Funktion?
Warum ich dafür zwei files verwenden muss, weiß ich nicht, aber mein Professor hat mir die Struktur mit einer extra Datei für die Parameter wärmstens ans Herz gelegt...
Meines Erachtens kein guter Rat. Aus der Hilfe von
fsolve
ist diese Seite verlinkt, in der verschiedene Möglichkeiten zum Umgang mit dieser Situation dargestellt werden. Die Variante mit zwei Dateien ist aus gutem Grund nicht dabei.
http://de.mathworks.com/help/optim/.....ing-extra-parameters.html
Stattdessen würde ich den Weg über anonymous functions wählen. y ist dann der Vektor mit den Parametern und muss vorab im "Masterfile" definiert werden.
Ok, dann werde ich mal versuchen Überzeugungsarbeit bei ihm zu leisten. Kann ich den y(1), y(2)..etc. Werten denn trotzdem Namen zuordnen, sodass ich die Gleichungen in der steadystate.m beibehalten kann?
Ich hab den Code jetzt angepasst und zum ersten Mal wird wirklich etwas berechnet, vielen, vielen Dank! Leider bekomme ich anstatt schöner Werte für K_M,K_L, thet_M und thet_L nur eine Fehlermeldung,dass fsolve das ganze nicht berechnen kann, wegen eines komplexen Wertes, aber das liegt wahrscheinlich an meinem Modell und nicht an der Programmierung, oder?
Code:
Norm of First-order Trust-region
Iteration Func-count f(x)step optimality radius
0552.5559281 1105.95865116.51 Error using lsqfcnchk/checkfun (line135)
User function '@(x)steadystate03(x,y)' returned a complex value when evaluated;
FSOLVE cannot continue.
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.