我是靠谱客的博主 糊涂手机,最近开发中收集的这篇文章主要介绍matlab内部迭代函数_MATLAB:向量化编程提升值函数迭代(Value Function Iteration)的速度...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

作者: 王美庭
Email: wangmeiting92@gmail.com
参考资料:我们高宏王彬老师的讲义

考虑以下贝尔曼方程:

迭代思想为:

直至值函数收敛。在编程时,我们需要对函数进行离散化。于是令

构建 矩阵:

该矩阵第 行的最大值即为 ,从而可得到下一期的 。依此类推,即可构建出值函数迭代的编程过程。最开始时,我们可能会考虑使用循环来得到 矩阵,这在思维上是比较清晰易懂、在编程中也是比较好操作的,代码可能如下:

vkk = zeros(N,N);               
 for i=1:N
     for j=1:N
         if A*k(i)^alpha-k(j)<=1e-5
             vkk(i,j) = -1e5; %如果消费为负,则使其不会被选中
         else
             vkk(i,j)= log(A*k(i)^alpha-k(j))+beta*v0(j);
         end
     end
 end

但这可能在运算上花费大量时间。如果我们采用向量化编程,代码可能如下(读者自己可以doc其中自己不太清楚的命令来理解其中的编程思想,其实这里仅仅是额外用到了repmat函数):

ckk = repmat(A*k.^alpha,1,N) - repmat(k',N,1);
ckk(ckk<1e-5) = 1e-10;
lckk = log(ckk);
lckk(lckk<-23) = -1e5;
vkk = lckk + beta*repmat(v0',N,1);

如果是 stochastic 的情况,那你可能还需用到 permutereshape函数。

在下方的测试代码中,向量化编程求解的速度将是循环求解的 10 倍左右。这里只是一个简单的练习,如果是 stochastic 的情况,情况会更复杂,可能会涉及到多维矩阵的构建,这时你可能需要花很多的时候来保证不出错,但是,为了后期计算速度的提升,这往往是值得的。下面附上全部代码以及运算结果图像:febd96ecf9d52a00159ffbfa36ee9bb4.png

%=========================================================================
% Chapter 2
% File: vfi_wmt.m
% Purpose: solve the infinite optimal growth model
% Method: value function iteration
% Update: January 18, 2021
% Written by Meiting Wang
%=========================================================================

tic
clear all;
close all;
clc;


%% parameters
A = 5;
alpha = 1/3;
beta = 0.99;
kbar = (A*alpha*beta)^(1/(1-alpha));
k = [1/5*kbar:0.05:5*kbar]';
N = length(k);
v0 = zeros(N,1);
d0 = zeros(N,1);
tol = 1e-5;
maxI = 1e5;
diff = 2;

it = 0;  %counter of iteration


%% value function iteration
while (diff >= tol) & (it <= maxI)
    if mod(it,100) == 0
       fprintf('Iteration: %4.0f    diff: %.3en',it,diff);
    end
    
    ckk = repmat(A*k.^alpha,1,N) - repmat(k',N,1);
    ckk(ckk<1e-5) = 1e-10; %make ln(ckk) meaningful
    lckk = log(ckk);
    lckk(lckk<-23) = -1e5; %make values that consume too little will not be selected
    vkk = lckk + beta*repmat(v0',N,1); %get the vkk matrix
    
    %Get the value function and policy function in the next period
    [v1,d1] = max(vkk,[],2);
    diff = max(abs(v1-v0));
    v0 = v1;
    d0 = d1;
    it = it + 1;
end

if diff    disp('Value function iteration succeeds');
   fprintf('Iteration: %4.0f    diff: %.3en',it,diff);
else
    disp('Value function iteration fails');
    fprintf('Iteration: %4.0f    diff: %.3en',it,diff);
end

% Output the mean and variance of v0 and d0.
fprintf('MEAN of v0: %7.3f       VAR of v0: %7.3fn',mean(v0),var(v0))
fprintf('MEAN of d0: %7.3f       VAR of d0: %7.3fn',mean(d0),var(d0))
toc


%% graph
% Value Function
E = 1/(1-beta)*(log(A*(1-alpha*beta))+alpha*beta/(1-alpha*beta)*log(alpha*beta*A));
F = alpha/(1-alpha*beta);
v_closed = E + F*log(k);

figure;
P = plot(k,v0,'-',...
    k,v_closed,'*');
P(2).MarkerIndices = 1:20:length(k);
xlabel('k');
ylab = ylabel('v   ');
ylab.Rotation = 0;
legend({'Value Function Iteration','Close-Form Solution'},...
    'Location','southeast','NumColumns',1)
saveas(gcf,'1_1','pdf')

% Policy Function
k_prime_closed = A*alpha*beta*k.^alpha;

figure;
P = plot(k,k(d0),'-',...
    k,k_prime_closed,'*');
P(2).MarkerIndices = 1:20:length(k);
xlabel('k');
ylab = ylabel("k^{prime}   ");
ylab.Rotation = 0;
axis equal;
xlim([0 11]);
ylim([1 4]);
legend({'Value Function Iteration','Close-Form Solution'},...
    'Location','southeast','NumColumns',1)
saveas(gcf,'1_2','pdf')

% Saddle Path
c = A*k.^alpha - k(d0);

figure;
plot(k,c,'-',...
    [kbar kbar],[0 12],'-',...
    0:0.02:12,A*(0:0.02:12).^alpha-(0:0.02:12),'-');
xlabel('k');
ylab = ylabel('c  ');
ylab.Rotation = 0;
xlim([0 12]);
ylim([0 12]);
legend({'Saddle Path',...
    '$bar{k}=(Aalphabeta)^{frac{1}{1-alpha}}, Delta c_{t+1}=0$',...
    '$c_t = Ak_t^alpha - k_t, Delta k_{t+1}=0$'},...
    'Location','northeast','NumColumns',1,'interpreter','latex')
saveas(gcf,'1_3','pdf')

最后

以上就是糊涂手机为你收集整理的matlab内部迭代函数_MATLAB:向量化编程提升值函数迭代(Value Function Iteration)的速度...的全部内容,希望文章能够帮你解决matlab内部迭代函数_MATLAB:向量化编程提升值函数迭代(Value Function Iteration)的速度...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部