嗨,我有一个关于数学中的数值积分的问题。下面是我的测试函数
Table[NIntegrate[
Boole[Sqrt[1 - cosk^2]*Sqrt[1 - cosk2^2] > Abs[a - cosk*cosk2]]/
Sqrt[(1 - cosk^2)*(1 - cosk2^2) - (a - cosk*cosk2)^2],
{cosk, -1,1}, {cosk2, -1, 1}, Method -> "GlobalAdaptive"], {a, -.9, .9, .1}]虽然由于被积函数中的布尔函数,sqrt中的参数应该始终为正,因此只产生实值,但是积分会产生复数值。有没有可能首先计算布尔函数,并且只有当它为真时,才开始数值积分?
如果我使用蒙特卡洛积分策略计算相同的积分
Table[NIntegrate[
Boole[Sqrt[1 - cosk^2]*Sqrt[1 - cosk2^2] > Abs[a - cosk*cosk2]]/
Sqrt[(1 - cosk^2)*(1 - cosk2^2) - (a - cosk*cosk2)^2], {cosk, -1,
1}, {cosk2, -1, 1}, Method -> {"MonteCarlo", "MaxPoints" -> 10^8,
"SymbolicProcessing" -> None}], {a, -.9, .9, .1}]由于布尔函数,我如何才能确定它是否包含了大量的零?我认为,如果首先评估蒙特卡洛网格的每个采样点的布尔函数,那么评估可以节省大量的计算时间。如果我用"AdaptiveMonteCarlo“替换"MonteCarlo”,结果就完全错了。
发布于 2016-05-25 21:06:16
如果你变成一个真正的守卫会发生什么?( Boole表单可能过于聪明(Mathematica可能不会将false --> 0视为真正的守卫)。)
Table[NIntegrate[
If[Sqrt[1 - cosk^2]*Sqrt[1 - cosk2^2] > Abs[a - cosk*cosk2],
1/Sqrt[(1 - cosk^2)*(1 - cosk2^2) - (a - cosk*cosk2)^2], 0],
{cosk, -1,1}, {cosk2, -1, 1}], {a, -.9, .9, .1}]发布于 2016-05-25 22:42:17
下面是如何使用EvaluationMonitor了解采样方法的作用:
out = Reap[With[{a = -.9},
NIntegrate[
v = Boole[
Sqrt[1 - cosk^2]*Sqrt[1 - cosk2^2] > Abs[a - cosk*cosk2]]/
Sqrt[(1 - cosk^2)*(1 - cosk2^2) - (a -
cosk*cosk2)^2], {cosk, -1, 1}, {cosk2, -1, 1},
Method -> "LocalAdaptive",
EvaluationMonitor :> Sow[{cosk, cosk2, v}]]]]注意:LocalAdaptive非常慢,但可能是最准确的纯数值结果:
Graphics@Point[out[[2, 1]][[All, {1, 2}]]]

这是全局自适应。

MonteCarlo只是在任何地方进行采样,而不考虑被积分值。
最好的方法可能是使用全局自适应并设置MinRecursion。满足自己,虚构的部分可以忽略不计,并接受结果的真实部分。当然,以解析的方式解决您的集成限制并完全消除Boole会好得多。
https://stackoverflow.com/questions/37436938
复制相似问题