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
可以不同。它们还可以依赖于其他变量,例如积分极限;请参阅文档中的示例。
我正在尝试对所有 space 的 3 个变量 f(x,y,z) 的函数进行积分。
当我对小体积积分时,我得到大致正确的结果。但是,当我增加积分量时,python说积分为零。
我相当有信心,这里的问题是函数 f 仅在 space 的一个小区域中非零,并且当积分体积为大。我在 link 找到了 1D 中类似问题的答案;
我的问题是; 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
可以不同。它们还可以依赖于其他变量,例如积分极限;请参阅文档中的示例。