wolfram-mathematica - 为什么有限和计算得这么长?
问题描述
它是立即计算的。所以我将点数提高到 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}]]]
很快返回
{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
. 它可能使用符号算法来查找这些结果,而不是需要将每个单独的值相加。
比较那些结果和时间,如果你替换Sum
为NSum
,如果你替换/500
为*.002
为了尝试猜测为什么您看到的时间会随着边界的增加而突然改变,其他人过去已经注意到,在一些数值算法中似乎存在一些硬编码边界,并且当范围足够小时,Mathematica 将使用一个算法,但是当范围刚好足以超过该界限时,它将切换到另一个可能更慢的算法。如果无法检查算法内部做出的决定,并且 Wolfram 之外的任何人都无法看到这些信息,就很难或不可能确切地知道为什么会看到这种变化。
要获得更精确的数值,您可以完全更改N[...]
或N[...,64]
消除N[...,256]
它,N
并获得一个大而复杂的精确数值结果。
对此要小心,仔细检查结果以确保我没有犯任何错误。其中一些只是我的猜测。