Ответ 1
Вы можете использовать sympy для непосредственного вычисления интеграла. Его действительная часть с eta- > 0 является главным значением:
from sympy import *
x, y, eta = symbols('x y eta', real=True)
re(integrate(1/(x - y + I*eta), (x, -1, 1))).simplify().subs({eta: 0})
# -> log(Abs(-y + 1)/Abs(y + 1))
Символьный инструментарий Matlab int
дает вам тот же результат, конечно (я не знаю других соответствующих инструментов в Matlab для этого --- укажите, знаете ли вы конкретный).
Вы спросили о численном вычислении главного значения. Ответ заключается в том, что если у вас есть только функция f(y)
, аналитическая форма или поведение которой вы не знаете, ее вообще невозможно вычислить численно. Вам нужно знать такие вещи, как, например, полюсы подынтегрального выражения и какой порядок они имеют.
Если вы, с другой стороны, знаете, что ваш интеграл имеет форму f(y) / (y - y_0)
, scipy.integrate.quad
может вычислить основное значение для вас, например:
import numpy as np
from scipy import integrate, special
# P \int_{-1}^1 dx 1/(x - wvar) * (1 + sin(x))
print(integrate.quad(lambda x: 1 + np.sin(x), -1, 1, weight='cauchy', wvar=0))
# -> (1.8921661407343657, 2.426947531830592e-13)
# Check against known result
print(2*special.sici(1)[0])
# -> 1.89216614073
Подробнее см. здесь.