-
Notifications
You must be signed in to change notification settings - Fork 131
/
RBC_Rcpp.R
85 lines (57 loc) · 2.47 KB
/
RBC_Rcpp.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
## 0. Housekeeping
rm(list=ls())
ptm <- proc.time()
## 1. Calibration
aalpha = 1/3; # Elasticity of output w.r.t. capital
bbeta = 0.95; # Discount factor
# Productivity values
vProductivity <- c(0.9792, 0.9896, 1.0000, 1.0106, 1.0212);
# Transition matrix
mTransition <- c(0.9727, 0.0273, 0.0000, 0.0000, 0.0000,
0.0041, 0.9806, 0.0153, 0.0000, 0.0000,
0.0000, 0.0082, 0.9837, 0.0082, 0.0000,
0.0000, 0.0000, 0.0153, 0.9806, 0.0041,
0.0000, 0.0000, 0.0000, 0.0273, 0.9727);
mTransition <- matrix(mTransition,nrow=5,ncol=5);
mTransition <- t(mTransition)
## 2. Steady State
capitalSteadyState = (aalpha*bbeta)^(1/(1-aalpha));
outputSteadyState = capitalSteadyState^aalpha;
consumptionSteadyState = outputSteadyState-capitalSteadyState;
cat(" Output = ", outputSteadyState,", Capital = ",capitalSteadyState, ", Consumption = ", consumptionSteadyState,"\n")
cat(" \n")
# We generate the grid of capital
vGridCapital <- seq(0.5*capitalSteadyState, 1.5*capitalSteadyState, by = 0.00001);
nGridCapital <- length(vGridCapital);
nGridProductivity <- length(vProductivity);
# 3. Required matrices and vectors
mOutput <- matrix(0,nGridCapital,nGridProductivity);
mValueFunction <- matrix(0,nGridCapital,nGridProductivity);
mValueFunctionNew <- matrix(0,nGridCapital,nGridProductivity);
mPolicyFunction <- matrix(0,nGridCapital,nGridProductivity);
mResults <- matrix(0,nGridCapital,2*nGridProductivity);
expectedValueFunction <- matrix(0,nGridCapital,nGridProductivity);
## 4. We pre-build output for each point in the grid
mOutput = as.matrix(vGridCapital^aalpha)%*%t(as.matrix(vProductivity));
## 5. Main iteration
maxDifference <- 10;
tolerance <- 0.0000001;
iteration <- 0;
while (maxDifference>tolerance){
expectedValueFunction = mValueFunction %*% t(mTransition);
Rcpp::sourceCpp('InsideLoop.cpp');
mResults <- InsideLoop(vGridCapital, mOutput, expectedValueFunction);
mValueFunctionNew <- mResults[,1:5];
maxDifference <- max(abs(mValueFunctionNew-mValueFunction));
mValueFunction <- mValueFunctionNew;
iteration = iteration+1;
if ((iteration %% 10)==0 | iteration ==1){
cat(" Iteration = ", iteration," Sup Diff = ", maxDifference,"\n");
}
}
mPolicyFunction <- mResults[,6:10];
cat(" Iteration = ", iteration," Sup Diff = ", maxDifference,"\n");
cat(" \n")
cat(" My chek = ", mPolicyFunction[1000,3],"\n");
cat(" \n")
cat(" Time = ", proc.time() - ptm,"\n");