为什么有限和计算这么长?
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
并获得复杂的大精确数值结果。
小心这个,仔细检查结果,确保我没有犯任何错误。其中一些只是我的猜测。
我正在尝试计算下一个总和:
即时计算。所以我将点数提高到 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
并获得复杂的大精确数值结果。
小心这个,仔细检查结果,确保我没有犯任何错误。其中一些只是我的猜测。