diff --git a/MatlabFiles/MSV/fwz_msv_msre.m b/MatlabFiles/MSV/fwz_msv_msre.m new file mode 100755 index 0000000000000000000000000000000000000000..79ffb6b25c74f535404e0b92889cab710a58c2ac --- /dev/null +++ b/MatlabFiles/MSV/fwz_msv_msre.m @@ -0,0 +1,134 @@ +function [F1, F2, G1, G2, V, err] = fwz_msv_msre(P, A, B, Psi, s, x, max_count, tol) +%[ F1 F2 G1 G2 V err ] = fwz_msv_msre(P, A, B, Psi, s, x, max_count, tol) +% Computes MSV solution of +% +% A(s(t) x(t) = B(s(t) x(t-1) + Psi(s(t)) epsilon(t) + Pi eta(t) +% +% using Newton's Method. Assumes that Pi' = [zeros(s,n-s) eye(s)] and +% that A{i} is invertible. P is the transition matrix and P(i,j) is the +% probability that s(t+1)=j given that s(t)=i. Note that the rows of P +% must sum to one. x is the initial value and if not passed is set to +% zero. max_count is the maximum number of iterations on Newton's method +% before failing and tol is the convergence criterion. +% +% The solution is of the form +% +% x(t) = V{s(t)}*F1{s(t)}*x(t-1) + V{s(t)}*G1{s(t)}*epsilon(t) +% +% eta(t) = F2{s(t)}*x(t-1) + G2{s(t)}*epsilont(t) +% +% err is set to 0 upon sucess. A positive value is the number of +% iterations before the method was terminated. +% + +h=size(P,1); +n=size(A{1},1); +r=size(Psi{1},2); + +if (nargin <= 7) || (tol <= 0) + tol=1e-5; +end + +if (nargin <= 6) || (max_count <= 0) + max_count=1000; +end + +if nargin <= 5 + x=zeros(h*s*(n-s),1); +end +f=zeros(h*s*(n-s),1); + + +Is=eye(s); +I=eye(n-s); + +% The following code would be used if Pi were passed instead of the +% assumption that Pi' = [zeros(s,n-s) eye(s)]. +% for i=1:h +% [Q,R] = qr(Pi{i}); +% W=[zeros(n-s,s) I; inv(R(1:s,1:s)); zeros(s,n-s)]*Q'; +% A{i}=W*A{i}; +% B{i}=W*B{i}; +% Psi{i}=W*Psi{i}; +% end + +U=cell(h,1); +for i=1:h + U{i}=inv(A{i}); +end +C=cell(h,h); +for i=1:h + for j=1:h + C{i,j}=P(i,j)*B{j}*U{i}; + end +end + +cont=true; +count=1; +D=zeros(h*s*(n-s),h*s*(n-s)); +X=cell(h,1); +for i=1:h + X{i}=reshape(x((i-1)*s*(n-s)+1:i*s*(n-s)),s,n-s); +end +while cont + for i=1:h + for j=1:h + W1=C{i,j}*[I; -X{i}]; + W2=W1(1:n-s,:); + D((i-1)*s*(n-s)+1:i*s*(n-s),(j-1)*s*(n-s)+1:j*s*(n-s)) = kron(W2',Is); + if i == j + W1=zeros(s,n); + for k=1:h + W1=W1+[X{k} Is]*C{i,k}; + end + W2=-W1(:,n-s+1:end); + D((i-1)*s*(n-s)+1:i*s*(n-s),(j-1)*s*(n-s)+1:j*s*(n-s)) = D((i-1)*s*(n-s)+1:i*s*(n-s),(j-1)*s*(n-s)+1:j*s*(n-s)) + kron(I,W2); + end + end + end + + for i=1:h + mf=zeros(s,n-s); + for j=1:h + mf=mf+[X{j} Is]*C{i,j}*[I; -X{i}]; + end + f((i-1)*s*(n-s)+1:i*s*(n-s))=reshape(mf,s*(n-s),1); + end + + y=D\f; + x=x - y; + + if (count > max_count) || (norm(f) < tol) + cont=false; + else + count=count+1; + for i=1:h + X{i}=reshape(x((i-1)*s*(n-s)+1:i*s*(n-s)),s,n-s); + end + end +end + +if (norm(f) < tol) + err=0; +else + err=count; +end + +F1=cell(h,1); +F2=cell(h,1); +G1=cell(h,1); +G2=cell(h,1); +V=cell(h,1); +pi=[zeros(n-s,s); Is]; +for i=1:h + X=reshape(x((i-1)*s*(n-s)+1:i*s*(n-s)),s,n-s); + V{i}=U{i}*[I; -X]; + W=[A{i}*V{i} pi]; + F=W\B{i}; + F1{i}=F(1:n-s,:); + F2{i}=F(n-s+1:end,:); + G=W\Psi{i}; + G1{i}=G(1:n-s,:); + G2{i}=G(n-s+1:end,:); +end + \ No newline at end of file diff --git a/MatlabFiles/fn_multigraphn_3g_shadedbands.m b/MatlabFiles/fn_multigraphn_3g_shadedbands.m new file mode 100755 index 0000000000000000000000000000000000000000..4a68388d53c4d78eaf15d38277e3b328a3a86d5d --- /dev/null +++ b/MatlabFiles/fn_multigraphn_3g_shadedbands.m @@ -0,0 +1,171 @@ +function scaleout = fn_multigraphn_3g_shadedbands(imfn,... + xlab,ylab,tstring,XTick,YTickIndx,scaleIndx,nrowg,ncolg) +%Searching <<>> for ad hoc and specific changes. +% +%Stacking n sets of impulse responses in one graph. See fn_multigraph2_ver2.m. +% imfn: row: "nstp" time horizon (in the graphics), +% column: "nrow "variables such as responses (row in the graphics), +% 3rd D: across "ncol" different situations such as shocks (column in the graphics), +% 4th D: low band, estimate, high band (in each graph). +% xlab: x-axis labels on the top +% ylab: y-axis labels on the left +% tstring: string for time (e.g., month or quarter) -- x-axis labels at the bottom +% YTickIndx: 1: enable YTick; 0: disable; +% To get a better picture, it is sometimes better to set YtickIndx to zero. +% scaleIndx: 1: enable scale along Y-axis; 0: disable +% nrowg: number of rows in the graph +% ncolg: number of columns in the graph +% +% See imrgraph, imcerrgraph, imrerrgraph +nstp = size(imfn,1); +nrow = size(imfn,2); +ncol = size(imfn,3); +nmodels = size(imfn,4); +t = 1:nstp; +treverse = fliplr(t); + +if (nargin < 9) + nrowg = nrow; + ncolg = ncol; +end +if (nrowg*ncolg < nrow*ncol) + nrowg + ncolg + nrow + ncol + + error('fn_multigraphn_3g_shadedbands.m: nrowg*ncolg must be greater than nrow*ncol') +end + + +tempmax=zeros(ncol,1); +tempmin=zeros(ncol,1); +maxval=zeros(nrow,1); +minval=zeros(nrow,1); +for i = 1:nrow + for j = 1:ncol + tempmax(j) = -realmax; + tempmin(j) = realmax; + for k=1:nmodels + jnk = max(imfn(:,i,j,k)); + tempmax(j) = max([jnk tempmax(j)]); + % + jnk = min(imfn(:,i,j,k)); + tempmin(j) = min([jnk tempmin(j)]); + end + end + maxval(i)=max(tempmax); + minval(i)=min(tempmin); +end + +scaleout = [maxval(:) minval(:)]; + +%-------------- +% Column j: Shock 1 to N; Row i: Responses to +%------------- +%figure + + +rowlabel = 1; +for i = 1:nrow % column: from top to bottom + columnlabel = 1; + + if minval(i)<0 + if maxval(i)<=0 + yt=[minval(i) 0]; + else + yt=[minval(i) 0 maxval(i)]; + end + else % (minval(i) >=0) + if maxval(i) > 0 + yt=[0 maxval(i)]; + else % (identically zero responses) + yt=[-1 0 1]; + end + end + + + scale=[1 nstp minval(i) maxval(i)]; + + for j = 1:ncol % row: from left to right + k1=(i-1)*ncol+j; + subplot(nrowg,ncolg,k1) + + %set(0,'DefaultAxesColorOrder',[1 0 0;0 1 0;0 0 1],... + % 'DefaultAxesLineStyleOrder','-|--|:') + %set(0,'DefaultAxesLineStyleOrder','-|--|:|-.') + %---<<>> + %set(0,'DefaultAxesColorOrder',[0 0 0],... + % 'DefaultAxesLineStyleOrder','-.|-.|-|--|-.|-*|--o|:d') + + nseries = zeros(nstp, nmodels); + for k=1:nmodels + nseries(:,k) = imfn(:,i,j,k); + end + + %---<<>> + fill([t treverse],[nseries(:,[3])' fliplr(nseries(:,[1])')],[0.8,0.8,0.8],'EdgeColor','none'); + %plot(t,nseries(:,[1 3]), '-.k','LineWidth',1.0); %,'Color','k'); + hold on + plot(t,nseries(:,[2]), '-k','LineWidth',1.5); + %plot(t,nseries(:,[4]), '--k','LineWidth',1.6); + hold off + + %set(gca,'LineStyleOrder','-|--|:|-.') + %set(gca,'LineStyleOrder',{'-*',':','o'}) + grid; + if scaleIndx + axis(scale); + end + %set(gca,'YLim',[minval(i) maxval(i)]) + % + set(gca,'XTick',XTick) + if YTickIndx + set(gca,'YTick',yt) + end + + if i<nrow + set(gca,'XTickLabelMode','manual','XTickLabel',[]) + end + %set(gca,'XTickLabel',' '); + if (scaleIndx) && (j>1) + set(gca,'YTickLabel',' '); + end + if rowlabel == 1 + %title(['x' num2str(j)]) + %title(eval(['x' num2str(j)])) + if (~isempty(xlab)), title(char(xlab(j))), end + end + if columnlabel == 1 + %ylabel(['x' num2str(i)]) + %ylabel(eval(['x' num2str(i)])) + if (~isempty(ylab)), ylabel(char(ylab(i))), end + end + if (i==nrow) && (~isempty(tstring)) + xlabel(tstring) + end + columnlabel = 0; + end + rowlabel = 0; +end + + +%Order of line styles and markers used in a plot. +%This property specifies which line styles and markers to use and in what order +%when creating multiple-line plots. For example,set(gca,'LineStyleOrder', '-*|:|o')sets LineStyleOrder to solid line with asterisk +%marker, dotted line, and hollow circle marker. The default is (-), which specifies +%a solid line for all data plotted. Alternatively, you can create a cell array +%of character strings to define the line styles:set(gca,'LineStyleOrder',{'-*',':','o'})MATLAB supports four line styles, which you can specify any number of +%times in any order. MATLAB cycles through the line styles only after using +%all colors defined by the ColorOrder property. For example, +%the first eight lines plotted use the different colors defined by ColorOrder with +%the first line style. MATLAB then cycles through the colors again, using the +%second line style specified, and so on.You can also specify line style and color directly with the plot and plot3 functions +%or by altering the properties of theline or +%lineseries objects after creating the graph. High-Level Functions and LineStyleOrderNote that, if the axes NextPlot property is set +%to replace (the default), high-level functions like plot reset +%the LineStyleOrder property before determining the line +%style to use. If you want MATLAB to use a LineStyleOrder that +%is different from the default, set NextPlot to replacechildren. Specifying a Default LineStyleOrderYou can also specify your own default LineStyleOrder. +%For example, this statementset(0,'DefaultAxesLineStyleOrder',{'-*',':','o'}) +%creates a default value for