首页 > 解决方案 > 如何在数学中定义一个使用复杂递归关系的函数?

问题描述

我正在尝试编写一个小脚本来计算整数序列。我试图用代码编写的函数是黑板中的一个,a(n)。问题是我期待我在脚本中定义的函数 h(n) 给出一个数字作为结果,但它给出了其他东西:对于 h(2) 它给出了ArgMax[{p, HarmonicNumber[p] <= 1}, p, Integers]我该如何纠正?(您必须了解我绝不是程序员,对mathematica也不太了解。在此先感谢。我写的脚本是这个:

    h[n_] := (ArgMax[{p, 
      Sum[1/s, {s, 1 + Sum[h[k], {k, 1, (n - 1)}], p}] <= 1}, p, 
     Integers]) - Sum[h[k], {k, 1, (n - 1)}]; h[1] = 1;

手写定义的图像 a(n)=(最大 p 使得从 s 等于 r 到 p 的和小于或等于 1)-r+1,其中 r=1+a( k),并且 a(1)=1

PD:那些看起来像 v 的字母是 r。对不起。

标签: mathwolfram-mathematicadiscrete-mathematicsmathematica-8

解决方案


您收到此答案的主要原因是 Mathematica 中的 Sum 命令进行复杂的符号计算以将术语和表达式重写为经典数学函数,试图对所有内容做出尽可能少的假设。

当然,如果你对整数的倒数求和,它会试图回到谐波数。

它通常很有用,但可能有交叉用途。

为避免这种情况,只需更换

Sum[ , {var, start, end}]

经过

Total[Table[ , {var, start, end}]]

它应该给你你想要的东西,而不需要额外的时间来对 summand 进行符号解释。

无论如何,您的代码中存在重大问题。

  • 你应该对 h 使用 memoization

  • 您想找到最大值 p 使得从 r 开始的逆数之和小于或等于 1。您的代码不会这样做。您不能简单地将不等式放入范围参数中。您必须通过控制或使用反函数来循环您的总和。


推荐阅读