У меня есть проблема линейного повторения, когда следующий элемент опирается не только на предыдущее значение, например последовательность Фибоначчи. Один метод вычисления элемента n th состоит в том, чтобы определить его с помощью вызова функции, например,
Fibonacci[0] = 0; Fibonacci[1] = 1;
Fibonacci[n_Integer?Positive] := Fibonacci[n] + Fibonacci[n - 1]
и для последовательности, с которой я работаю, это именно то, что я делаю. (Определение находится внутри Module
, поэтому я не загрязняю Global`
.) Однако я собираюсь использовать это с 2 10 - 2 13 точек, поэтому я обеспокоен дополнительными издержками, когда мне просто нужен последний термин и ни один из предыдущих элементов. Я хотел бы использовать Fold
, чтобы сделать это, но Fold
только передает непосредственно предшествующий результат, что означает, что он непосредственно не полезен для общей задачи линейного повторения.
Я бы хотел, чтобы пара функций заменила Fold
и FoldList
, которые передают определенное количество элементов предыдущей последовательности в функцию, т.е.
In[1] := MultiFoldList[f, {1,2}, {3,4,5}] (* for lack of a better name *)
Out[1]:= {1, 2, f[3,2,1], f[4,f[3,2,1],2], f[5,f[4,f[3,2,1],2],f[3,2,1]]}
У меня было кое-что, что сделало это, но я закрыл тетрадь перед сохранением. Так что, если я переписываю это самостоятельно, я опубликую это.
Редактировать : почему я не использую RSolve
или MatrixPower
для решения этой проблемы. Моя конкретная проблема в том, что я выполняю n-точечную аппроксимацию Паде , чтобы аналитически продолжить функцию, которую я знаю только в заданном количестве точек на воображаемой оси, {z i }. Часть создания аппроксиманта состоит в том, чтобы сгенерировать набор коэффициентов, i , который является другим рекуррентным отношением, которые затем подаются в окончательное отношение
A[n+1]== A[n] + (z - z[[n]]) a[[n+1]] A[n-1]
, который не поддается ни RSolve
, ни MatrixPower
, по крайней мере, я могу видеть.