dynare/matlab/occbin/mkdatap_anticipated.m

124 lines
3.0 KiB
Matlab
Executable File

function [zdata]=mkdatap_anticipated(nperiods,decrulea,decruleb,...
cof,Jbarmat,cofstar,Jstarbarmat,Dstarbarmat,...
regime,regimestart,violvecbool,...
endog_,exog_,irfshock,scalefactormod,init)
nvars = length(endog_);
if nargin<16
init=zeros(nvars,1);
end
if nargin<15
scalefactormod=1;
end
nshocks = size(irfshock,1);
for i = 1:nshocks
shockpos = strmatch(irfshock(i,:), exog_, 'exact');
if ~isempty(shockpos)
irfshockpos(i) = shockpos;
else
error(['Shock ', irfshock(i,:), ' is not in the model']);
end
end
nregimes = length(regime);
Cbarmat = cof(:,1:nvars);
Bbarmat = cof(:,nvars+1:2*nvars);
Abarmat = cof(:,2*nvars+1:3*nvars);
% cofstar contains the system for the model when the constraint binds
Cstarbarmat = cofstar(:,1:nvars);
Bstarbarmat = cofstar(:,nvars+1:2*nvars);
Astarbarmat = cofstar(:,2*nvars+1:3*nvars);
% get the time-dependent decision rules
Tmax = regimestart(nregimes)-1; % Tmax is the position of the last period
% when the constraint binds
if Tmax > 0
P = zeros(nvars,nvars,Tmax);
D = zeros(nvars,Tmax);
invmat = inv((Astarbarmat*decrulea+Bstarbarmat));
P(:,:,Tmax) = -invmat*Cstarbarmat;
D(:,Tmax) = -invmat*Dstarbarmat;
% equivalent to pre-multiplying by the inverse above if the target
% matrix is invertible. Otherwise it yields the minimum state solution
%P(:,:,Tmax) = -(Astarbarmat*decrulea+Bstarbarmat)\Cstarbarmat;
%D(:,Tmax) = -(Astarbarmat*decrulea+Bstarbarmat)\Dstarbarmat;
for i = Tmax-1:-1:1
if violvecbool(i)
invmat = inv(Bstarbarmat+Astarbarmat*P(:,:,i+1));
P(:,:,i)=-invmat*Cstarbarmat;
D(:,i) = -invmat*(Astarbarmat*D(:,i+1)+Dstarbarmat);
else
invmat = inv(Bbarmat+Abarmat*P(:,:,i+1));
P(:,:,i)=-invmat*Cbarmat;
D(:,i) = -invmat*(Abarmat*D(:,i+1));
end
end
if Tmax > 1
if violvecbool(1)
E = -invmat*Jstarbarmat;
else
E = -invmat*Jbarmat;
end
else
invmat = inv(Astarbarmat*decrulea+Bstarbarmat);
E = -invmat*Jstarbarmat;
end
end
% generate data
% history will contain data, the state vector at each period in time will
% be stored columnwise.
history = zeros(nvars,nperiods+1);
history(:,1) = init;
errvec = zeros(length(exog_), 1);
% deal with predetermined conditions
for i = 1:nshocks
errvec(irfshockpos(i)) = scalefactormod(i);
end
% deal with shocks
irfpos =1;
if irfpos <=Tmax
history(:,irfpos+1) = P(:,:,irfpos)* history(:,irfpos)+...
D(:,irfpos) + E*errvec;
else
history(:,irfpos+1) = decrulea*history(:,irfpos)+decruleb*errvec;
end
% all other periods
for irfpos=2:nperiods+1
if irfpos <=Tmax
history(:,irfpos+1) = P(:,:,irfpos)* history(:,irfpos)+...
D(:,irfpos);
else
history(:,irfpos+1) = decrulea*history(:,irfpos);
end
end
history=history';
zdata = history(2:end,:);