Skip to content

Commit 79cecc0

Browse files
authored
Add files via upload
1 parent 0f27ba2 commit 79cecc0

File tree

1 file changed

+53
-59
lines changed

1 file changed

+53
-59
lines changed

lectures/optgrowth_fast.md

Lines changed: 53 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,21 @@ tags: [hide-output]
3535

3636
## 概述
3737

38-
{doc}`在之前的内容中 <optgrowth>`,我们研究了一个具有单个代表性个体的随机最优增长模型
38+
{doc}`上一讲 <optgrowth>`中,我们研究了一个具有代表性个体的随机最优增长模型
3939

40-
我们使用动态规划方法求解了该模型
40+
我们使用动态规划方法对该模型进行了求解
4141

4242
在编写代码时,我们注重清晰性和灵活性。
4343

44-
这些都很重要,但灵活性和速度之间通常存在权衡
44+
尽管这些特性十分重要,但在实际应用中,灵活性与运行速度之间往往存在权衡
4545

46-
原因是,当代码灵活性较低时,我们可以更容易地利用其结构特点
46+
其原因在于,当代码的灵活性降低时,我们能够更容易地利用模型的结构特征
4747

48-
这对算法和数学问题来说普遍适用:更具体的问题具有更多的结构特征,经过思考后,可以利用这些特征获得更好的结果。)
48+
这一点在算法与数学问题中普遍成立:越具体的问题往往具有更强的结构特征,而经过适当设计,这些结构可被有效利用,从而获得更优的结果。)
4949

50-
因此,在本讲中,我们将接受较低的灵活性以获得更快的速度,使用即时(JIT)编译来加速我们的代码
50+
因此,在本讲中,我们将牺牲一定的灵活性以换取更高的运行速度,采用即时(JIT)编译来加速代码的执行
5151

52-
让我们从一些导入开始
52+
下面让我们从导入相关库开始
5353

5454
```{code-cell} ipython
5555
import matplotlib.pyplot as plt
@@ -63,33 +63,33 @@ from numba import jit, jit
6363
from quantecon.optimize.scalar_maximization import brent_max
6464
```
6565

66-
函数`brent_max`也设计用于嵌入JIT编译代码中
66+
函数`brent_max`同样被设计用于嵌入JIT编译代码中
6767

68-
这些是SciPy中类似函数的替代方案(不幸的是,SciPy的函数不支持JIT)。
68+
这些函数可作为SciPy中类似函数的替代方案(遗憾的是,SciPy中的相关函数目前尚不支持JIT)。
6969

7070
## 模型
7171

7272
```{index} single: Optimal Growth; Model
7373
```
7474

75-
这个模型与我们在{doc}`之前的讲座 <optgrowth>`中讨论的最优增长模型相同
75+
本节所使用的模型与我们在{doc}`前一讲 <optgrowth>`关于最优增长的讲授中所讨论的模型相同
7676

77-
我们将从对数效用函数开始
77+
我们从对数型效用函数开始
7878

7979
$$
8080
u(c) = \ln(c)
8181
$$
8282

83-
我们继续假设
83+
并继续作如下假设
8484

85-
* $f(k) = k^{\alpha}$
86-
* $\phi$是当$\zeta$为标准正态分布时,$\xi := \exp(\mu + s \zeta)$的分布
85+
* 生产函数为 $f(k) = k^{\alpha}$
86+
* 随机冲击项 $\xi$ 的分布为 $\phi$,其中 $\xi := \exp(\mu + s \zeta)$ 且 $\zeta$ 为标准正态分布。
8787

88-
我们将再次使用值函数迭代来求解这个模型
88+
我们将再次使用价值函数迭代(VFI)来求解这个模型
8989

90-
具体来说,算法保持不变,唯一的区别在于实现本身
90+
具体来说,算法保持不变,唯一的区别在于具体的实现方式
9191

92-
和之前一样,我们将能够与真实解进行比较
92+
和之前一样,我们会对比本次计算所得结果与真实解。
9393

