我试图在所有空间上集成一个由3个变量f(x,y,z)组成的函数。
当我在一个小体积上积分时,我得到了大致正确的结果。然而,当我增加积分量时,python说积分为零。
我很有信心,这里的问题是,函数f只在一个小的空间区域中是非零的,并且当积分体积很大时,tplqad在这个区域上采样不够。我在1D的这个链接上找到了类似问题的答案;scipy.integrate.quad在大范围内给出错误的结果。1D中的解决方案是将一个参数"指向"scipy.integrate.kquad,这有助于quad关注积分为非零的区间。
我的问题是;tplquad是否有类似于"points"的论点?或者我可以用其他方式指示tplqad专注于某个特定的空间区域
方法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
在它们之间可能不同。它们也可以依赖于其他变量,比如积分的极限;请参阅文档中的示例。