Я пытаюсь вычислить главное значение интеграла (по s) от 1/((s - q02)*(s - q2)) на [Ecut, inf] с q02 ‹ Ecut ‹ q2. Делая основное значение вручную (или Mathematica), можно получить общий результат
ln((q2-Ecut)/(Ecut-q02)) / (q02-q2)
В конкретном примере ниже это дает результат -1,58637*10^-11. Также можно получить тот же результат, разделив интеграл на два, проинтегрировав до q2 - eps, а затем начав с q2 + eps, а затем сложив два результата (расхождения должны сокращаться). Принимая eps все меньше и меньше, можно восстановить результат выше. Когда я реализую это в scipi с помощью quad, мой результат сходится к неправильному результату 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()