一、确定性的动态规划问题
考虑这样一个简单的吃蛋糕的问题:(此模型其实可以看作是RCK最优增长模型的家庭效用最大化的决策问题) 你有一个蛋糕大小是
,每期消费量
,当期蛋糕剩余量为
,蛋糕效用的“折现率”为
,蛋糕每期的持有回报率为
,现在考虑吃蛋糕的人的效用最大化问题,为使问题更加具体化,不妨设效用函数
(CRRA效用函数),考虑如下一个最优化问题:
求其贝尔曼方程为:
,过程如下: 定义其值函数
:
则原问题转换为对贝尔曼方程的动态规划(本题特指无限期确定性动态规划)问题:
程序主要通过迭代法求近似解(数理方法亦可解出准确解:值函数:
,策略函数:
)
%matplotlib inline
from __future__ import division
from scipy.interpolate import InterpolatedUnivariateSpline #一维插值函数
from scipy.optimize import fminbound #求其最小值的函数,返回其最小值点
import matplotlib.pyplot as plt #绘图
import numpy as np
class CakeProblem(object):
def __init__(self, beta=0.96, r = 1.0, gamma = 1.5,
grid_max=2.5, grid_min = 1e-3, grid_size=120):#grid_max代表蛋糕的尺寸,size代表点集的数量
self.r, self.beta, self.gamma = r, beta, gamma #变量初始化,具体说明见题意
if gamma != 1.0:
self.u = lambda c: (c**(1 - gamma))/(1 - gamma)
else:
self.u = np.log
self.gamma = 1
self.grid = np.linspace(grid_min, grid_max, grid_size)#生成插值点
def bellman_operator(self, w):#定义贝尔曼方程,用于后面的迭代求解
Vx = InterpolatedUnivariateSpline(self.grid, w)#对W进行关于grid的一维插值
Tw = np.empty(len(w))
c = np.empty(len(w))
for i, x in enumerate(self.grid):
value = lambda c: - self.u(c) - self.beta * Vx(self.r*(x - c))#定义贝尔曼方程
c_star = fminbound(value, 1e-6, x-1e-6)#最优化
Tw[i] = -