scipy.integrate.tplquad 给出大体积积分的错误结果

scipy.integrate.tplquad gives wrong result for integral over large volume

我正在尝试对所有 space 的 3 个变量 f(x,y,z) 的函数进行积分。

当我对小体积积分时,我得到大致正确的结果。但是,当我增加积分量时,python说积分为零。

我相当有信心,这里的问题是函数 f 仅在 space 的一个小区域中非零,并且当积分体积为大。我在 link 找到了 1D 中类似问题的答案; 。 1D 中的解决方案是将参数 'points' 传递给 scipy.integrate.quad,这有助于 quad 关注积分非零的区间。

我的问题是; tplquad 是否有与 'points' 类似的论点? 或者我可以通过其他方式指示 tplquad 专注于 space?

的特定区域

方法 tplquad 只是 nquad 的包装器,它不会公开后者的所有选项。使用 nquad,它支持通过 opts 参数将 points 传递给 quad。一个简单的例子,所有范围都有相同的点:

import numpy as np
from scipy.integrate import nquad
f = lambda x, y, z: np.exp(-x**2-y**2-z**2)
nquad(f, [[-150, 90], [-150, 90], [-150, 90]])[0]   # 2.260158041551299e-16, wrong
nquad(f, [[-150, 90], [-150, 90], [-150, 90]], opts={"points": [-5, 5]})[0]   # 5.568327996820292, correct

一般来说,opts可以是多重积分的不同步骤的不同选项列表,points可以不同。它们还可以依赖于其他变量,例如积分极限;请参阅文档中的示例。