我有一个关于mathematica中数值积分的问题。这是我的测试功能
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中的参数应始终为正,因此只会产生实数值。是否有可能首先评估boole函数,只有当它是真的然后才开始数值积分?
如果我使用蒙特卡罗积分策略计算相同的积分
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}]
如何通过布尔函数找出它是否总结了很多零?我认为如果首先评估monte carlo网格的每个采样点的布尔函数,评估可以节省大量的计算时间。如果我更换" MonteCarlo" by" AdaptiveMonteCarlo"结果完全错了。
答案 0 :(得分:0)
如果你转换为真正的后卫会怎样? (int
形式可能太聪明了一半(Mathematica可能不会对待假 - >> 0作为真正的守卫)。)
transform(cbegin(s), cend(s), begin(s), [](const unsigned char i){ return tolower(i); })
答案 1 :(得分:0)
以下是如何使用params
来了解抽样方法的作用:
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
这是全球适应性。
MonteCarlo只是在任何地方进行采样而不考虑被积函数值。
您最好的选择可能是使用全局自适应并设置 Graphics@Point[out[[2, 1]][[All, {1, 2}]]]
。满足自己虚构的部分可以忽略不计,并取得结果的真实部分。
当然,分析性地解决您的集成限制并将MinRecursion
全部消除在一起会好得多。