Как решить рекуррентные отношения в R

#r #recurrence

Вопрос:

Я хорошо знаю, что R был разработан для статистики, а не для рекуррентных отношений, однако было бы здорово иметь возможность это сделать.

Я изучаю более высокие приложения по математике, и мне предоставляется выбор между использованием Excel или R для сдачи экзамена. Я использую R для остальной части экзамена, поэтому я бы предпочел иметь возможность решать рекуррентное отношение, используя его, чтобы избежать необходимости переключаться между ними.

Вот несколько примеров вопросов:

Пример вопроса о рекуррентных отношениях

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

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

Любая помощь будет оценена.

Комментарии:

1. Да, я думаю, вы найдете множество руководств, если будете искать «r recursion», например geeksforgeeks.org/recursive-functions-in-r-programming Мнения могут быть разными, и этот форум, как правило, уклоняется от вопросов, основанных на мнениях. Полностью выполнимо в Excel или R, зависит от ваших предпочтений.

Ответ №1:

Этот тип вопросов может быть обработан с помощью простого цикла в R. Например, первый вопрос можно решить, написав следующую функцию:

 waste_simulation <- function(initial_value)
{
   units <-initial_value
   units <- c(units, units[1] * 0.6   50)
   
   while(units[length(units)] != units[length(units) - 1]) {
      units <- c(units, units[length(units)] * 0.6   50)
   }
   return(units)
}
 

Это позволяет вам протестировать каждое начальное начальное значение:

 waste_simulation(100)
#>  [1] 100.0000 110.0000 116.0000 119.6000 121.7600 123.0560 123.8336 124.3002
#>  [9] 124.5801 124.7481 124.8488 124.9093 124.9456 124.9673 124.9804 124.9882
#> [17] 124.9929 124.9958 124.9975 124.9985 124.9991 124.9995 124.9997 124.9998
#> [25] 124.9999 124.9999 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000
#> [33] 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000
#> [41] 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000
#> [49] 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000
#> [57] 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000
#> [65] 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000
 
waste_simulation(200)
#>  [1] 200.0000 170.0000 152.0000 141.2000 134.7200 130.8320 128.4992 127.0995
#>  [9] 126.2597 125.7558 125.4535 125.2721 125.1633 125.0980 125.0588 125.0353
#> [17] 125.0212 125.0127 125.0076 125.0046 125.0027 125.0016 125.0010 125.0006
#> [25] 125.0004 125.0002 125.0001 125.0001 125.0000 125.0000 125.0000 125.0000
#> [33] 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000
#> [41] 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000
#> [49] 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000
#> [57] 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000
#> [65] 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000 125.0000
#> [73] 125.0000
 
waste_simulation(125)
#> [1] 125 125
 

Мы можем видеть, что во всех 3 случаях значение сходится к 125 (что равно 50/0.4).

Создано 2021-11-02 пакетом reprex (v2.0.0)

Комментарии:

1. Не лучше ли было бы определить допуск Tol <- abs(units[length(units)]-units[length(units)-1]) и максимальное количество итераций для выполнения этой задачи?

2. @Diego да — справедливое замечание — и изначально я так и сделал. Я удалил их, чтобы попытаться упростить код по дидактическим соображениям.