贝尔曼方程为V(K(t))=ln(c(t))+ln(K(t))+0.95*V(K(t+1)),如果K(t)>=8.6,y(t)=K(t)^0.5,如果K(t)<8.6,y(t)=K(t)^0.3,K(t+1)=y(t)+0.8*K(t)-c(t),设定c(t)介于0.05至K(t)之间,资本K介于0.1至5之间,设定t+1期各K取值的家庭终生效用贴现值V(K(t+1))初始值均为0,利用插值法计算各K取值的t期家庭终生效用贴现值V(K(t)),并将V(K(t+1))赋值为对应K的V(K(t)),以此迭代贝尔曼方程直到收敛,计算效用最大化条件下各K取值的t期家庭终生效用贴现值V(K(t))的matlab代码
时间: 2023-08-12 17:08:44 浏览: 128
0977-极智开发-解读贝尔曼方程及示例代码
以下是使用matlab实现的代码:
```matlab
% 定义参数
beta = 0.95; % 贴现因子
tmax = 1000; % 最大迭代次数
tol = 1e-6; % 收敛阈值
kmin = 0.1; % 最小资本
kmax = 5; % 最大资本
cmin = 0.05; % 最小消费
y = zeros(tmax+1,kmax-kmin+1); % t期y值
V = zeros(tmax+1,kmax-kmin+1); % t期家庭终生效用贴现值
V_new = zeros(tmax+1,kmax-kmin+1); % t+1期家庭终生效用贴现值
% 初始化y和V
for k = kmin:kmax
if k >= 8.6
y(1,k-kmin+1) = k^0.5;
else
y(1,k-kmin+1) = k^0.3;
end
c = (k + y(1,k-kmin+1))/2; % 设定c(t)介于0.05至K(t)之间
V(1,k-kmin+1) = log(c) + log(k);
V_new(1,k-kmin+1) = 0;
end
% 迭代求解
for t = 1:tmax
% 更新V_new
for k = kmin:kmax
c = (k + y(t,k-kmin+1))/2; % 设定c(t)介于0.05至K(t)之间
V_new(t+1,k-kmin+1) = -Inf;
for kp = kmin:kmax
if kp >= 8.6
yp = kp^0.5;
else
yp = kp^0.3;
end
c_p = (kp + yp)/2; % 设定c(t+1)介于0.05至K(t+1)之间
if c_p <= kp % c(t+1)<=K(t+1)
V_temp = log(c) + log(k) + beta*interp1(kmin:kmax,V(t,kmin:kmax-kmin+1),kp,'linear','extrap');
if V_temp > V_new(t+1,k-kmin+1)
V_new(t+1,k-kmin+1) = V_temp;
y(t+1,k-kmin+1) = yp;
end
end
end
end
% 判断是否收敛
if max(abs(V_new(t+1,:)-V(t,:))) < tol
break;
end
% 更新V
V(t+1,:) = V_new(t+1,:);
end
% 绘制图像
k = kmin:kmax;
plot(k,V(t+1,:));
xlabel('Capital');
ylabel('Value');
title('Value Function');
```
该代码使用了插值法来计算各K取值的t期家庭终生效用贴现值V(K(t)),并将V(K(t+1))赋值为对应K的V(K(t)),以此迭代贝尔曼方程直到收敛。最后,绘制了效用最大化条件下各K取值的t期家庭终生效用贴现值V(K(t))的图像。
阅读全文