为什么有限和计算这么长?

Why is a finite sum calculated so long?

我正在尝试计算下一个总和:

即时计算。所以我将点数提高到 24^3,它仍然运行得很快:

但是当点数达到25^3时,几乎不可能等待结果!此外,还有一个警告:

为什么计算有限和这么耗时?我怎样才能得到准确的答案?

尝试

max=24;
Timing[N[
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,2,max},{j,1,max},{k,1,max}]+
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,1,1},{j,2,max},{k,1,max}]+
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,1,1},{j,1,1},{k,2,max}]]]

哪个快returns

{0.143978,14330.9}

max=25;
Timing[N[
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,2,max},{j,1,max},{k,1,max}]+
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,1,1},{j,2,max},{k,1,max}]+
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,1,1},{j,1,1},{k,2,max}]]]

哪个快returns

{0.156976,14636.6}

甚至

max=50;
Timing[N[
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,2,max},{j,1,max},{k,1,max}]+
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,1,1},{j,2,max},{k,1,max}]+
  Sum[1/(E^((i^2+j^2+k^2-3)/500)-1),{i,1,1},{j,1,1},{k,2,max}]]]

哪个快returns

{1.36679,16932.5}

以这种方式更改代码可以避免进行成百上千次 If 几乎总是会导致 True 的测试。它可能会使用符号算法来查找这些结果,而不是需要将每个单独的值相加。

如果将 Sum 替换为 NSum 并将 /500 替换为 *.002

,请比较这些结果和时间

为了猜测为什么您看到的时间随着边界的增加而突然改变,其他人在过去已经注意到,在某些数值算法中似乎有一些硬编码的边界,并且当范围很小时足够的 Mathematica 将使用一种算法,但是当范围大到足以超过该界限时,它将切换到另一种可能更慢的算法。如果无法检查算法内部所做的决定,很难或不可能确切地知道为什么会看到这种变化,而且 Wolfram 之外的任何人都无法看到该信息。

要获得更精确的数值,您可以将 N[...] 更改为 N[...,64]N[...,256] 或完全消除 N 并获得复杂的大精确数值结果。

小心这个,仔细检查结果,确保我没有犯任何错误。其中一些只是我的猜测。