Python:以数字方式查找积分的主值

Ras*_*sen 10 python integration sympy scipy

我正在使用python以数字方式求解积分:

在此输入图像描述

其中a(x)可以取任何值; [-1; 1]中的正,负,内或外,eta是无穷小的正数.有一个第二外积分改变a(x)的值

我试图用Sokhotski-Plemelj定理来解决这个问题: 在此输入图像描述

然而,这涉及确定原则值,我在python中找不到任何方法.我知道它是在Matlab中实现的,但是有没有人知道库或者在python中确定主值的其他方法(如果存在一个原则值)?

pv.*_*pv. 6

您可以使用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))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

详情请见此处.