참고 : Mathematica가 제공하는 정수 값이 가짜라는 점에서 다소 걱정입니다. 나는 그것이 짧은 시간에 현명하게 보이는 결과를 줬기 때문에 효과가 있다고 생각했지만, 사용하려고 시도하는 방법이 버그가 있거나 내가 잘못한 경우 일 수 있습니다. 따라서 아래 코드가 전혀 작동하지 않을 수 있습니다. 죄송합니다.
참고 2 : 그것은 나를 귀찮게 했으므로 Julia와 GSL을 사용하여 다른 버전 ( 여기 코드 품질에 대해 죄송합니다)을 작성 g
했으며 Mathematica가 아래에 제공하는 것과 동일한 대답으로 2 초 안에 평가 됩니다. 코드가 괜찮을 것 같습니다.
ff¯
수치 적분에 대한 과거의 경험을 통해 더 환상적인 수학적 방법이 때로는 도움이 될 수 있다고 생각하지만 수치 적 푸리에 변환을 평가하고 합리적 및 대수 함수를 통합하는 것이 수치 적분 알고리즘의 빵과 버터라고 할 수 있습니다. 알고리즘을 신중하게 선택하고 매개 변수를 사용하여 쉽게 진행할 수 있습니다. 수학적 기술이 올바르게 작동하는 방법을보기가 어려운 경우 일반적으로 더 쉬운 옵션입니다.
ClearAll[ξ, α, p1, p2, fi, f, g];
ξ = 1;
α = 1/2;
fi[e_, k4_, kp_] := Module[{
p1 = (k4^2 + e/2)^2 + kp^2 + α^2,
p2 = (k4^2 - e/2)^2 + kp^2 + (1 - α)^2},
2 * (* because integrate k4 over (0,∞) *)
2 kp * (* because d(kp^2) *)
(α (1 + p1)^(3 ξ/2) (1 + p2)^(ξ/2)) /
((1 + p1 (1 + p1)^(2 ξ)) (1 + p2 (1 + p2)^(2 ξ)))
]
f[e_?NumericQ] := NIntegrate[
fi[e, k4, kp], {k4, 0, ∞}, {kp, 0, ∞},
Method -> {Automatic, "SymbolicProcessing" -> 0}];
(* !!! This gives a bogus result: *)
gBogus[t_?NumericQ, e0_?NumericQ] :=
NIntegrate[
Exp[I t e]/(e^2 + e0^2) f[e], {e, -∞, ∞},
Method -> {"DoubleExponentialOscillatory",
"SymbolicProcessing" -> 0}]
(* This gives *a* result, different from above despite being equivalent *)
g[t_?NumericQ, e0_?NumericQ] :=
NIntegrate[Exp[I t e]/(e^2 + e0^2) f[e], {e, -\[Infinity], 0},
Method -> {"DoubleExponentialOscillatory",
"SymbolicProcessing" -> 0},
EvaluationMonitor :> Print["e=", e]] +
NIntegrate[Exp[I t e]/(e^2 + e0^2) f[e], {e, 0, \[Infinity]},
Method -> {"DoubleExponentialOscillatory",
"SymbolicProcessing" -> 0},
EvaluationMonitor :> Print["e=", e]]
결과:
In[18]:= Timing@g[10,1]
Out[18]= {78.0828, 0.0000704303 + 9.78009*10^-6 I}
In[338]:= Timing@g[1,1]
Out[338]= {14.3125,0.389542 +0.024758 I}
Mathematica는 integrands를 상징적으로 사전 처리하는 데 전혀 시간을 들이지 않았습니다.이 경우 어쨌든 유용한 정보를 찾을 수 없었기 때문입니다. 또한 두 번째 적분에 진동 구적법을 사용하도록 지시했습니다.
왜 통합 전략 ( NIntegrateIntegrationStrategies 참조 )이 무작위로 작동하는지 에 대한 나의 추측 은 때로는 Mathematica가 실수로 자동으로 나쁜 전략을 선택하여 성능을 저하시킬 수 있다는 것입니다. https://mathematica.stackexchange.com 에서 도움을받는 것도 고려할 수 있습니다 . Mathematica의 내부에 대해 더 많이 알고있을 것입니다.