@@ -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
5555import matplotlib.pyplot as plt
@@ -63,33 +63,33 @@ from numba import jit, jit
6363from 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$$
8080u(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
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):
184184og = OptimalGrowthModel()
185185```
186186
187- 现在我们调用` solve_model ` ,使用` %%time ` 魔法指令来检查运行时间 。
187+ 现在我们调用` solve_model ` ,使用` %%time ` 魔法指令来记录运行时间 。
188188
189189``` {code-cell} ipython3
190190%%time
191191v_greedy, v_solution = solve_model(og)
192192```
193193
194- 你会注意到这比我们的 {doc}` 原始实现 <optgrowth> ` 要* 快得多* 。
194+ 你会发现,这比我们的 {doc}` 原始实现 <optgrowth> ` 要* 快得多* 。
195195
196- 下面是生成的策略与真实策略的对比图 :
196+ 下面,生成近似策略与真实策略的对比图 :
197197
198198``` {code-cell} ipython3
199199fig, ax = plt.subplots()
@@ -208,7 +208,7 @@ ax.legend()
208208plt.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
236234v = 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$$
260258u(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
285283og_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)
298296fig, ax = plt.subplots()
299297
300298ax.plot(og.grid, v_greedy, lw=2,
301- alpha=0.6, label='近似值函数 ')
299+ alpha=0.6, label='近似价值函数 ')
302300
303301ax.legend(loc='lower right')
304302plt.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$$
325320y_{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```
350344:class: dropdown
351345```
352346
353- 这是一个解决方案 :
347+ 参考答案 :
354348
355349``` {code-cell} ipython3
356350def simulate_og(σ_func, og, y0=0.1, ts_length=100):
0 commit comments