该函数应该返回一个值。但是,当我输入:
val(1d4)
它返回
ans =
[]
但是,如果我逐行复制,并设置所有参数(V eps_today等),并在命令窗口中运行,它工作正常......不知道问题出在哪里。感谢:)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%This function calculates the value function of both small and big%
%investment %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function negval=val(k_next)
global V eps_today k_today eps_gv k_gv z_today delta xi
theta=0.5327; beta=0.95; rho=0.7675; sigma_eta=0.7704;
%identify the grid point that falls just below
klo=max(sum(k_next>k_gv),1);
%above
khi=klo+1;
%Linear Interpolation, effectively only on the dimension of k
if klo<size(k_gv,2)
V_temp=V(:,klo)+(k_next-k_gv(klo))/(k_gv(khi)-k_gv(klo))*(V(:,khi)-V(:,klo));
else
%when k_next> maximum point of k_gv
V_temp=V(:,size(k_gv,2));
end
EV=mean(V_temp,1);
negval=-(exp(z_today+eps_today)*k_today^theta-xi*k_today-(k_next-(1-delta)*k_today)+beta*EV);
end
答案 0 :(得分:2)
我试图复制你的问题,但我做不到。如果我没有设置全局变量Matlab喊叫并拒绝继续该功能。将其中一些设置为空值是相同的(没有尝试所有)。如果我设置全局变量,那么函数总是给我一个值。
但是我强烈怀疑它与全局变量有关(你可以显示它们被初始化的代码吗?)。正如我在评论中提到的,我会摆脱它们,代码看起来像这样
主程序
%set parameters
Pars.beta = beta=0.95;
Pars.theta = 0.5327;
Pars.rho=0.7675;
Pars.sigma_eta=0.7704;
Pars.delta = ...;
Pars.xi = ...;
%set grid
eps_gv = ...
k_gv = ...
ne = length(eps_gv);
nk = length(k_gv);
V = zeros(ne,nk);
k_next = ...;
value = val(k_next,V,eps_gv,k_gv,Pars);
Val功能
negval = function val(k_next,V,eps_gv,k_gv,Pars)
theta=Pars.theta; beta=Pars.beta; rho=Pars.rho; etc.
您甚至不需要eps_today
和k_today
,因为它们应该是网格上的值(即eps_gv
和k_gv
)。我不知道z_today
是什么,但应该是z
或z_today
的网格应该是参数,在这种情况下它应该在Pars
中。当然,如果您使用eps_gv
和k_gv
而不是eps_today
和k_today
,则需要修改negval = ...
行以将其视为数组而不是标量。
最后一条评论,EV=mean(V_temp,1);
行有一个错误。 mean
函数计算V
的(列)的平均值。要计算预期值,您需要进行加权平均,其中您按V
eps
eps_gv(1)
的概率对sum(V(i,:)*prob_eps(i))
的每一行进行加权,即总和超过{ {1}})。只有当所有冲击具有相同的概率时,您所做的才有效。指出,因为我不确定你是否意识到这一点。