我需要计算一个数值(三重)积分,但是不需要很高的数值精度,因此当使用nquad时,我想牺牲一些精度来提高速度。我认为我可以通过增加epsrel和/或epsabs选项来做到这一点,但它们似乎没有任何效果。例如(注意,这只是一个例integrand -我实际上不需要计算这个特殊的积分.):
import numpy as np
from scipy.integrate import nquad
def integrand(l, b, d, sigma=250):
x = d * np.cos(l) * np.cos(b)
y = d * np.sin(l) * np.cos(b)
z = d * np.sin(b)
return np.exp(-0.5 * z**2 / sigma**2) / np.sqrt(2*np.pi * sigma**2)
ranges = [
(0, 2*np.pi),
(0.5, np.pi/2),
(0, 1000.)
]
# No specification of `opts` - use the default epsrel and epsabs:
result1 = nquad(integrand, ranges=ranges, full_output=True)
# Set some `quad` opts:
result2 = nquad(integrand, ranges=ranges, full_output=True,
opts=dict(epsabs=1e-1, epsrel=0, limit=3))这两项产出是相同的:
>>> print(result1)
(4.252394424844468, 1.525272379143154e-12, {'neval': 9261})
>>> print(result2)
(4.252394424844468, 1.525272379143154e-12, {'neval': 9261})这里包含了一个完整的示例:https://gist.github.com/adrn/b9aa92c236df011dbcdc131aa94ed9f9
这不是正确的方法吗,还是scipy.integrate忽略了我输入的opts?
发布于 2022-02-21 15:34:42
从scipy.integrate.nquad中可以看出,opts只能传递给quad,如下所示:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.nquad.html
应用实例:
import numpy as np
from scipy.integrate import quad
def integrand(a, sigma=250):
x = 2 * np.sin(a) * np.cos(a)
return x
# No specification of `opts` - use the default epsrel and epsabs:
result1 = quad(integrand,0, 2*np.pi)
# Set some `quad` opts:
result2 = quad(integrand,0, 4*np.pi,epsabs=1e-6, epsrel=1e-6, limit=40)返回:
result1: (-1.3690011097614755e-16, 4.4205541621600365e-14)
result2: (-1.7062635631484713e-15, 9.096805257467047e-14)nquad之所以不抱怨选项的存在,是因为nquad包含了quad、dbquad和tplquad。
https://stackoverflow.com/questions/71113208
复制相似问题