这是mathematica的bug吗
mathematica吧
全部回复
仅看楼主
level 1
Assuming[R > 0,
Integrate[
z^2 Boole[
x^2 + y^2 + z^2 <= R &&
x^2 + y^2 + z^2 <=
2 R z], {x, -\[Infinity], \[Infinity]}, {y, -\[Infinity], \
\[Infinity]}, {z, -\[Infinity], \[Infinity]}]] 想问一下为什么计算这个式子系统会显示系统出错,为什么会这样
2018年01月06日 12点01分 1
吧务
level 15
版本9未报错,半天算不出来倒是真的……换到球坐标系倒是很快就出来了:
Assuming[R > 0,
Integrate[z^2 Boole[r^2 <= 2 R z] r^2 Sin[\[Theta]] /. z -> r Cos[\[Theta]], {r, 0,
R}, {\[Theta], 0, Pi}, {phi, 0, 2 Pi}]] // AbsoluteTiming
(* {1.103783, (59 \[Pi] R^5)/480} *)
2018年01月06日 13点01分 2
我刚学mathematica,我想问一下,像这些软件的问题,会影响我们后续的学习,或者说,这会影响我们“相信”这些软件吗
2018年01月06日 13点01分
@树的里事故 楼中楼写不下,放在3楼了。
2018年01月06日 13点01分
@树的里事故 囧了,我刚看错了你的代码。{r,0,R}要改成{r,0,Sqrt[R]}
2018年01月06日 13点01分
吧务
level 15
1. 软件总会有Bug的,但总的来说,在软件中撞到Bug的概率比自己手算出错的概率要小。
2. 就我所见,对于Mathematica的性能,Mathematica的初学者以低估为主。
3. 在对结果有疑虑的时候可以用多种不同方法求解检验,这样即可将本就不高的出错概率压得更低,比如这里可以用数值积分辅助检查:
Table[NIntegrate[z^2 Boole[x^2 + y^2 + z^2 <= R &&
x^2 + y^2 + z^2 <=
2 R z], {x, -\[Infinity], \[Infinity]}, {y, -\[Infinity], \[Infinity]}, {z, -\
\[Infinity], \[Infinity]}], {R, 5}]
(* {0.386154, 2.30409, 6.4315, 13.2732, 23.2524} *)
对比之前结果的数值值,
In[13]:= {1.103783, (59 \[Pi] R^5)/480} // N
Out[13]= {1.10378, 0.386154 R^5}
我们基本可以确定这个结果是正确的。
2018年01月06日 13点01分 3
……但是,通过Table[(59 \[Pi] R^5)/480 // N, {R, 5}]对比便可发现两个答案对不上号,进一步的检查发现,我在2楼换系的时候写错了积分限(详见该楼的楼中楼)。改过来后就能对上了。(没想到我居然把犯错自检的过程现场演示了一遍……)
2018年01月06日 13点01分
嗯嗯,非常谢谢你, 另外,我在我帖子里发的那个式子的积分顺序从左到右是x y z ,但后来我发现把积分顺序改为 z y x就不会出现问题(你也可以去试试),想问问你这又是怎么一回事[疑问]
2018年01月06日 16点01分
@树的里事故 写在4楼了。
2018年02月03日 11点02分
吧务
level 15
有意思……其实以往也有人观察到过类似的现象。(Integrate的积分次序对计算速度造成了明显的影响。)但从来没有人仔细分析过类似的问题。这次借你这问题的机会稍微试着深入了下,结果发现,Integrate在以x, y, z序求解时之所以更快(注意……, {x, -\[Infinity], \[Infinity]}, {y, -\[Infinity], \[Infinity]}, {z, -\[Infinity], \[Infinity]}]其实先积的是z),是因为
Integrate的区域语法的内部实现,其实和我们手算的过程是一样的,只不过Integrate这个函数把这过程自动化了。后面的事就简单了:被积函数里面不含x和y,所以先把x和y积掉当然更快。至于我为什么知道Mathematica用的是这种算法嘛,是因为Wolfram在这个问题上手下留情了。这部分计算过程,是能用TraceInternal看到的:
Flatten[Trace[
Assuming[R > 0,
Integrate[z^2*Boole[x^2 + y^2 + z^2 <= R && x^2 + y^2 + z^2 <= 2*R*z], {z, -Infinity,
Infinity}, {y, -Infinity, Infinity}, {x, -Infinity, Infinity}]], Integrate[__], TraceInternal -> True]]
Flatten[Trace[
Integrate[z^2*Boole[x^2 + y^2 + z^2 <= 1 && x^2 + y^2 + z^2 <= 2*z], {x, -Infinity,
Infinity}, {y, -Infinity, Infinity},
{z, -Infinity, Infinity}], Integrate[__], TraceInternal -> True]]
2018年02月03日 11点02分 4
1