我正在使用 python 数值求解积分:
其中a(x)可以取任何值;正、负、在 [-1;1] 的内部或外部,而 eta 是一个无穷小的正数。有第二个外部积分改变了 a(x) 的值
我正在尝试使用Sokhotski–Plemelj 定理来解决这个问题:
然而,这涉及确定原则值,我在 python 中找不到任何方法。我知道它是在 Matlab 中实现的,但是有没有人知道在 python 中确定主值的库或其他方式(如果存在主值)?
我正在使用 python 数值求解积分:
其中a(x)可以取任何值;正、负、在 [-1;1] 的内部或外部,而 eta 是一个无穷小的正数。有第二个外部积分改变了 a(x) 的值
我正在尝试使用Sokhotski–Plemelj 定理来解决这个问题:
然而,这涉及确定原则值,我在 python 中找不到任何方法。我知道它是在 Matlab 中实现的,但是有没有人知道在 python 中确定主值的库或其他方式(如果存在主值)?
您可以使用 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
有关详细信息,请参见此处。