Слишком много уровней рекурсии при попытке построить рекурсивную функцию
Я пытаюсь построить график рекурсивной функции в Maple 17, но продолжаю получать ошибку Error (в f) слишком много уровней рекурсии.
Мне нужно построить логарифмический график в диапазоне х =1,...40. Вот код:
with(plots);
f:=x->(2.25*f(x-1)-0.5*f(x-2));
f(1):=1/3;
f(2):=1/12;
logplot(f(x),1..40);
Как я могу исправить эту проблему? Может быть, мне нужно написать это в итерационной форме, но я не знаю как. Большое спасибо за любую помощь!
2 ответа
С учетом вашего комментария, если вы сделаете следующее, то вы получите график, очень близкий к тому, который вы получили в Matlab.
Digits:= 15:
f:= proc(n)
option remember;
if not n::posint then 'procname'(args)
else 2.25*thisproc(n-1) - 0.5*thisproc(n-2)
end if
end proc:
f(1):= 1/3: f(2):= 1/12:
f_exact:= proc(n)
option remember;
if not n::posint then 'procname'(args)
else 9/4*thisproc(n-1) - 1/2*thisproc(n-2)
end if
end proc:
f_exact(1):= 1/3: f_exact(2):= 1/12:
plots:-logplot([
[seq([x, abs(f(x))], x= 1..40)],
[seq([x,f_exact(x)], x= 1..40)]
]);
Ваша функция чрезвычайно чувствительна к ошибкам с плавающей точкой. Вы должны использовать точную арифметику при вычислении значений f. Если вы этого не сделаете, вы получите отрицательные значения функций, и тогда использование логарифмов не будет иметь смысла.
Кроме того, ваша функция определяется только для целых значений n. Вы должны как-то сообщить сюжетной команде об этом.
f:= proc(n)
option remember;
if not n::posint then 'procname'(args)
else 9/4*thisproc(n-1) - 1/2*thisproc(n-2)
end if
end proc:
f(1):= 1/3: f(2):= 1/12:
plot([seq([x,log10(f(x))], x= 1..40)]);