贝尔曼方程为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取值0.1到17,设定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 20:02:30 浏览: 64
贝尔插值算法
4星 · 用户满意度95%
以下是用MATLAB实现的效用最大化条件下各K取值的t期家庭终生效用贴现值V(K(t))的代码:
```matlab
% 定义参数
beta = 0.95;
alpha = 0.7;
delta = 0.2;
K_min = 0.1;
K_max = 17;
N = 100;
tol = 1e-6;
% 定义辅助函数
u = @(c) log(c);
y = @(k) k^alpha;
c = @(k, k_next) y(k) + (1 - delta) * k - k_next;
% 初始化
K_vec = linspace(K_min, K_max, N)';
V = zeros(N, 1);
V_new = zeros(N, 1);
policy = zeros(N, 1);
diff = inf;
iter = 0;
% 迭代贝尔曼方程
while diff > tol
for i = 1:N
k = K_vec(i);
V_temp = zeros(N, 1);
for j = 1:N
k_next = K_vec(j);
if c(k, k_next) > 0
V_temp(j) = u(c(k, k_next)) + beta * V(j);
else
V_temp(j) = -inf;
end
end
[V_new(i), policy(i)] = max(V_temp);
end
diff = max(abs(V - V_new));
fprintf('Iter %d: diff = %f\n', iter, diff);
V = V_new;
iter = iter + 1;
end
% 绘制图像
figure;
plot(K_vec, V);
title('Value Function');
xlabel('K');
ylabel('V(K)');
figure;
plot(K_vec, policy);
title('Policy Function');
xlabel('K');
ylabel('Policy(K)');
```
代码中,首先定义了模型的参数,以及辅助函数u、y和c。接着,初始化K_vec、V、V_new和policy,并设定收敛误差tol。在迭代过程中,对于每一个K_vec(i),计算其对应的V_new(i)和policy(i)。最后,绘制出结果图像。
注意,本代码仅供参考,具体实现可能还需要根据具体问题进行调整。
阅读全文