我正在解决我的宏观经济学课上的问题。考虑以下等式:
这里,k是固定的,并且c(k)是通过Matlab中的``interp1''函数定义的。这是我的代码:
beta = 0.98;
delta = 0.13;
A = 2;
alpha = 1/3;
n_grid = 1000; % Number of points for capital
k_grid = linspace(5, 15, n_grid)';
tol = 1e-5;
max_it = 1000;
c0 = ones(n_grid, 1);
new_k = zeros(n_grid, 1);
dist_c = tol + 1;
it_c = 0;
while dist_c > tol && it_c < max_it
c_handle = @(k_tomorrow) interp1(k_grid, c0, k_tomorrow, 'linear', 'extrap');
for i=1:n_grid
% Solve for k'
euler = @(k_tomorrow) (1/((1-delta)* k_grid(i) + A * k_grid(i)^alpha - k_tomorrow)) - beta*(1-delta + alpha*A*k_tomorrow^(alpha - 1))/c_handle(k_prime);
new_k(i) = fzero(euler, k_grid(i)); % What's a good guess for fzero?
end
% Compute new values for consumption
new_c = A*k_grid.^alpha + (1-delta)*k_grid - new_k;
% Check convergence
dist_c = norm(new_c - c0);
c0 = new_c;
it_c = it_c + 1;
end
当我运行此代码时,对于某些索引$ i $,它运行良好,并且fzero可以找到解决方案。但是对于索引,它只返回NaN并退出而没有找到根。在经济学中,这是一个表现良好的问题,我们正在寻找的解决方案确实存在,并且保证了我尝试实现的算法可以正常工作。但是我在MATLAB中解决此问题的经验不足,我想我在某个地方有一个愚蠢的错误。关于如何进行的任何想法?
这是典型的错误消息:
退出fzero:中止搜索包含符号变化的间隔因为在搜索过程中遇到了复杂的函数值。(-2.61092处的功能值为0.74278-0.30449i。)检查功能或使用其他起始值重试。
非常感谢!
唯一可以产生复数的术语是
k'^(alpha - 1) = k'^(-2/3)
您可能想要根据多维数据集根的实际变体获得结果,您可以将其作为
sign(k') * abs(k')^(-2/3)
或更笼统地说,避免被零除
k' * (1e-16+abs(k'))^(alpha - 2)