gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:18:57 25 4
gpt4 key购买 nike

在回答 a physics forum question今天早上,我遇到了DifferenceRoot的表现非常糟糕的情况。和 RecurrenceTable与通过天真地取指数生成函数的导数来计算表达式相比。极少量的挖掘表明DifferenceRootRecurrenceTable不要简化表达式。

例如,查看 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}

这很快就失控了,因为第 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}

这可以与 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

所以我的问题是:
是否有任何选择/技巧可以获得 DifferenceRootRecurrenceTable应用(简化)函数,从而使它们对非数字工作有用?

编辑:一个 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]]

enter image description here
sol@Range[6] // Simplify

enter image description here

关于wolfram-mathematica - 如何使 DifferenceRoot 和 RecurrenceTable 对非数值差分方程有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7055880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com