23. 一维动力学#
23.1. 概述#
在经济学中,许多变量依赖于它们的过去值。
例如,我们有理由相信去年的通货膨胀会影响今年的通货膨胀。 (比如去年的高通胀会导致人们要求更高的工资作为补偿,导致今年的价格进一步上涨。)
用
其中
这个方程是一维离散时间动力系统的典型例子。
在本讲中,我们将探讨一维离散时间动力学的基本原理。
(虽然实际经济模型通常包含两个或更多状态变量,但一维框架为我们理解基础理论和掌握核心概念提供了绝佳的起点。)
让我们从一些标准导入开始:
import matplotlib.pyplot as plt
import numpy as np
23.2. 一些定义#
本节将介绍我们要研究的对象和关键概念。
23.2.1. 函数组合#
首先,让我们回顾一下函数组合的概念:
如果
是从集合 到集合 的函数,且 是从集合 到集合 的函数
那么
举个简单的例子,如果
(实数集) 且
那么
当函数映射到自身的集合时,我们可以定义函数的多次组合。如果
例如,当
更一般地,对于任意正整数
在上面的例子中,
23.2.2. 动态系统#
(离散时间)动态系统由一个集合
动态系统的例子包括:
且 且 (整数集)且
如果
即
并不总是将 中的点映射回 。
研究动态系统的重要性在于它们能帮助我们理解和分析动态过程的基本特性。
给定由集合
来创建由
这意味着我们选择
这个序列
在这个理论框架下,
回想一下
在接下来的所有内容中,我们假设
方程 (23.1) 有时被称为一阶差分方程
一阶意味着只依赖于一个滞后(即,像
这样的更早期的状态不会出现在 (23.1) 中)。
23.2.3. 示例:线性模型#
动态系统的一个典型例子是状态空间
由此可得线性差分方程
其中
继续这样下去,并利用我们对几何级数的知识,我们发现,对于任何
我们可以对任意非负整数
值得注意的是,当
无论起点
这是被称为全局稳定性的一个例子,我们将在后面再次讨论这个话题。
23.2.4. 示例:非线性模型#
在上面的线性例子中,我们得到了
这使得动力学分析变得轻而易举。
然而,当模型是非线性时,情况可能会大不相同。
以索洛-斯旺增长模型为例(后续章节将深入分析),其动态规律由以下方程给出
这里
所有这些参数都是正数,且
如果你尝试像我们在线性模型中做的那样迭代,你会发现代数运算很快就变得复杂。
分析这个模型的动态需要一种不同的方法(见下文)。
23.3. 稳定性#
考虑这样一个动态系统,其由集合
23.3.1. 稳态#
该系统的稳态是
换句话说,
例如,对于线性模型
当
时, 是一个稳态,如果
且 ,那么每个 都是稳态,如果
且 ,那么这个线性模型在 中没有稳态。
23.3.2. 全局稳定性#
如果对于所有的
那么动态系统的稳态
例如,在线性模型
如果
,则是全局稳定的,否则不是全局稳定的。
以上可以直接从方程 (23.4) 得出。
23.3.3. 局部稳定性#
如果存在一个
那么动态系统的稳态
显然,每个全局稳定的稳态也是局部稳定的。
下面是一个反之不成立的例子。
Example 23.1
考虑
例如,对于任何
然而,
由于我们有多个不动点,
23.4. 图形分析#
如我们上面所见,分析非线性模型的动态是非常复杂的。
没有一种单一的方法可以处理所有的非线性模型。
然而,对于一维模型,有一种技巧可以提供大量的直观理解。
这是一种基于45度图的图形方法。
让我们看一个例子:索洛-斯旺模型,其动态由(23.6)给出。
我们首先从一些绘图代码开始,你可以在第一次阅读时忽略这些代码。
这段代码的功能是生成45度图和时序图。
Show source
def subplots():
"通过原点的自定义子图轴"
fig, ax = plt.subplots()
# 通过原点设置坐标轴
for spine in ['left', 'bottom']:
ax.spines[spine].set_position('zero')
ax.spines[spine].set_color('green')
for spine in ['right', 'top']:
ax.spines[spine].set_color('none')
return fig, ax
def plot45(g, xmin, xmax, x0, num_arrows=6, var='x'):
xgrid = np.linspace(xmin, xmax, 200)
fig, ax = subplots()
ax.set_xlim(xmin, xmax)
ax.set_ylim(xmin, xmax)
ax.set_xlabel(r'${}_t$'.format(var), fontsize=14)
ax.set_ylabel(r'${}_{}$'.format(var, str('{t+1}')), fontsize=14)
hw = (xmax - xmin) * 0.01
hl = 2 * hw
arrow_args = dict(fc="k", ec="k", head_width=hw,
length_includes_head=True, lw=1,
alpha=0.6, head_length=hl)
ax.plot(xgrid, g(xgrid), 'b-', lw=2, alpha=0.6, label='g')
ax.plot(xgrid, xgrid, 'k-', lw=1, alpha=0.7, label='45')
x = x0
xticks = [xmin]
xtick_labels = [xmin]
for i in range(num_arrows):
if i == 0:
ax.arrow(x, 0.0, 0.0, g(x), **arrow_args) # x, y, dx, dy
else:
ax.arrow(x, x, 0.0, g(x) - x, **arrow_args)
ax.plot((x, x), (0, x), 'k', ls='dotted')
ax.arrow(x, g(x), g(x) - x, 0, **arrow_args)
xticks.append(x)
xtick_labels.append(r'${}_{}$'.format(var, str(i)))
x = g(x)
xticks.append(x)
xtick_labels.append(r'${}_{}$'.format(var, str(i+1)))
ax.plot((x, x), (0, x), 'k', ls='dotted')
xticks.append(xmax)
xtick_labels.append(xmax)
ax.set_xticks(xticks)
ax.set_yticks(xticks)
ax.set_xticklabels(xtick_labels)
ax.set_yticklabels(xtick_labels)
bbox = (0., 1.04, 1., .104)
legend_args = {'bbox_to_anchor': bbox, 'loc': 'upper right'}
ax.legend(ncol=2, frameon=False, **legend_args, fontsize=14)
plt.show()
def ts_plot(g, xmin, xmax, x0, ts_length=6, var='x'):
fig, ax = subplots()
ax.set_ylim(xmin, xmax)
ax.set_xlabel(r'$t$', fontsize=14)
ax.set_ylabel(r'${}_t$'.format(var), fontsize=14)
x = np.empty(ts_length)
x[0] = x0
for t in range(ts_length-1):
x[t+1] = g(x[t])
ax.plot(range(ts_length),
x,
'bo-',
alpha=0.6,
lw=2,
label=r'${}_t$'.format(var))
ax.legend(loc='best', fontsize=14)
ax.set_xticks(range(ts_length))
plt.show()
让我们为索洛-斯旺模型创建一个45度图,使用固定的参数集。以下是对应该模型的更新函数。
def g(k, A = 2, s = 0.3, alpha = 0.3, delta = 0.4):
return A * s * k**alpha + (1 - delta) * k
以下是一个45度图。
这张图显示了函数
可以将
要计算
显然,
如果在这一点上
位于45度线之上,那么我们有 。如果在这一点上
位于45度线之下,那么我们有 。如果在这一点上
与45度线相交,那么我们有 ,所以 是一个稳态。
对于索洛-斯旺模型,当
原点
唯一的正数,使得
。
通过一些代数运算,我们可以证明在第二种情况下,其稳态是
23.4.1. 轨迹#
根据前面的讨论,在
下图追踪了这样一个区域内的轨迹,使我们能更清楚地看到这一点。
初始条件是
我们可以按照上图所示,绘制人均资本随时间变化的时序图,具体如下:
这里是一个稍长期一些的视角:
当人均资本存量高于唯一的正稳态值时,我们可以看到它呈下降趋势:
这里是一个时间序列:
23.4.2. 复杂动态#
尽管索洛-斯旺模型是非线性的,它仍然能生成非常规律的动态。
二次映射是一个能生成不规则动态的模型
让我们来看看45度图。
现在让我们来看一个特定的轨迹。
注意这个轨迹的不规则性。这种混沌行为是二次映射的典型特征。
这是相应的时序图。
在更长的时间范围内,这种不规则性甚至更加明显:
23.5. 练习#
Exercise 23.1
再次考虑线性模型
其唯一的稳态为
当
请通过选择不同的初始条件并绘制相应的图像来验证这一性质。
在
使用
在整个过程中设置
Solution to Exercise 23.1
我们将从
让我们设置模型和绘图区域:
a, b = 0.5, 1
xmin, xmax = -1, 3
g = lambda x: a * x + b
现在让我们来绘制轨迹:
这是相应的时间序列,它收敛于稳态。
现在让我们尝试
我们设置模型和绘图区域为:
a, b = -0.5, 1
xmin, xmax = -1, 3
g = lambda x: a * x + b
现在让我们来绘制轨迹:
以上是相应的时间序列,它收敛于稳态。
我们同样观察到序列收敛到稳态,但收敛方式明显不同。
这次时间序列不是单调收敛,而是在稳态值的上下来回波动,逐渐接近稳态。
这种在接近稳态过程中振幅逐渐减小的波动模式,在动力系统中被称为阻尼振荡。