Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 如何使DifferenceRoot和RecurrenceTable对非数值差分方程有用?_Wolfram Mathematica_Recurrence - Fatal编程技术网

Wolfram mathematica 如何使DifferenceRoot和RecurrenceTable对非数值差分方程有用?

Wolfram mathematica 如何使DifferenceRoot和RecurrenceTable对非数值差分方程有用?,wolfram-mathematica,recurrence,Wolfram Mathematica,Recurrence,在今天早上的回答中,我遇到了DifferenceRoot和RecurrenceTable的非常糟糕的性能,而不是通过天真地获取指数生成函数的导数来计算表达式。非常少量的挖掘表明,DifferenceRoot和RecurrenceTable并不能简化表达式 例如,查看RecurrenceTable的以下输出,以及它是如何通过展开结果来简化的: In[1]:= RecurrenceTable[f[n] == a f[n - 1] + (a - 1) f[n - 2] &&

在今天早上的回答中,我遇到了
DifferenceRoot
RecurrenceTable
的非常糟糕的性能,而不是通过天真地获取指数生成函数的导数来计算表达式。非常少量的挖掘表明,
DifferenceRoot
RecurrenceTable
并不能简化表达式

例如,查看
RecurrenceTable
的以下输出,以及它是如何通过
展开结果来简化的:

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}
这很快就会失控,正如第20次迭代的叶数(使用
DifferenceRoot
计算)所示:

这可以与实现进行比较

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
所以我的问题是: 是否有任何选项/技巧可以让
DifferenceRoot
RecurrenceTable
在执行时应用(简化)函数,从而使其对非数值工作有用


Edit:一个Sjoerd在下面指出,我愚蠢地选择了一个带有
RSolve
able封闭形式解决方案的示例。在这个问题中,我主要关注
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]]


Hi@Sjoerd,我选择差分方程只是为了显示
DifferenceRoot
RecurrenceTable
的问题,而不是因为我需要解决方案。例如,请参见中的多变量多项式,其中包括作为特殊情况的-这些多项式没有闭合形式。(也就是说,我可能应该选择一个没有闭合形式的非常数系数示例…)
sol = f /. RSolve[f[n] == a f[n - 1] + (a - 1) f[n - 2] && 
                  f[0] == 0 && f[1] == 1, f, n
           ][[1, 1]]
sol@Range[6] // Simplify