使用Fold计算依赖于多个先前值的线性递归结果

rco*_*yer 3 wolfram-mathematica

我有一个线性递归问题,其中下一个元素不仅仅依赖于先前的值,例如Fibonacci序列.计算第n 元素的一种方法是通过函数调用来定义它,例如

Fibonacci[0] = 0; Fibonacci[1] = 1;
Fibonacci[n_Integer?Positive] := Fibonacci[n] + Fibonacci[n - 1]
Run Code Online (Sandbox Code Playgroud)

而对于我正在使用的序列,这正是我所做的.(定义是在一个内部,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]]}
Run Code Online (Sandbox Code Playgroud)

我有一些东西可以做到这一点,但我在保存之前关闭了笔记本.所以,如果我自己重写它,我会发布它.

编辑:至于我为什么不使用RSolveMatrixPower解决这个问题.我的具体问题是我正在执行n点Pade近似,以分析方式继续我只知道虚轴上的一定数量的点{z i } 的函数.创建近似值的一部分是生成一组系数,a i,这是另一个递归关系,然后被输入到最终关系中

A[n+1]== A[n] + (z - z[[n]]) a[[n+1]] A[n-1]
Run Code Online (Sandbox Code Playgroud)

这是不服从任何RSolve也不MatrixPower,至少,我可以看到.

And*_*lan 5

可以RecurrenceTable为您执行这项任务?

根据前两个值,在重复中找到第1000个术语:

In[1]:= RecurrenceTable[{a[n] == a[n - 1] + a[n - 2], 
  a[1] == a[2] == 1}, a, 
   {n, {1000}}]

Out[1]= {4346655768693745643568852767504062580256466051737178040248172\
9089536555417949051890403879840079255169295922593080322634775209689623\
2398733224711616429964409065331879382989696499285160037044761377951668\
49228875}
Run Code Online (Sandbox Code Playgroud)

编辑:如果您的重复定义是由f[m, n]不喜欢评估非数字m和n 的函数定义的,那么您可以使用条件:

In[2]:= f[m_, n_] /; IntegerQ[m] && IntegerQ[n] := m + n
Run Code Online (Sandbox Code Playgroud)

重复表的用法f:

In[3]:= RecurrenceTable[{a[n] == f[a[n - 1], a[n - 2]], 
  a[1] == a[2] == 1}, a, {n, {1000}}]

Out[3]= {4346655768693745643568852767504062580256466051737178040248172\
9089536555417949051890403879840079255169295922593080322634775209689623\
2398733224711616429964409065331879382989696499285160037044761377951668\
49228875}
Run Code Online (Sandbox Code Playgroud)

  • (+1)只是一个小注释,检查`Head`s比模式匹配更快,所以`f [m_Integer,n_Integer]`比`f [m_,n_] /更快; IntegerQ [m] && IntegerQ [n]`. (2认同)