Python: найти принципиальное значение целого численного - программирование
Подтвердить что ты не робот

Python: найти принципиальное значение целого численного

Я решаю интеграл численно с помощью python:

enter image description here

где a (x) может принимать любое значение; положительный, отрицательный, внутри или вне [-1; 1], а эта - бесконечно малая положительная величина. Существует второй внешний интеграл, из которого изменяется значение a (x)

Я пытаюсь решить это, используя теорема Сохоцкого-Племеля: enter image description here

Однако это связано с определением принципиального значения, которое я не могу найти в python. Я знаю, что это реализовано в Matlab, но знает ли кто-либо из библиотеки или каким-либо другим способом определения главного значения в python (если существует принципиальное значение)?

4b9b3361

Ответ 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

Подробнее см. здесь.