Слишком много уровней рекурсии при попытке построить рекурсивную функцию

Я пытаюсь построить график рекурсивной функции в 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)]);

введите описание изображения здесь

Другие вопросы по тегам