9494
```{code-cell} ipython3
9595
:load: _static/lecture_specific/optgrowth/cd_analytical.py
@@ -100,29 +100,29 @@ $$
100100
```{index} single: Dynamic Programming; Computation
101101
```
102102

103-
我们将再次把最优增长模型的基本要素存储在一个类中
103+
我们将再次把最优增长模型的基本要素封装在一个类中
104104

105-
但这次我们将使用[Numba的](https://python-programming.quantecon.org/numba.html) `@jitclass`装饰器来对我们的类进行JIT编译
105+
然而,与此前不同的是,我们将使用[Numba](https://python-programming.quantecon.org/numba.html) `@jitclass`装饰器来对该类进行JIT编译
106106

107-
因为我们要使用Numba来编译我们的类,所以需要指定数据类型
107+
由于我们计划使用Numba来编译该类,因此需要明确指定数据类型
108108

109-
你会在我们的类上方看到一个名为`opt_growth_data`的列表。
109+
在代码中,你将看到一个名为`opt_growth_data`的列表,该列表定义在类的上方,用于说明这些类型
110110

111-
与{doc}`上一讲<optgrowth>`不同,我们将生产和效用函数的具体形式直接写入类中
111+
与{doc}`上一讲<optgrowth>`不同的是,这里我们将生产和效用函数的具体形式直接写入类中,而非保持一般性形式
112112

113-
这是我们为了获得更快的速度而牺牲灵活性的地方
113+
也就是说,我们在此牺牲了一定的灵活性,以换取更高的运行速度
114114

115115
```{code-cell} ipython3
116116
:load: _static/lecture_specific/optgrowth_fast/ogm.py
117117
```
118118

119-
该类包含一些方法如`u_prime`我们现在不需要但会在后续课程中使用
119+
该类还包含若干方法,例如`u_prime`虽然在当前讲义中尚未使用,但将在后续课程中发挥作用
120120

121-
### Bellman算子
121+
### 贝尔曼算子
122122

123-
我们将使用JIT编译来加速Bellman算子
123+
我们将使用JIT编译来加速贝尔曼算子的计算
124124

125-
首先,这里有一个函数,根据贝尔曼方程{eq}`fpb30`返回特定消费选择`c`在给定状态`y`下的值
125+
首先,定义一个函数,用于计算在给定状态`y`下,某一特定消费选择`c`所对应的价值。该函数基于贝尔曼方程{eq}`fpb30`
126126

127127
```{code-cell} ipython3
128128
@jit
@@ -184,16 +184,16 @@ def T(v, og):
184184
og = OptimalGrowthModel()
185185
```
186186

187-
现在我们调用`solve_model`,使用`%%time`魔法指令来检查运行时间
187+
现在我们调用`solve_model`,使用`%%time`魔法指令来记录运行时间
188188

189189
```{code-cell} ipython3
190190
%%time
191191
v_greedy, v_solution = solve_model(og)
192192
```
193193

194-
你会注意到这比我们的{doc}`原始实现 <optgrowth>`*快得多*
194+
你会发现,这比我们的{doc}`原始实现 <optgrowth>`*快得多*
195195

196-
下面是生成的策略与真实策略的对比图
196+
下面,生成近似策略与真实策略的对比图
197197

198198
```{code-cell} ipython3
199199
fig, ax = plt.subplots()
@@ -208,7 +208,7 @@ ax.legend()
208208
plt.show()
209209
```
210210

211-
再次,拟合效果非常好 --- 这是意料之中的,因为我们没有改变算法。
211+
与之前一样,拟合效果非常好 --- 这是意料之中的,因为我们没有改变算法。
212212

213213
两种策略之间的最大绝对偏差是
214214

@@ -221,22 +221,20 @@ np.max(np.abs(v_greedy - σ_star(og.grid, og.α, og.β)))
221221
```{exercise}
222222
:label: ogfast_ex1
223223
224-
计时使用贝尔曼算子迭代20次所需的时间,从初始条件 $v(y) = u(y)$ 开始。
225-
226-
使用默认参数设置。
224+
在默认参数设定下,从给定的初始条件 $v(y) = u(y)$ 开始,对贝尔曼算子进行 20 次迭代,并记录整个迭代过程所耗费的时间。
227225
```
228226

229227
```{solution-start} ogfast_ex1
230228
:class: dropdown
231229
```
232230

233-
让我们设置初始条件。
231+
设置初始条件:
234232

235233
```{code-cell} ipython3
236234
v = og.u(og.grid)
237235
```
238236

239-
这是时间统计
237+
计时
240238

241239
```{code-cell} ipython3
242240
%%time
@@ -246,46 +244,46 @@ for i in range(20):
246244
v = v_new
247245
```
248246

249-
与我们对非编译版本的值函数迭代的{ref}`计时 <og_ex2>`相比,JIT编译的代码通常快一个数量级。
247+
与非编译版本的价值函数迭代的{ref}`用时 <og_ex2>`相比,JIT编译的代码通常快一个数量级。
250248

251249
```{solution-end}
252250
```
253251

254252
```{exercise}
255253
:label: ogfast_ex2
256254
257-
修改最优增长模型以使用CRRA效用函数规范。
255+
将最优增长模型修改为采用CRRA效用函数的设定:
258256
259257
$$
260258
u(c) = \frac{c^{1 - \gamma} } {1 - \gamma}
261259
$$
262260
263-
`γ = 1.5`设为默认值,并保持其他规范不变
261+
设定`γ = 1.5`为默认值,并保持其他模型设定不变
264262
265-
(注意,`jitclass`目前不支持继承,所以你必须复制类并更改相关参数和方法。)
263+
(注意,`jitclass`目前不支持类继承,因此你需要复制原有的类,并相应修改相关的参数与方法。)
266264
267-
计算最优策略的估计值,绘制图表,并与第一个最优增长讲座中{ref}`类似练习 <og_ex1>`的相同图表进行视觉比较
265+
计算最优策略的估计值,并绘制其图像。将所得图像与第一讲最优增长模型中{ref}`对应练习 <og_ex1>`的图表进行比较
268266
269-
同时比较执行时间
267+
同时,对比两种实现的运行时间
270268
```
271269

272270
```{solution-start} ogfast_ex2
273271
:class: dropdown
274272
```
275273

276-
这是我们的CRRA版本的`OptimalGrowthModel`
274+
这是CRRA版本的`OptimalGrowthModel`
277275

278276
```{code-cell} ipython3
279277
:load: _static/lecture_specific/optgrowth_fast/ogm_crra.py
280278
```
281279

282-
让我们创建一个实例
280+
创建一个实例
283281

284282
```{code-cell} ipython3
285283
og_crra = OptimalGrowthModel_CRRA()
286284
```
287285

288-
现在我们调用`solve_model`,使用`%%time`魔术命令来检查运行时间
286+
调用`solve_model`,使用`%%time`魔术命令来记录运行时间
289287

290288
```{code-cell} ipython3
291289
%%time
@@ -298,16 +296,13 @@ v_greedy, v_solution = solve_model(og_crra)
298296
fig, ax = plt.subplots()
299297
300298
ax.plot(og.grid, v_greedy, lw=2,
301-
alpha=0.6, label='近似值函数')
299+
alpha=0.6, label='近似价值函数')
302300
303301
ax.legend(loc='lower right')
304302
plt.show()
305303
```
306304

307-
这与我们在非jit代码中得到的解决方案相符,
308-
{ref}`in the exercises <og_ex1>`
309-
310-
执行时间快了一个数量级。
305+
这与我们在{ref}`练习 <og_ex1>`中使用非jit代码得到的答案相符,但执行时间快了一个数量级。
311306

312307
```{solution-end}
313308
```
@@ -317,31 +312,30 @@ plt.show()
317312
:label: ogfast_ex3
318313
```
319314

