Python: найти основное значение интеграла численно



Я решаю Интеграл численно, используя python:



Введите описание изображения здесь



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



Я пытаюсь решить это с помощью теоремы Сохоцкого–Племеля :
Введите описание изображения здесь



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

771   1  

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

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

Comments

    Ничего не найдено.