2016-05-25 19 views
0

Hallo ich habe ein Problem in Bezug auf eine numerische Integration in Mathematica. Hier ist meine TestfunktionMathematica: Bewertungsreihenfolge bei der numerischen Integration

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}] 

Die Integration liefert komplexe Werte, obwohl aufgrund der Booleschen Funktion im Integra das Argument in der sqrt immer positiv sein sollte und daher nur in realen Werten führen. Ist es möglich, zuerst die boole Funktion zu evaluieren und nur dann, wenn es wahr ist, dann numerisch zu integrieren?

Wenn ich die gleiche Integral berechnen unter Verwendung einer Monte-Carlo-Integrationsstrategie

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}] 

wie kann ich herausfinden, ob es eine Menge Nullen durch die Boolesche Funktion fasst? Ich denke, die Auswertung kann eine Menge Rechenzeit einsparen, wenn sie zuerst die Boolesche Funktion für jeden Abtastpunkt des Monte-Carlo-Gitters auswertet. Wenn ich "MonteCarlo" durch "AdaptiveMonteCarlo" ersetze, geht das Ergebnis völlig falsch.

Antwort

0

Was passiert, wenn Sie zu einem echten Wächter konvertieren? (Die Boole Form kann zu klug sein, um die Hälfte (Mathematica möglicherweise nicht falsch behandeln -> 0 als echte Wache).)

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}] 
0

hier ist, wie EvaluationMonitor zu verwenden, um zu lernen, was die Probenahmeverfahren tun:

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}]]]] 

Hinweis LocalAdaptive ist sehr langsam, aber es ist wahrscheinlich das genaueste rein numerische Ergebnis:

 [email protected][out[[2, 1]][[All, {1, 2}]]] 

enter image description here

ist hier global adaptiv.

enter image description here

Monte Carlo nur Proben überall ohne Rücksicht auf den Integra Wert.

Ihre beste Wette ist wahrscheinlich, global adaptive zu verwenden und MinRecursion festzulegen. Befriedigen Sie sich selbst die imaginären Teile sind vernachlässigbar und nehmen den wahren Teil des Ergebnisses. Natürlich wäre es viel besser analytisch für Ihre Integrationsgrenzen zu lösen und die Boole alle zusammen zu beseitigen.