使用SciPy的四边形通过积分到恰好位于奇点上方的正下方来获得积分的主值

时间:2017-04-10 18:27:19

标签: scipy numerical-integration quad

我试图在[Ecut,inf]上用q02<来计算1 /((s-q02)*(s-q2))的积分(超过s)的主值。 Ecut< Q2。手动(或Mathematica)执行原理值可获得一般结果

ln((q2-Ecut)/(Ecut-q02))/(q02 -q2)

在下面的具体示例中,结果为-1.58637 * 10 ^ -11。通过将积分分成两部分,积分到q2-eps然后从q2 + eps开始,然后加上两个结果(分歧应该取消),也应该能够得到相同的结果。通过使eps越来越小,应该恢复上面的结果。当我使用quad在scipi中实现这个时,我的结果会收敛到错误的结果6.04685e-11,正如我在eps与积分结果的图表中所示,包括。
为什么四边形这样做?即使我有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()

eps vs integral result

1 个答案:

答案 0 :(得分:1)

  

一个人也应该能够通过将积分分成两部分,积分到q2 - eps然后从q2 + eps开始,然后添加两个结果来获得相同的结果

只有计算完全准确。在数值实践中,你所描述的基本上是人们可以做的最糟糕的事情。你会得到两个相反符号的大积分,它们在加入时几乎相互抵消;剩下的东西更多地与积分的误差有关,而不是与积分的实际值有关。

我注意到您在脚本中忽略了错误值err,甚至没有打印出来。 不好主意:它们的大小为1e-10,这已经告诉你“e-11”的最终结果是垃圾。

计算科学问题Numerical Principal Value Integration - Hilbert like解决了这个问题。他们指出的方法之一是在尝试整合它之前,在关于奇点对称的点处添加被积函数的值。这需要在以奇点q2为中心的对称区间上取积分(即从Ecut到2 * q2-Ecut),然后将积分的贡献从2 * q2-Ecut加到无穷。无论如何,这种分裂是有道理的,因为quad以非常不同的方式处理无限限制(使用傅立叶积分),这是影响奇点消除方式的另一个因素。

因此,这种方法的实现将是

ans1, err = quad(lambda s: integrand(s) + integrand(2*q2-s), Ecut, q2)
ans2, err = quad(integrand, 2*q2-Ecut, np.inf)

不需要eps。但是,结果仍然是关闭的:它约为-2.5e-11。事实证明,第二个积分是罪魁祸首。不幸的是,傅立叶积分方法在这里似乎没有效果(或者我没有找到使其工作的方法)。事实证明,提供大但有限的值作为上限导致更好的结果,尤其是如果还使用选项epsabs,例如, epsabs=1e-20

更好的是,仔细阅读documentation of quad额外注意事项并注意它直接支持Cauchy权重1 /(s-q2)的积分,为它们选择合适的数值方法。这仍然需要有限的上限和epsabs的小值,但结果非常准确:

quad(lambda s: 1/(s - q02), Ecut, 1e9*q2, weight='cauchy', wvar=q2, epsabs=1e-20)

返回-1.5863735715967363e-11,与精确值-1.5863735704856253e-11进行比较。请注意,因子1 /(s-q2)不会出现在上面的被积函数中,而是被降级为权重选项。