OPTIONS: Download this file, Download all MATLAB files, Go back
% Filename: cpdynam.m
% Author: Andy Qi
% Date: December 2008
% Corresponds to: Listing 6.7
% Note: All of the code is wrapped in a class definition so that it can
% be put in one file. See the comments in kurtzbellman.m. An example
% of usage is given below.
classdef cpdynam < handle
properties
alpha = 0.8;
a = 5.0;
c = 2.0;
W;
D;
P;
end
methods
function self = cpdynam
self.W = betarnd(5, 5, 1, 1000) * self.c + self.a; % Shock obs.
self.D = @(x) 1.0/x; % Demand curve
self.P = self.D; % Inverse of 1/x is just 1/x
end
function fp = fix_point(self, h, lower, upper)
% Computes the fixed point of h on [upper,lower] using fzero,
% which finds the zeros (roots) of a univariate function.
% Parameters : h is a function and lower and upper are numbers
% (floats or integers).
fp = fzero(@(x) x - h(x), [lower, upper]);
end
function t = T(self, p, x)
% Computes Tp(x), where T is the pricing functional operator.
% Parameters : p is an instance of lininterp and x is a number.
y = self.alpha * mean(p.interp(self.W));
if y <= self.P(x)
t = self.P(x);
return;
end
h = @(r) self.alpha * +...
mean(p.interp(self.alpha * (x - self.D(r)) + self.W));
t = self.fix_point(h, self.P(x), y);
end
end
end
% The following test shows how to use the class. Put the code in a
% separate file, in the same directory as cpdynam.m and lininterp
%
% cp = cpdynam;
% gridsize = 150;
% grid = linspace(cp.a, 35, gridsize);
% tol = 0.0005;
% vals = zeros(1, gridsize);
% new_vals = zeros(1, gridsize);
% for i = 1:gridsize
% vals(i) = cp.P(grid(i));
% end
% while 1
% hold on;
% plot(grid, vals);
% p = lininterp(grid, vals);
% f = @(x) cp.T(p, x);
% for i = 1:gridsize
% new_vals(i) = f(grid(i));
% end
% if max(abs(new_vals - vals)) < tol
% break
% end
% vals = new_vals;
% end
% hold off;