我正在尝试计算 [Ecut, inf] 上 1/((s - q02)*(s - q2)) 的积分(超过 s)的主值,其中 q02 < Ecut < q2。用手(或 Mathematica)做 Principle 值,得到一般结果
ln((q2-Ecut)/(Ecut-q02)) / (q02 -q2)
在下面的具体示例中,结果为 -1.58637*10^-11。通过将积分一分为二,积分到 q2 - eps 然后从 q2 + eps 开始,然后将两个结果相加(应该消除分歧),也应该能够得到相同的结果。通过使 eps 越来越小,应该可以恢复上述结果。当我使用 quad 在 scipi 中实现这一点时,我的结果会收敛到错误的结果 6.04685e-11,正如我在 eps 与我所包含的积分结果的图中所示。
为什么quad会这样做?即使我有 eps = 0 它给了我这个错误的结果,当我希望它在事情爆炸时给我一个错误......
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad
q02 = 485124412.
Ecut = 17909665929.
q2 = 90000000000.
def integrand(s):
return 1/((s - q02)*(s - q2))
xx=[1.,0.1,0.01,0.001,0.0001,0.00001,0.000001,0.0000001,0.00000001,
0.000000001,0.0000000001,0.00000000001,0.]
integral = [0*y for y in xx]
i=0
for eps in xx:
ans1,err = quad(integrand, Ecut, q2 -eps )
ans2,err= quad(integrand, q2 + eps, np.inf)
integral[i] = ans1 + ans2
i=i+1
plt.semilogx(xx,integral,marker='.')
plt.show()