Sim*_*mon 6 recurrence wolfram-mathematica
在今天早上回答一个物理论坛问题时,我遇到了非常糟糕的表现,DifferenceRoot并且RecurrenceTable通过天真地采用指数生成函数的导数来计算表达式.极少量的挖掘表明DifferenceRoot并且RecurrenceTable 不会简化表达式.
例如,查看以下输出RecurrenceTable以及如何通过Expand结果简化它:
In[1]:= RecurrenceTable[f[n] == a f[n - 1] + (a - 1) f[n - 2] &&
f[0] == 0 && f[1] == 1,
f, {n, 6}]
% // Expand
Out[1]= {0, 1, a, -1+a+a^2, -a+a^2+a (-1+a+a^2), 1-a-a^2+a (-1+a+a^2)+a (-a+a^2+a (-1+a+a^2))}
Out[2]= {0, 1, a, -1+a+a^2, -2 a+2 a^2+a^3, 1-2 a-2 a^2+3 a^3+a^4}
Run Code Online (Sandbox Code Playgroud)
这很快失控,因为第20次迭代的叶数(使用计算 DifferenceRoot)显示:
dr[k_] := DifferenceRoot[Function[{f, n},
{f[n] == a f[n - 1] + (a - 1) f[n - 2], f[0] == 0, f[1] == 1}]][k]
In[2]:= dr20 = dr[20]; // Timing
dr20Exp = Expand[dr20]; // Timing
Out[2]= {0.26, Null}
Out[3]= {2.39, Null}
In[4]:= {LeafCount[dr20], LeafCount[dr20Exp]}
Out[4]= {1188383, 92}
Run Code Online (Sandbox Code Playgroud)
哪个可以与memoized实现进行比较
In[1]:= mem[n_] := a mem[n-1] + (a-1) mem[n-2] // Expand
mem[0] = 0; mem[1] = 1;
In[3]:= mem20 = mem[20];//Timing
LeafCount[mem20]
Out[3]= {0.48, Null}
Out[4]= 92
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
是否有任何选项/技巧可以获得DifferenceRoot并RecurrenceTable应用(简化)函数,从而使它们对非数字工作有用?
编辑: Sjoerd在下面指出,我愚蠢地选择了一个有RSolve能力的封闭式解决方案的例子.在这个问题上,我主要关注的行为DifferenceRoot和RecurrenceTable.如果它有帮助,想象一下该f[n-2]术语乘以n,这样就没有简单的封闭形式解决方案.
我无法真正帮助您解决问题,因为到目前为止我还没有使用过这些功能,并且文档也没有提供任何线索。但为什么不直接用RSolve在这里呢?它为表中的每个元素提供了一个封闭形式的解决方案:
sol = f /. RSolve[f[n] == a f[n - 1] + (a - 1) f[n - 2] &&
f[0] == 0 && f[1] == 1, f, n
][[1, 1]]
Run Code Online (Sandbox Code Playgroud)

sol@Range[6] // Simplify
Run Code Online (Sandbox Code Playgroud)
