2024-04-25 17:52:22 发布
网友
我试图用scipy.integrate中的四元函数来积分一个具有奇点的函数,但是我没有得到想要的答案。代码如下:
scipy.integrate
from scipy.integrate import quad import numpy as np def fun(x): return 1./(1-x**2) quad(fun, -2, 2, points=[-1, 1])
这将导致关于0.4的集成警告和返回值。在
0.4
函数的极点是[-1,1]。答案应该是1.09左右(用笔和纸计算)。在
选项weight='cauchy'可用于有效地计算此类发散积分的主值。这意味着提供给quad的函数将隐式地乘以1/(x-wvar),因此相应地调整该函数(乘以x-wvar,其中wvar是奇点)。在
weight='cauchy'
quad
1/(x-wvar)
x-wvar
i1 = quad(lambda x: -1./(x+1), 0, 2, weight='cauchy', wvar=1)[0] i2 = quad(lambda x: -1./(x-1), -2, 0, weight='cauchy', wvar=-1)[0] result = i1 + i2
结果是1.0986122886681091。在
1.0986122886681091
通过这样一个简单的函数,您还可以与SymPy进行符号集成:
结果:1.09861228866811。如果没有evalf(),它将是log(3)。在
1.09861228866811
evalf()
log(3)
我也不能让它和原来的函数一起工作。我想到这个来评估scipy的主要价值:
def principal_value(func, a, b, poles, eps=10**(-6)): #edges res = quad(func,a,poles[0]-eps)[0]+quad(func,poles[-1]+eps,b)[0] #inner part for i in range(len(poles)-1): res += quad(func, poles[i]+eps, poles[i+1]-eps)[0] return res
其中func是函数句柄,a和{}是极限,poles是极点列表,eps是接近极点的距离。你可以让每股收益越来越小,以获得更好的结果,但也许sympy会更好地解决这样的问题。在
func
a
poles
eps
有了这个函数和标准eps我得到了1.0986112886023367,这与wolframalpha给出的结果几乎相同。在
1.0986112886023367
选项
weight='cauchy'
可用于有效地计算此类发散积分的主值。这意味着提供给quad
的函数将隐式地乘以1/(x-wvar)
,因此相应地调整该函数(乘以x-wvar
,其中wvar是奇点)。在结果是
1.0986122886681091
。在通过这样一个简单的函数,您还可以与SymPy进行符号集成:
^{pr2}$结果:
1.09861228866811
。如果没有evalf()
,它将是log(3)
。在我也不能让它和原来的函数一起工作。我想到这个来评估scipy的主要价值:
其中}是极限,
func
是函数句柄,a
和{poles
是极点列表,eps
是接近极点的距离。你可以让每股收益越来越小,以获得更好的结果,但也许sympy会更好地解决这样的问题。在有了这个函数和标准
eps
我得到了1.0986112886023367
,这与wolframalpha给出的结果几乎相同。在相关问题 更多 >
编程相关推荐