首页 > 解决方案 > 为什么有限和计算得这么长?

问题描述

我正在尝试计算下一个总和: 在此处输入图像描述

它是立即计算的。所以我将点数提高到 24^3,它仍然可以快速运行: 在此处输入图像描述

但是当点数为 25^3 时,几乎不可能等待结果!此外,还有一个警告: 在此处输入图像描述

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

标签: wolfram-mathematica

解决方案


尝试

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}]]]

很快返回

{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}]]]

很快返回

{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}]]]

很快返回

{1.36679,16932.5}

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

比较那些结果和时间,如果你替换SumNSum,如果你替换/500*.002

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

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

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


推荐阅读