Рекурсивная функция в Mathematica

#function #recursion #wolfram-mathematica

#Функция #Рекурсия #Wolfram-Mathematica

Вопрос:

Рассмотрим :

 dist = Parallelize[
   Table[RandomVariate[NormalDistribution[]], {100000}]];
  

Как я мог бы создать рекурсивную функцию, такую, что :

 Subscript[d, 1] = dist[[1]]

Subscript[d, 2] = .95 Subscript[d, 1]   dist[[2]]

Subscript[d, 3] = .95 Subscript[d, 2]   dist[[3]]
  

И делайте это до Subscript[d, 100000]

Спасибо.

Удивительно, что я впервые сталкиваюсь с этим.

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

1. Из любопытства, должно dist[[i]] быть 0.05*dist[[i]] ? (Если нет, мне любопытно, какое приложение для этого.)

2. @Brett, вы увидите больше в вопросе «таблица непредвиденных обстоятельств», который я задал вскоре после этого. Имитация некоторой волатильности рынка 🙂

Ответ №1:

Рассмотрим это:

 dist = RandomVariate[NormalDistribution[], {100000}];

dist2 = Rest@FoldList[0.95 #   #2 amp;, 0, dist];

Subscript[d, x_] := dist2[[x]]
  

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

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

1. Спасибо! Нижний индекс указан только потому, что я работаю со своим двоюродным братом и писал так, как он говорил. Как бы вы поступили?

2. @500 Я не говорю, что это обязательно неправильно, просто мне это не нравится. Я бы использовал что-то вроде d[x_] или func[d, x_] вместо того, чтобы присоединять определение к Subscript .

3. @Mr. Wizard, понял! Я никогда раньше не сталкивался с этим, я приму ваш формат!

4. 1 за использование генерации всех 100000 значений за один вызов вместо использования a (Parallel)Table .

5. @Бретт, спасибо. Почему вы изменили его на RandomVariate ? Этого нет в версии 7. В версии 8 это быстрее, чем RandomReal ?

Ответ №2:

Как насчет использования чего-то вроде

 In[1]:= dist = ParallelTable[RandomVariate[NormalDistribution[]], {100000}];//Timing

Out[1]= {0.15601, Null}

In[2]:= folded = FoldList[.95 #1   #2 amp;, First@dist, Rest@dist]; // Timing

Out[2]= {0.056003, Null}
  

которую вы можете сравнить с

 In[3]:= Subscript[d, 1] = dist[[1]];
        Do[Subscript[d, n] = 0.95 Subscript[d, n - 1]   dist[[n]], 
           {n, 2, Length@dist}] // Timing

Out[3]= {1.09607, Null}

In[4]:= Table[Subscript[d, n], {n, 1, Length@dist}] === folded

Out[4]= True
  

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

1. (воспроизведение тега комментария) — Мне было жаль, потому что я сначала написал «чем это отличается от моего ответа?», А затем понял, что вы это признали.

2. @Mr.Wizard: о, мне было интересно. Да, я получил уведомление о том, что вы опубликовали ответ, как раз в тот момент, когда я убирал нумерацию входов / выходов, поэтому я все равно решил опубликовать. В конце концов, Do цикл, который я даю, реализует что-то вроде того, что изначально имел в виду OP. (Если бы не раннее воскресное утро, я мог бы быть быстрее и победить тебя!)