mathematica:数值积分中的评价顺序

时间:2016-05-25 12:19:54

标签: math wolfram-mathematica numerical-integration

我有一个关于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"结果完全错了。

2 个答案:

答案 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

enter image description here

这是全球适应性。

enter image description here

MonteCarlo只是在任何地方进行采样而不考虑被积函数值。

您最好的选择可能是使用全局自适应并设置 Graphics@Point[out[[2, 1]][[All, {1, 2}]]] 。满足自己虚构的部分可以忽略不计,并取得结果的真实部分。 当然,分析性地解决您的集成限制并将MinRecursion全部消除在一起会好得多。