Ошибка рекурсии MatLab (новичок) - PullRequest
1 голос
/ 02 июня 2009

Хорошо. Итак, у меня есть две функции в 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 ]

4 голосов
/ 02 июня 2009

Ваша проблема с определением ваших функций: чтобы иметь возможность работать с рекурсивным определением, вы должны иметь возможность вычислить хотя бы одну из двух функций без другой, хотя бы для некоторых значений , Вы должны также убедиться, что каждое вычисление будет зависеть от результатов, которые вы можете получить без рекурсии.

Для вашей конкретной проблемы у меня есть ощущение, что вы хотите интегрировать функцию 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)
0 голосов
/ 02 июня 2009

Функция myfunc не заканчивается после f = sin(1./x);, где она должна. Завершите там функцию и вызовите код построения из другого места (отдельный файл).

Из руководства: Вы можете завершить любую функцию с помощью оператора end, но в большинстве случаев это необязательно. Операторы end требуются только в M-файлах, которые используют одну или несколько вложенных функций. В таком M-файле каждая функция (включая основную, вложенную, частную и подфункцию) должна завершаться оператором end. Вы можете завершить любой тип функции с помощью end, но это не требуется, если M-файл не содержит вложенную функцию.

0 голосов
/ 02 июня 2009

Вам нужно заключительное условие для ввода x, когда myFunc перестает вызывать Римана. Также лучше отправлять реальную функцию (в данном случае sin) Риману, чем вызывать myFunc.

...