Python:以数值方式求积分的主值

问题描述 投票:0回答:1

我正在使用 python 数值求解积分:

enter image description here

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

的值

我正在尝试使用 Sokhotski–Plemelj 定理来解决这个问题: enter image description here

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

python scipy sympy numerical-integration
1个回答
9
投票

您可以使用 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

详情请参阅此处

© www.soinside.com 2019 - 2024. All rights reserved.