【问题标题】:How do I define a function in mathemathica that uses a complicated recurrence relation?如何在数学中定义一个使用复杂递归关系的函数?
【发布时间】:2020-02-14 02:51:45
【问题描述】:

我正在尝试编写一个小脚本来计算整数序列。我试图用代码编写的函数是黑板中的一个,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)=(maximum p such that the sum from s equals r to p is less or equal than one)-r+1, where r=1+the sum from k=1 to (n-1) of a(k), and a(1)=1

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

【问题讨论】:

  • 我认为有一个特定于 Mathematica 的 Stackexchange 论坛,因此您可能会在那里获得更多更好的答案。也就是说,您确实需要尝试陈述问题,以便其他人能够理解;指向凌乱图像的链接并不能帮助其他人理解。通过写出问题陈述来帮助他人帮助您。
  • 好的。我在脚本中看到了一个重大缺陷,所以我将重写这个问题。不过我还没有找到那个论坛。

标签: math wolfram-mathematica discrete-mathematics mathematica-8


【解决方案1】:
a[1] = 1;

a[n_] := Module[{sum = 0},
  r = 1 + Sum[a[k], {k, n - 1}];
  x = r;
  While[sum <= 1, sum += 1/x++];
  p = x - 2;
  p - r + 1]

Table[a[n], {n, 6}]

{1、2、6、16、43、117}

a[4] 的结果是 16 而不是 14。

为了说明,当n = 4

r = 1 + Sum[a[k], {k, 4 - 1}]

  = 1 + a[1] + a[2] + a[3]       (* refer to established results for a[n] *)

  = 1 +  1  +  2  +  6  =  10

sum = 0;
x = r;
While[sum <= 1, sum += 1/x++];
p = x - 2;
p - r + 1

16

或者其他形式

Total[Table[1/s, {s, 10, 25}]] <= 1   (* True *)

p - r + 1 = 25 - 10 + 1 = 16

使用 memoisation,正如 ogerard 所提到的

Clear[a]

a[1] = 1;

a[n_] := a[n] = Module[{sum = 0},
   r = 1 + Sum[a[k], {k, n - 1}];
   x = r;
   While[sum <= 1, sum += 1/x++];
   p = x - 2;
   p - r + 1]

仅将以下运行时间减少 9 秒

Timing[Table[a[n], {n, 14}]]

{40.8906, {1, 2, 6, 16, 43, 117, 318, 865, 2351, 6391, 17372, 47222, 128363, 348927}}

【讨论】:

    【解决方案2】:

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

    当然,如果你将整数的倒数相加,它会尝试返回调和数。

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

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

    Sum[ , {var, start, end}]

    通过

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

    它应该给你你想要的,而不需要额外的时间来符号解释和。

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

    • 你应该对 h 使用 memoization

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

    【讨论】:

    • 有趣的是Maximize[{Sum[1/s &lt;= 1, {s, 4, p}]}, Element[p, Integers]] 没有处理。我对如何使用反函数很感兴趣。可能不是这种特殊情况。
    猜你喜欢
    • 2020-09-27
    • 2014-12-14
    • 2021-02-04
    • 2019-09-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多