Ошибка рекурсии MatLab (новичок)
Хорошо. Итак, у меня есть две функции в MatLab, которые вызывают друг друга.
Riemann.m
function I = Riemann(f, dx, a, b)
x = a:dx:b;
fx = f(x).*dx;
I = sum(fx);
и myfunc.m
function f = myfunc(x)
f = sin(1./x);
for n=1:100
I = Riemann(@myfunc, 0.001, 1/n, 1);
end
plot(I)
Проблема состоит в том, чтобы заставить это бежать. Как мне позвонить myfunc, чтобы получить что-нибудь из этого. Все, что я пробовал, заканчивается бесконечным стеком рекурсивных вызовов (что имеет смысл).
3 ответа
Ваша проблема с определением ваших функций: чтобы иметь возможность работать с рекурсивным определением, вы должны иметь возможность вычислять хотя бы одну из двух функций без другой, хотя бы для некоторых значений. Вы также должны убедиться, что каждое вычисление будет зависеть от результатов, которые вы можете получить без рекурсии.
Для вашей конкретной проблемы у меня есть ощущение, что вы хотите интегрировать функцию f(x)=sin(1./x). Если это так, код вашей второй функции должен выглядеть так:
function f = myfunc(x)
fct = @(x) sin(1./x);
f = fct(x);
for n=1:100
I = Riemann(fct, 0.001, 1/n, 1);
end
plot(I)
Вам нужно заключительное условие для ввода x, когда myFunc перестает вызывать Римана. Также лучше отправить реальную функцию (в данном случае sin) Риману, чем вызывать myFunc.
Функция myfunc не заканчивается после f = sin(1./x);
где это должно. Завершите функцию там и вызовите код построения из другого места (отдельный файл).
Из руководства: Вы можете завершить любую функцию с помощью оператора end, но в большинстве случаев это необязательно. Операторы end требуются только в M-файлах, в которых используется одна или несколько вложенных функций. В таком M-файле каждая функция (включая основную, вложенную, частную и подфункцию) должна завершаться оператором end. Вы можете завершить любой тип функции с помощью end, но это не требуется, если M-файл не содержит вложенную функцию.