Python:以数字形式求积分的主值

Python:以数字形式求积分的主值,python,scipy,integration,sympy,Python,Scipy,Integration,Sympy,我用python数值求解积分: 其中a(x)可以取任何值;正数,负数,在[-1;1]的内部或外部,eta是一个无穷小的正数。第二个外积分改变了a(x)的值 我正在尝试使用以下方法解决此问题: 然而,这涉及到确定原则值,我在python中找不到任何方法来确定原则值。我知道它是在Matlab中实现的,但有人知道python中确定主值的库或其他方法吗(若存在主值)?您可以使用Symphy直接计算积分。其eta->0的实部是主值: from sympy import * x, y, eta = sy

我用python数值求解积分:

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

我正在尝试使用以下方法解决此问题:


然而,这涉及到确定原则值,我在python中找不到任何方法来确定原则值。我知道它是在Matlab中实现的,但有人知道python中确定主值的库或其他方法吗(若存在主值)?

您可以使用Symphy直接计算积分。其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

有关详细信息,请参见。

如何在MATLAB中实现它?在MATLAB中,符号积分“int”可以处理主值:否则,数值积分“integral”也可以处理端点处的奇异性。所以你可以把积分一分为二,加上奇点,然后加上两个结果: