-
Notifications
You must be signed in to change notification settings - Fork 131
/
RBC_Swift.swift
159 lines (119 loc) · 5.54 KB
/
RBC_Swift.swift
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
//============================================================================
// Name : RBC_Swift.swift
// Description : Basic RBC model with full depreciation
// Date : July 4, 2014
// Santiago González <[email protected]>
//
// This code is for Apple's Swift language
// Compile: swiftc -O -sdk $(xcrun --show-sdk-path --sdk macosx) RBC_Swift.swift
//============================================================================
import Foundation
func get_cpu_time() -> Double {
return Double(clock()) / Double(CLOCKS_PER_SEC)
}
var cpu0 = get_cpu_time()
///////////////////////////////////////////////////////////////////////////////////////////
// 1. Calibration
///////////////////////////////////////////////////////////////////////////////////////////
let aalpha = 0.33333333333 // Elasticity of output w.r.t. capital
let bbeta = 0.95 // Discount factor
// Productivity values
let vProductivity = [0.9792, 0.9896, 1.0000, 1.0106, 1.0212]
// Transition matrix
let mTransition = [
[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]
]
///////////////////////////////////////////////////////////////////////////////////////////
// 2. Steady State
///////////////////////////////////////////////////////////////////////////////////////////
let capitalSteadyState = pow(aalpha*bbeta,1/(1-aalpha))
let outputSteadyState = pow(capitalSteadyState,aalpha)
let consumptionSteadyState = outputSteadyState-capitalSteadyState
println("Output = \(outputSteadyState), Capital = \(capitalSteadyState), Consumption = \(consumptionSteadyState)")
println()
// We generate the grid of capital
//var nCapital, nCapitalNextPeriod, gridCapitalNextPeriod, nProductivity, nProductivityNextPeriod
let nGridCapital = 17820
let nGridProductivity = 5
var vGridCapital = [Double](count: nGridCapital, repeatedValue: 0.0)
for nCapital in 0..<nGridCapital {
vGridCapital[nCapital] = 0.5*capitalSteadyState+0.00001*Double(nCapital)
}
// 3. Required matrices and vectors
func Double2(cols: Int, rows: Int) -> [[Double]] {
return [[Double]](count: cols, repeatedValue:[Double](count: rows, repeatedValue:Double(0.0)))
}
var mOutput = Double2(nGridCapital, nGridProductivity)
var mValueFunction = Double2(nGridCapital, nGridProductivity)
var mValueFunctionNew = Double2(nGridCapital, nGridProductivity)
var mPolicyFunction = Double2(nGridCapital, nGridProductivity)
var expectedValueFunction = Double2(nGridCapital, nGridProductivity)
// 4. We pre-build output for each point in the grid
for nProductivity in 0..<nGridProductivity {
for nCapital in 0..<nGridCapital {
mOutput[nCapital][nProductivity] = vProductivity[nProductivity]*pow(vGridCapital[nCapital],aalpha)
}
}
// 5. Main iteration
var maxDifference = 10.0, diff, diffHighSoFar: Double
var tolerance = 0.0000001
var valueHighSoFar, valueProvisional, consumption, capitalChoice: Double
var iteration = 0
while (maxDifference>tolerance){
for nProductivity in 0..<nGridProductivity {
for nCapital in 0..<nGridCapital {
expectedValueFunction[nCapital][nProductivity] = 0.0
for nProductivityNextPeriod in 0..<nGridProductivity {
expectedValueFunction[nCapital][nProductivity] += mTransition[nProductivity][nProductivityNextPeriod]*mValueFunction[nCapital][nProductivityNextPeriod]
}
}
}
for nProductivity in 0..<nGridProductivity {
// We start from previous choice (monotonicity of policy function)
var gridCapitalNextPeriod = 0
for nCapital in 0..<nGridCapital {
valueHighSoFar = -100000.0
capitalChoice = vGridCapital[0]
for nCapitalNextPeriod in gridCapitalNextPeriod..<nGridCapital {
consumption = mOutput[nCapital][nProductivity]-vGridCapital[nCapitalNextPeriod]
valueProvisional = (1-bbeta)*log(consumption)+bbeta*expectedValueFunction[nCapitalNextPeriod][nProductivity]
if (valueProvisional>valueHighSoFar){
valueHighSoFar = valueProvisional
capitalChoice = vGridCapital[nCapitalNextPeriod]
gridCapitalNextPeriod = nCapitalNextPeriod
}
else{
break // We break when we have achieved the max
}
mValueFunctionNew[nCapital][nProductivity] = valueHighSoFar
mPolicyFunction[nCapital][nProductivity] = capitalChoice
}
}
}
diffHighSoFar = -100000.0
for nProductivity in 0..<nGridProductivity {
for nCapital in 0..<nGridCapital {
diff = fabs(mValueFunction[nCapital][nProductivity]-mValueFunctionNew[nCapital][nProductivity])
if (diff>diffHighSoFar){
diffHighSoFar = diff
}
mValueFunction[nCapital][nProductivity] = mValueFunctionNew [nCapital][nProductivity]
}
}
maxDifference = diffHighSoFar
iteration = iteration+1
if iteration % 10 == 0 || iteration == 1 {
println("Iteration = \(iteration), Sup Diff = \(maxDifference)")
}
}
println("Iteration = \(iteration), Sup Diff = \(maxDifference)")
println()
println("My check = \(mPolicyFunction[999][2])")
println()
let cpu1 = get_cpu_time()
println("Elapsed time is = \(cpu1 - cpu0)")
println()