贝尔曼方程为V(K(t))=ln(c(t))+ln(K(t))+0.95*V(K(t+1)),约束条件为:y(t)=k(t)^0.7,K(t+1)=y(t)+0.8*K(t)-c(t),设定c(t)介于0.05至K(t)之间,资本K的初始值K(0)=4,设定t+1期各K取值的家庭终生效用贴现值V(K(t+1))初始值均为0,第t期家庭终生效用贴现值V(K(t)),并将V(K(t+1))赋值为对应K的V(K(t)),以此迭代贝尔曼方程直到收敛,利用插值法计算效用最大化条件下各K取值的t期家庭终生效用贴现值V(K(t))的matlab代码
时间: 2023-08-06 09:03:05 浏览: 89
利用MATLAB软件进行插值计算
以下是基于你提供的模型和参数的matlab代码:
```
% 定义参数
beta = 0.95;
alpha = 0.7;
delta = 0.8;
K_min = 0.05;
K_max = 4;
K_size = 100;
tol = 1e-6;
max_iter = 1000;
% 初始化
K_grid = linspace(K_min, K_max, K_size)';
V = zeros(K_size, 1);
V_new = zeros(K_size, 1);
c = zeros(K_size, 1);
% 迭代贝尔曼方程
iter = 0;
while iter < max_iter
for i = 1:K_size
for j = 1:K_size
y = K_grid(i)^alpha;
K_next = y + delta*K_grid(j) - c(j);
if K_next < K_min || K_next > K_max
continue
end
V_temp(j) = log(c(j)) + log(K_grid(j)) + beta*V(j);
end
[V_new(i), idx] = max(V_temp);
c(i) = fminbnd(@(x) -log(x) - beta*interp1(K_grid, V, y + delta*K_grid(idx) - x, 'linear', 'extrap'), K_min, K_grid(i));
end
diff = norm(V_new - V);
if diff < tol
break
end
V = V_new;
iter = iter + 1;
end
% 使用插值法计算效用最大化条件下各K取值的t期家庭终生效用贴现值
V_func = griddedInterpolant(K_grid, V, 'linear');
V_vals = V_func(K_grid);
% 绘制图像
plot(K_grid, V_vals);
xlabel('Capital')
ylabel('Value')
title('Value Function')
```
说明:
1. 首先,我们定义了模型的参数,包括折现率beta、资本产出比例alpha、折旧率delta、资本的最小值和最大值K_min和K_max、K的数量K_size、收敛容差tol和最大迭代次数max_iter。
2. 然后,我们初始化K网格、价值函数V和消费函数c,并开始迭代贝尔曼方程。
3. 在每次迭代中,我们首先计算每个K网格中所有可能的下一期K值对应的价值函数,并计算消费函数对应的效用贴现值。我们使用fminbnd函数来找到最大化效用贴现值的消费函数,并使用插值法来计算对应的效用贴现值。
4. 在每次迭代结束时,我们检查当前价值函数与上一次的价值函数之间的差异是否小于收敛容差。如果是,则说明价值函数已经收敛,我们退出迭代。否则,我们将当前价值函数赋值给上一次的价值函数,并继续迭代。
5. 最后,我们使用插值法计算效用最大化条件下各K取值的t期家庭终生效用贴现值,并绘制图像。
阅读全文