-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfirm.m
85 lines (65 loc) · 2.5 KB
/
firm.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
classdef firm
methods(Static)
% production function and marginal products
function out = fY(K,L,TFP)
global alpha;
out = TFP.*K.^alpha.*L.^(1-alpha);
end
function out = MPK(K,L,TFP)
global alpha;
out = TFP.*alpha.*(K./L).^(alpha-1);
end
function out = MPKinv(MPKin,L,TFP)
global alpha;
out = L.*(MPKin./(TFP.*alpha)).^(1/(alpha-1));
end
function out = MPL(K,L,TFP)
global alpha;
out = TFP.*(1-alpha).*(K./L).^alpha;
end
% invert the firm problem: finds r for given V (and LS, TFP and taxes)
function r2 = rdemand(assetsupply, maxiter, tol, verbose)
global K uck r qTob LD TFP tauprof delta tend;
K2 = K;
uck2 = uck;
r2 = r;
qTob2 = qTob;
error = Inf;
iter = 0;
while true
iter = iter + 1;
error_old = error;
qTob_old = qTob2;
K2 = assetsupply./qTob2;
%K2(1) = K(1); %predetermined
uck2 = firm.MPK(K2,LD,TFP);
qTob2 = (1-tauprof).*uck2 + tauprof*delta + (1-delta);
error = sum(abs(qTob2-qTob_old));
if (verbose)
fprintf("Iteration:\t%3u\t\tError:\t%8.5f\n",iter,error);
end
if (iter > maxiter)
if (verbose)
fprintf("No convergence!!\n");
end
break;
end
if (error < tol)
if (verbose)
fprintf("Convergence!!\n");
end
break;
end
if (error > error_old)
if (verbose)
fprintf("Increasing error: stop at previous step!\n");
end
qTob2 = qTob_old;
break;
end
end
r2(1:(tend-1)) = qTob2(2:tend)-1;
r2(tend) = r2(tend-1);
end
end
end