320-
在这个练习中,我们回到原始的对数效用规范
315+
在本练习中,我们回到最初的对数型效用函数设定
321316

322-
一旦给定最优消费策略$\sigma$,收入遵循
317+
当给定最优消费政策 $\sigma$ 后,收入的动态演化如下:
323318

324319
$$
325320
y_{t+1} = f(y_t - \sigma(y_t)) \xi_{t+1}
326321
$$
327322

328-
下图显示了三种不同贴现因子(因此是三种不同策略)下该序列100个元素的模拟
323+
下图展示了该序列在三种不同贴现因子(因而对应三种不同政策)下的模拟结果,每个序列包含 100 个样本点
329324

330325
```{figure} /_static/lecture_specific/optgrowth/solution_og_ex2.png
331326
```
332327

333-
在每个序列中,初始条件是$y_0 = 0.1$。
328+
在每个序列中,初始条件都是 $y_0 = 0.1$。
334329

335-
贴现因子为`discount_factors = (0.8, 0.9, 0.98)`
330+
贴现因子分别为`discount_factors = (0.8, 0.9, 0.98)`
336331

337332
我们还通过设置`s = 0.05`稍微降低了冲击的幅度。
338333

339-
除此之外,参数和原始设定与讲座前面讨论的对数线性模型相同
334+
除此之外,参数和原始设定与前面讨论的对数线性模型相同
340335

341336
注意,更有耐心的个体通常拥有更高的财富。
342337

343-
344-
复现该图形,允许随机性。
338+
请在保持随机性结构的前提下,复现该图像。
345339

346340
```{exercise-end}
347341
```
@@ -350,7 +344,7 @@ $$
350344
:class: dropdown
351345
```
352346

353-
这是一个解决方案
347+
参考答案
354348

355349
```{code-cell} ipython3
356350
def simulate_og(σ_func, og, y0=0.1, ts_length=100):

0 commit comments

Comments
 (0)