【问题标题】:Wolfram-Cloud/Mathematica, effective working with recursive functionsWolfram-Cloud/Mathematica,有效地使用递归函数
【发布时间】:2017-01-22 13:44:58
【问题描述】:

我目前正在使用Чебышёв-多项式,递归定义的多项式。对于您以前从未见过的很可能的情况:

f[0,x_]  := 1;
f[1,x_]  := x;
f[n_,x_] := 2 * x * f[n-1, x] - f[n-2, x];
Plot[{f[9, x],f[3, x]},{x, -1, 1}]

我发现自己在问,因为我通常使用 python,是否有办法在 wolfram-cloud 中构建函数数组,以简化流程。

因此我只需要计算每个f[n] 一次,这样可以大大提高运行时间,还可以扩展 n 的范围。

【问题讨论】:

  • 在 Mathematica 中解决这个问题的典型方法是记忆化。 reference.wolfram.com/language/tutorial/…
  • 有什么原因你没有使用内置函数 ChebyshevT 吗?我天真的期望是,使用它会大大改善运行时间,而您只需付出很少的努力。
  • @HighPerformanceMark 问的很公平,所以我想 a) 学习一些有关语法的知识 b) 实际上想自己玩弄多项式,所以我能更好地掌握它。跨度>
  • @Szabolcs 这是否也适用于函数或仅适用于特定值。还有一种方法可以预先运行它的某些部分,所以它不会超时。那么我可以在多个计算中分解它吗?
  • @Szabolcs 我必须伪造自己。它实际上没有。我尝试制作一个工作样本并尝试在没有任何输出或简化多项式的情况下计算运行时间。所以我抑制了多项式f[27,x] 的输出,并尝试计算一次,然后在不输出的情况下访问它。两次我都检查了之前的时间减去计算之后的时间。而且每次耗时3.1秒。要么暗示查找它需要很长时间并且它是预先计算的(在一本新书中),要么它实际上计算了两次。

标签: recursion wolfram-mathematica wolfram-language


【解决方案1】:

使用memoization

在这种情况下,记忆比平时更棘手,因为我们使用的是函数,而不是函数值。

Clear[cheb]
cheb[0] = 1 &;
cheb[1] = # &;
cheb[n_] := cheb[n] = Evaluate@Expand[2 # cheb[n - 1][#] - cheb[n - 2][#]] &

Evaluate 确保 Function 的内部在提供和参数之前得到评估。

【讨论】:

  • 请问您为什么使用&; 而不是;
  • 实际上# 是在哪里定义的。刚试了一下,它吐出了一些# 公式作为输出。
  • @PatrickAbraham 查找Function 并查看reference.wolfram.com/language/tutorial/PureFunctions.html 您可以在文档搜索框中输入#&,您将被带到相关页面。学习 Mathematica 时,请务必先检查文档(在谷歌搜索等之前)。它比大多数其他系统都要好。
  • 您编写的代码仍然无法正常工作,至少在云版本中是这样。而且我很难弄清楚如何让它发挥作用。
  • @PatrickAbraham 不过要注意缓存太多结果。在这种情况下,这不是问题,因为您可能不需要cheb[10000]。但是,如果有不止一个论点,记忆就会更加困难,而且可能会出错。您可以使用?cheb 检查正在缓存的内容,使用Clear[cheb] 清除所有定义。其他:考虑下次在mathematica.stackexchange.com 上提问。
猜你喜欢
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多