注意:在这一点上,我有点担心Mathematica给我的积分值是虚假的。我认为它之所以有用,是因为它在很短的时间内给出了看起来不错的结果,但可能是因为它尝试使用的方法有错误或我做错了什么。因此,很可能下面的代码根本无法正常工作,我不知道。
注意2:这让我感到困扰,因此我使用Julia和GSL 编写了另一个版本(此处的代码,对代码质量感到抱歉),它g
在2秒钟内得出Mathematica在下面给出的相同答案。所以我认为代码可能还可以。
我对数值解析连续性感到怀疑的主要原因是,在我有限的测试中,您的积分实际上看起来不错。特别是,和被乘数都在多项式上迅速衰减,而这恰恰是传统正交例程设计得很好处理的事情。也没有棘手的奇异之处。ˉ ˚FFF¯
我过去在数值积分方面的经验使我相信,较奇妙的数学方法有时会非常有用,但是评估数值傅立叶变换以及对有理数和代数函数进行积分是数值积分算法的基础,因此通常通过仔细选择算法并使用其参数来轻松取得进展。如果很难看清如何使数学技术正确运行,这通常是更简单的选择。
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在符号预处理上花费了零时间,因为在这种情况下,它无论如何都无法找出有用的东西。我还告诉它为第二个积分专门使用振荡正交方法。
我为什么用随机整合策略(见摆弄猜测NIntegrateIntegrationStrategies)的作品在所有的是,有时数学可能会意外地自动选择一个糟糕的战略,查杀性能,而任何我要求它做的是至少有一点,如果不理想,甚至有意义。您也可以考虑在/mathematica/上获得帮助,他们可能会在那里了解有关Mathematica内部的更多信息。