Verfasst am: 26.06.2019, 14:01
Titel: Not enough input arguments
Hallo ich möchte gerne den Loss eines Models herausfinden.
Mein model wie wie folgt aus:
Code:
%Hybrid NKM under commitment
%% Step 1 define the parameters
%same Parameters as from the script
%Parameters
gam_f = 0.5
gam_b =0.5 beta= 1
gam_x = 0.2
lambda = 0.5
phi = 0.5% IS Parameter for interest rate
sig = 1% IS Parameter for interest rate
AR_par = 0.8
%% Step 2 % System is: (w;v)(+1) = A*[w;v] + [ 1;0;0;0;0]*eps
A11= [AR_par 00;000; 000];
A12= [00; 10; 01];
A21 =[0 -gam_f/(beta^2*gam_b)0; -1/(beta*gam_f)0 -gam_b/gam_f]; %Klammern nicht vergessen
A22 =[1/(beta^2*gam_b) gam_x/(beta^2*lambda*gam_b); -gam_x/(beta*gam_f)1/(beta*gam_f)];
A = [[A11 A12] ; [A21 A22]]
%% Step 3 % using the Schur Decomposition to solve the state equations % solve the system disp('Schur decomposition') [Z, T] = schur(A, 'complex') disp('reorder eigenvalues in increasing order along the principal diagonal') [Z T] = ordschur(Z,T, 1:5) ifabs(sum(sum(Z*T*Z'-A))) > 0.0001 && sum(sum(Z'*Z-eye(lenght(Z)))) > 0.0001 disp('Error in Schur decomposition') end disp('check Blanchard-Kahn')
abs_diag_T = abs(diag(T))'
%% Calculating the solution time path for nu, x and pi using the following law of motion: % z(+1) = E[z(+1)] + Z_11^-1 * [1;0;0] * eps
T_11 = T(1:3,1:3)
Z_11 = Z(1:3,1:3)
Z_21 = Z(4:5,1:3)
T=1000;
z_solution= zeros(3,T); % zeros because we have variables in i with t-1
w_solution= zeros(3,T); % zeros because we have variables in i with t-1
w_solution(:,1)=[1; 0; 0]; %initial jump
z_solution(:,1)=inv(Z_11)* w_solution(: ,1);%initial jump
v_solution= zeros(2,T);
i_solution= zeros(1,T); % nominal interest rate: IS umgestellt nach der Variable i.Hier liegt anscheinend das Problem. for t= 2:T
z_solution(:,t)= T_11* z_solution(: ,t-1);
w_solution(:,t)= Z_11 * z_solution(:,t);
v_solution(:,t)= Z_21 *inv(Z_11)* w_solution(:,t);
end for t= 1:T-1
i_solution(:,t) =((1- phi)*v_solution(1,t+1)+phi*w_solution(2,t)-w_solution(2,t+1))*sig+ v_solution(2,t+1); % Jump in 1 anstatt 2. umgestellte IS-Kurve. end;
Um den Loss zu berechnen benötige ich die v_solution, da es ein Vektor ist, der die beiden variablen x und pi enthält. Ich benötige den Mittelwert dieser beiden für die Lossfunktion.
Ich bekomme immer die Fehlermeldung:
Not enough input arguments.
Error in lossc (line 3)
vol_pi = (mean(data.v_solution(2,T).^2));
Ich habe schon einen Hinweis bekommen, dass ich eventuell die input Argumente gar nicht eingesetzt habe? und ich T in der Loss funktion auch nochmal definieren muss.
wie rufst du Loss_Fun denn auf? Die Funktion braucht drei Inputs. Die Fehlermeldung legt nahe, dass du weniger (oder gar keine) übergibst.
Zitat:
Ich habe schon einen Hinweis bekommen, dass ich eventuell die input Argumente gar nicht eingesetzt habe? und ich T in der Loss funktion auch nochmal definieren muss.
Beides zutreffend.
w_pi und w_x müssen auch definiert werden, bevor sie verwendet werden.
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 ;)
Verfasst am: 26.06.2019, 16:20
Titel: Re: Not enough input arguments
Hallo Lisa89,
Die meisten Leser werden nicht wissen, was der "Loss eines Modells" ist. Aber die Fehlermeldung hat ja auch nichts mit der Bedeutung der Zahlen zu tun.
Dann wird die gesamte Zeile verwendet, auch ohne dass T benötigt wird.
Zitat:
Um den Loss zu berechnen benötige ich die v_solution, da es ein Vektor ist, der die beiden variablen x und pi enthält. Ich benötige den Mittelwert dieser beiden für die Lossfunktion.
Das spielt für den eigentlichen Fehler keine Rolle, oder?
Zitat:
Ich habe schon einen Hinweis bekommen, dass ich eventuell die input Argumente gar nicht eingesetzt habe? und ich T in der Loss funktion auch nochmal definieren muss.
Stimmt. Du kanntest also die Lösung schon. T weg zu lassen ist noch einfacher.
Bemerkung:
inv
ist nicht nützlich. Lies mal in der Dokumentation nach, wieso man besser den Slash-Operator verwendet.
wie rufst du Loss_Fun denn auf? Die Funktion braucht drei Inputs. Die Fehlermeldung legt nahe, dass du weniger (oder gar keine) übergibst.
Ich dachte, dass ich die inputs schon angegeben hätte mit und das damit gemeint wäre
vol_pi = (mean(data.v_solution(2,1:T).^2));
vol_x = (mean(data.v_solution(1,1:T).^2));
ich rufe die Lossfkt. nur mit Loss_fun auf, so wie ich sie auch abgespeichert habe. Ich rufe sie unabhängig vom main script ab. Wie setze ich denn sonst die input Argumente ein?
Zitat:
w_pi und w_x müssen auch definiert werden, bevor sie verwendet werden.
ich habe die beiden nur durch Werte definiert. Wie sollten sie sonst definiert werden?
Verfasst am: 26.06.2019, 16:38
Titel: Re: Not enough input arguments
Zitat:
Die meisten Leser werden nicht wissen, was der "Loss eines Modells" ist. Aber die Fehlermeldung hat ja auch nichts mit der Bedeutung der Zahlen zu tun.
Hallo Jan,
es handelt sich dabei besser gesagt, um ein Optimierungsproblem.
Ich dachte, dass ich die inputs schon angegeben hätte mit und das damit gemeint wäre
Nein, dort verwendest du die inputs. Woher soll MATLAB aber wissen, was data an der Stelle ist?
Zitat:
Wie setze ich denn sonst die input Argumente ein?
Generell in der Form Loss_fun(a,b,c) weil die Funktion 3 Inputs erwartet.
Zitat:
ich habe die beiden nur durch Werte definiert. Wie sollten sie sonst definiert werden?
Die Reihenfolge ist das entscheidende, deswegen hatte ich das "bevor" hervorgehoben.
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 ;)
und es bleibt das Problem, dass T nicht bekannt sein wird.
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 ;)
Ich habe T bewusst so definiert, da ich dachte mit einer höheren Simulationslänge sei, dass Ergebnis für den Mittelwert genauer.
[/quote]
Du überschreibst T bewusst 3 mal und meinst, das habe etwas mit einer Simulationslänge zu tun? Das verstehe ich nicht.
Es ist verwirrend, den Namen einer Variablen in einem Code mehrfach zu verwenden.
Zitat:
Wie setze ich denn diese Inputargumente ein? Ich hätte gedacht, dass Matlab sich das automatisch aus dem main script zieht...
Matlab zieht sich nicht automatisch irgendwo her. Das wäre ja ein Desaster, denn dann könnte man ja gar nicht kontrollieren, welche Daten wo vorliegen.
Wie man Inputargumente verwendet, weisst du doch bereits, denn du rufst ja z.B. auch
mean
mit Argumenten auf.
Wenn Du Loss_Fun so definierst
Der Wert von T taucht dabei nicht in der Liste der Inputs auf, also ist er innerhalb der Funktion auch nicht bekannt. Wie gesagt brauchst den den aber wahrscheinlich gar nicht, weil du die gesamte Zeile verwenden kannst
Ich habe die M datei Loss_fun.m in dem gleichen Ordner gespeichert, wie das main script. Und T habe ich jetzt weggelassen. Aber dennoch findet er die Funktion nicht
Du überschreibst T bewusst 3 mal und meinst, das habe etwas mit einer Simulationslänge zu tun? Das verstehe ich nicht.
Es ist verwirrend, den Namen einer Variablen in einem Code mehrfach zu verwenden.
Also ich habe die Matrix v_solution, die nach meiner Definition T=1000 eine 2*1000 Matrix ist. Die obere Zeile sind die Werte für x und die untere für pi. Und ich dachte für den Mittelwert der beiden Variablen, wäre es besser 1000 Werte zu haben, um den ihn genauer zu bestimmen. Mein Ursprünglicher Code hatte nur eine Simulationslänge von T=30 aber das erschien mir zu niedrig.
Code:
%% Calculating the solution time path for nu, x and pi using the following law of motion: % z(+1) = E[z(+1)] + Z_11^-1 * [1;0;0] * eps
T_11 = T(1:3,1:3)
Z_11 = Z(1:3,1:3)
Z_21 = Z(4:5,1:3)
T=1000;
Das Wort Simulationslänge passt wohl eher in diesem Kontext bei der Berechnung eines Zeitpfades.
Oder scheint meine Erklärung immer noch keinen Sinn zu ergeben?
Cannot find an exact (case-sensitive) match for 'Loss_Fun'
The closest match is: Loss_fun in C:\Users\Farah\Documents\MATLAB\Commitment\Loss_fun.m
Na, dann verwende doch im Aufruf Loss_fun mit einem kleinen f.
Du verwendest anscheinend einen leicht vom Funktionsnamen unterschiedlichen Dateinamen. Das dürfte im Editor auch orange unterlegt sein. Das ist keine gute Idee, da es (wie hier) zu Verwirrungen führen kann.
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 ;)
Na, dann verwende doch im Aufruf Loss_fun mit einem kleinen f.
Du verwendest anscheinend einen leicht vom Funktionsnamen unterschiedlichen Dateinamen. Das dürfte im Editor auch orange unterlegt sein. Das ist keine gute Idee, da es (wie hier) zu Verwirrungen führen kann.
Grüße,
Harald
Vielen Dank Harald!
Die Fehlermeldung ist nun verschwunden. Jetzt gibt es Probleme wegen dem T. Ich habe beide Varianten versucht mit T und einmal die von Jan S ohne T.
Du sagtest ja zu vor, dass T auch nicht definiert sei.
Ich wollte mit dem T einfach ausdrücken, dass sich Matlab aus der v-solution Matrix Eintrag 1 bis 1000 rauszieht. Aber scheint wohl nicht zu klappen...
die zweite Variante ist vom Aufruf her sinnvoll. Allerdings extrahierst du in der Zeile, die die Fehlermeldung wirft, die zweite Zeile. Wenn du die Funktion so wie zuvor beschrieben aufrufst, gibt es da aber halt nur eine Zeile.
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 ;)
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.