Matlab中的函数fzero不收敛

Matlab中的函数fzero不收敛,matlab,numerical-methods,numerical-analysis,numerical-computing,Matlab,Numerical Methods,Numerical Analysis,Numerical Computing,我正在宏观经济学课上解决一个问题。考虑下面的等式: 这里,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,

我正在宏观经济学课上解决一个问题。考虑下面的等式:

这里,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

beta=0.98;
δ=0.13;
A=2;
α=1/3;
n_网格=1000;%资本的点数
k_网格=linspace(5,15,n_网格)';
tol=1e-5;
最大值=1000;
c0=一(n_网格,1);
新k=零(n网格,1);
距离c=tol+1;
it_c=0;
而dist_c>tol&it_c
当我运行这段代码时,对于一些索引$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)

唯一能产生复数的术语是

k'^(alpha - 1) = k'^(-2/3)
您可能希望根据立方根的实际变量得到结果,如下所示:

sign(k') * abs(k')^(-2/3)
或者更一般地说,避免零除法

k' * (1e-16+abs(k'))^(alpha - 2)

您是否希望
k
值始终为正值?然后,它可能有助于为解算器参数化
k'=e^u
function@LutzLehmann是的,结果应该总是积极的!这是个好主意,谢谢。您是否希望
k
值始终为正值?然后,它可能有助于为解算器参数化
k'=e^u
function@LutzLehmann是的,结果应该总是积极的!这是个好主意,谢谢。对不起,这是我的错。但我如何将其集成到代码中?定义一个幂函数,如
mypow=(x,a)x.*(eps+abs(x)。^(a-1))
并用该函数替换所有幂函数。或者使用指数版本
k_next=exp(fzero(@(u)f(exp(u)),log(k0))mypow=(x,a)x.*(eps+abs(x)。^(a-1))
并用该函数替换所有幂函数。或者使用指数版本
k_next=exp(fzero(@(u)f(exp(u)),log(k0))