Тело этой функции Matlab работает, но не сама функция (ошибка interp1)

Я написал следующий фрагмент подкода (с комментариями параметров) для алгоритма итерации политики Эйлера. Когда я пытаюсь запустить тело функции (все, что ниже глобального), например, 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 Любая помощь очень ценится!


person Debreu    schedule 28.07.2020    source источник
comment
если вы каким-то образом заранее не определили a_grid, который вы не показываете, этот первый вызов interp1 будет иметь свой первый ввод, x не являющийся вектором. О чем говорит ошибка. вам нужен минимальный воспроизводимый пример, чтобы мы могли помочь в отладке   -  person Ander Biguri    schedule 28.07.2020
comment
Во второй строке комментариев я определяю a_grid = linspace(0.5, 7, 100) . Это проблема?   -  person Debreu    schedule 28.07.2020
comment
ну комментарий не выполняется, так и есть. Этот комментарий также может быть % call you mum, но если это комментарий, он ничего не делает... Вы хотите сказать, что определяете эти строки вне функции? Их недостаточно, чтобы быть минимально воспроизводимым примером, поскольку, например, N и p не определены.   -  person Ander Biguri    schedule 28.07.2020
comment
Спасибо за вашу помощь! Я думаю, вы правы, и это будет проблема с параметрами, поэтому я попытаюсь закрыть это сейчас.   -  person Debreu    schedule 28.07.2020


Ответы (1)


Проблема в том, что вы не понимаете глобалы и то, как они работают!

Кажется, вы делаете что-то вроде:

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)
person Ander Biguri    schedule 28.07.2020