matlab - 此 Matlab 函数主体有效,但函数本身无效(interp1 错误)

标签 matlab interpolation numerical-methods

我为欧拉策略迭代算法编写了以下子代码(带有注释的参数)。当我尝试运行函数体(全局以下的所有内容)时,例如 a1 = 1,它会起作用并返回一个标量。但是,当我将该函数调用为 euler_diff_test(1) 时,出现错误。 (粘贴在下面)

function diff = euler_diff_test(a1)
%the following comments are example parameters. They are in the global line originally.
% r = 0.2, a = 0.5, y = 1.1, a_grid = linspace(0.5,7,100)
%policy_guess = zeros(2,N);
%policy_guess(1,:) = 0.3*a_grid;
%policy_guess(2,:) = 0.3*a_grid;
% M = zeros(2,2); %M for markov transition kernel
% M(1,1) = p;
% M(2,2) = p;
% M(2,1) = 1-p;
% M(1,2) = 1-p;
% j = 1
global r a y a_grid policy_guess M j;

c = (1+r)*a + y - a1; %consumption formula

if c<=1e-02  %don't care about consumption being negative
    
    diff = 888888888888888888888;
else
    policy_func = interp1(a_grid', policy_guess', a1, 'linear');

    diff = 1/c - beta*(1+r)*(1 ./ policy_func)*M(j,:)'; 
end

end

错误读取:error 非常感谢任何帮助!

最佳答案

问题是你不了解全局变量也不了解它们是如何工作的!

你似乎在做类似的事情:

N=100; p=0.1;
r = 0.2, a = 0.5, y = 1.1, a_grid = linspace(0.5,7,100)
policy_guess = zeros(2,N);
policy_guess(1,:) = 0.3*a_grid;
policy_guess(2,:) = 0.3*a_grid;
M = zeros(2,2); %M for markov transition kernel
M(1,1) = p;
M(2,2) = p;
M(2,1) = 1-p;
M(1,2) = 1-p;
euler_diff_test(1)

这导致了您显示的错误。当然是!

首先,您需要了解什么是全局以及什么是工作空间。每个功能都有自己的工作空间或“范围”。这意味着只有在工作区中定义的变量才对函数本身可见。

全局变量是所有工作区都存在的变量,每个人都可以修改它。您似乎希望所有这些变量都在函数外部、函数内部定义。但要意识到!当变量被定义时,它们不是全局的。函数启动,在第一行,它只知道 a1 的存在。然后,稍后,您将一堆变量定义为全局变量,而函数不知道这些变量。那么该函数有什么作用呢?只需将它们创建为空即可。

如果您希望在主脚本作用域中创建的变量是全局变量,则需要将它们声明为全局变量,而不是在函数内部。因此,从函数中删除您的行 global ... ,并将其放在声明所有变量的脚本顶部,即顶部

% here! 
N=100; p=0.1;
...

在我的例子中。

现在,重要的是:全局变量很糟糕。当你有全局变量时,你不知道谁修改了,并且很容易忘记它们发生了什么,因为每个使用变量 a 的函数都会修改全局 a ,所以调试起来很痛苦。因此几乎没有人使用全局变量。最好的方法是将它们作为输入传递给函数,即将函数定义为:

function diff = euler_diff_test(a1,r, a, y, a_grid, policy_guess, M, j)

关于matlab - 此 Matlab 函数主体有效,但函数本身无效(interp1 错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63130851/

相关文章:

arrays - 单元格数组中的 strcmp 函数问题

matlab - 运行带参数的 matlab 程序

plot - 在 Julia 中使用带有插值函数的 gr() 绘制等高线图

python - 如何使用 scipy.interpolate 中的网格数据

c++ - 将 boost 与 numerical recipes 3 代码集成

language-agnostic - 函数近似

c++ - C++中的N体模拟

带键盘控制的 MATLAB GUI 按钮

python - 使用 SciPy 二维插值器时出错

python - Matplotlib 保存文件稍后在 ipython 中重新编辑